diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,7 @@
+##### Clafer Version 0.4.5 released on March 13, 2017
+
+* [Release](https://github.com/gsdlab/clafer/pull/91)
+
 ##### Clafer Version 0.4.4 released on Jun 23, 2016
 
 * [Release](https://github.com/gsdlab/clafer/pull/88)
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,3 +1,5 @@
+Copyright 2012-2017 Generative Software Development Lab <http://gsd.uwaterloo.ca>
+
 Permission is hereby granted, free of charge, to any person obtaining a copy of
 this software and associated documentation files (the "Software"), to deal in
 the Software without restriction, including without limitation the rights to
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -1,86 +1,86 @@
-SRC_DIR  := src
-TEST_DIR := test
-ifeq ($(OS),Windows_NT)
-EXE := .exe
-endif
-
-all: build
-
-build: alloy4.2.jar
-	stack build
-
-install:
-	mkdir -p $(to)
-	cp -f README.md $(to)/clafer-README.md
-	cp -f LICENSE $(to)/
-	cp -f CHANGES.md $(to)/clafer-CHANGES.md
-	cp -f alloy4.2.jar $(to)
-	cp -f ecore2clafer.jar $(to)
-	cp `stack path --local-install-root`/bin/clafer$(EXE) $(to)
-
-# regenerate grammar, call after clafer.cf changed
-grammar:
-	$(MAKE) -C $(SRC_DIR) grammar
-
-# Just like "init" but with enabled profiler
-# this will reinstall everything with profiling support, build clafer, and copy it to .
-prof: alloy4.2.jar
-	stack build --executable-profiling --library-profiling --ghc-options="-prof -fprof-auto -auto-all -caf-all -rtsopts -osuf p_o"
-
-.PHONY: test
-test:
-	cp `stack path --local-install-root`/bin/clafer$(EXE) .
-	stack test 2>/dev/null || :    # supress error message and exit code if fail
-	$(MAKE) -C $(TEST_DIR) test
-
-generateAlloyJSHTMLDot:
-	$(MAKE) -C $(TEST_DIR) generateAlloyJSHTMLDot
-
-diffRegressions:
-	$(MAKE) -C $(TEST_DIR) diffRegressions
-
-reg:
-	$(MAKE) -C $(TEST_DIR) reg
-
-.PHONY: clean
-clean:
-	$(MAKE) -C $(SRC_DIR) clean
-	$(MAKE) cleanTools
-	$(MAKE) cleanTest
-	stack clean
-
-.PHONY: cleanTest
-cleanTest:
-	$(MAKE) -C $(TEST_DIR) clean
-
-.PHONY: cleanTools
-cleanTools:
-	find . -type f -name '*.class' -print0 | xargs -0 rm -f
-
-.PHONY: tags
-tags:
-	hasktags --ctags --extendedctag --ignore-close-implementation .
-
-.PHONY: codex
-codex:
-	codex update
-	mv codex.tags tags
-
-WGET_COMMAND := wget
-ifeq ($(OS),Windows_NT)
-	ifeq ($(shell which wget), which: wget: unkown command)
-		pacman -S make wget
-	endif
-else
-	UNAME_S := $(shell uname -s)
-	ifeq ($(UNAME_S),Darwin)
-		WGET_COMMAND := curl -O
-	endif
-endif
-
-alloy4.2.jar:
-	@if test ! -f "alloy4.2.jar"; then \
-		echo "[WARNING] Missing alloy4.2.jar. Downloading...";  \
-		$(WGET_COMMAND) http://alloy.mit.edu/alloy/downloads/alloy4.2_2015-02-22.jar; \
-		mv alloy4.2_2015-02-22.jar alloy4.2.jar; \
-	fi
+SRC_DIR  := src
+TEST_DIR := test
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+endif
+
+all: build
+
+build: alloy4.2.jar
+	stack build
+
+install:
+	mkdir -p $(to)
+	cp -f README.md $(to)/clafer-README.md
+	cp -f LICENSE $(to)/
+	cp -f CHANGES.md $(to)/clafer-CHANGES.md
+	cp -f alloy4.2.jar $(to)
+	cp -f ecore2clafer.jar $(to)
+	cp `stack path --local-install-root`/bin/clafer$(EXE) $(to)
+
+# regenerate grammar, call after clafer.cf changed
+grammar:
+	$(MAKE) -C $(SRC_DIR) grammar
+
+# Just like "init" but with enabled profiler
+# this will reinstall everything with profiling support, build clafer, and copy it to .
+prof: alloy4.2.jar
+	stack build --executable-profiling --library-profiling --ghc-options="-prof -fprof-auto -auto-all -caf-all -rtsopts -osuf p_o"
+
+.PHONY: test
+test:
+	cp `stack path --local-install-root`/bin/clafer$(EXE) .
+	stack test 2>/dev/null || :    # supress error message and exit code if fail
+	$(MAKE) -C $(TEST_DIR) test
+
+generateAlloyJSHTMLDot:
+	$(MAKE) -C $(TEST_DIR) generateAlloyJSHTMLDot
+
+diffRegressions:
+	$(MAKE) -C $(TEST_DIR) diffRegressions
+
+reg:
+	$(MAKE) -C $(TEST_DIR) reg
+
+.PHONY: clean
+clean:
+	$(MAKE) -C $(SRC_DIR) clean
+	$(MAKE) cleanTools
+	$(MAKE) cleanTest
+	stack clean
+
+.PHONY: cleanTest
+cleanTest:
+	$(MAKE) -C $(TEST_DIR) clean
+
+.PHONY: cleanTools
+cleanTools:
+	find . -type f -name '*.class' -print0 | xargs -0 rm -f
+
+.PHONY: tags
+tags:
+	hasktags --ctags --extendedctag --ignore-close-implementation .
+
+.PHONY: codex
+codex:
+	codex update
+	mv codex.tags tags
+
+WGET_COMMAND := wget
+ifeq ($(OS),Windows_NT)
+	ifeq ($(shell which wget), which: wget: unkown command)
+		pacman -S make wget
+	endif
+else
+	UNAME_S := $(shell uname -s)
+	ifeq ($(UNAME_S),Darwin)
+		WGET_COMMAND := curl -O
+	endif
+endif
+
+alloy4.2.jar:
+	@if test ! -f "alloy4.2.jar"; then \
+		echo "[WARNING] Missing alloy4.2.jar. Downloading...";  \
+		$(WGET_COMMAND) http://alloy.mit.edu/alloy/downloads/alloy4.2_2015-02-22.jar; \
+		mv alloy4.2_2015-02-22.jar alloy4.2.jar; \
+	fi
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,359 +1,359 @@
-[![Hackage](https://img.shields.io/hackage/v/clafer.svg)](https://hackage.haskell.org/package/clafer)
-[![Build Status](https://secure.travis-ci.org/gsdlab/clafer.svg)](http://travis-ci.org/gsdlab/clafer)
-
-# Clafer, the language
-
-##### v0.4.4
-
-
-[Clafer](http://clafer.org) is a general-purpose lightweight structural modeling language developed by
-[GSD Lab](http://gsd.uwaterloo.ca/), [University of Waterloo](http://uwaterloo.ca), and
-[MODELS](http://www.itu.dk/research/models/) group at [IT University of Copenhagen](http://www.itu.dk/).
-Clafer can be used for modeling of static hierarchical structures but has no support for modeling the change of the structures over time (behavior).
-The main goal of Clafer is to make modeling more accessible to a wider range of users and domains.
-
-There are many possible applications of Clafer; however, three are prominent:
-
-1. *Product-Line Architecture Modeling* - aims at representing and managing commonality and variability of assets in product lines and creating and verifying product configurations.
-Clafer naturally supports multi-staged configuration.
-
-2. *Multi-Objective Product Optimization* - aims at finding a set of products in a given product line that are optimal with respect to a set of objectives.
-Clafer multi-objective optimizer generates a Pareto front of optimal product configurations.
-
-3. *Domain Modeling* - aims at improving the understanding of the problem domain in the early stages of software development and determining the requirements with fewer defects.
-This is also known as *Concept Modeling* or *Ontology Modeling*.
-
-May applications actually combine the three. For example, see [Technical Report: Case Studies on E/E Architectures for Power Window and Central Door Locks Systems](http://www.clafer.org/2016/06/technical-report-case-studies-on-ee.html).
-
-### Resources
-
-* [Learning Clafer](http://t3-necsis.cs.uwaterloo.ca:8091/#learning-clafer)
-* [Cheat Sheet](doc/CheatSheet.md)
-* [Syntax Documentation](doc/clafer.pdf)
-* [Grammar](src/clafer.cf)
-
-# Clafer, the compiler
-
-Clafer compiler provides a reference implementation of Clafer, the language.
-It translates models in Clafer to other formats (e.g., Alloy, JSON, JS, HTML, DOT) to allow for reasoning and processing with existing tools (Alloy Analyzer, Choco3, and GraphViz).
-
-Currently, the compiler is used by
-
-* Backends
-  * Alloy-based Instance Generator ([ClaferIG](https://github.com/gsdlab/claferIG)),
-  * Choco3-based Instance Generator and Multi-Objective Optimizer ([chocosolver](https://github.com/gsdlab/chocosolver).
-* Web Frontends
-  * Clafer Integrated Development Environment ([ClaferIDE](https://github.com/gsdlab/claferIDE)),
-  * Clafer Configurator ([ClaferConfigurator](https://github.com/gsdlab/ClaferConfigurator)),
-  * Multi-Objective [Visualizer and Explorer](https://github.com/gsdlab/ClaferMooVisualizer), and
-  * Clafer Wiki ([ClaferWiki](https://github.com/gsdlab/claferwiki)).
-
-## Contributors
-
-* [Michał Antkiewicz](http://gsd.uwaterloo.ca/mantkiew), Main developer.
-* [Kacper Bak](http://gsd.uwaterloo.ca/kbak), Original developer.
-* [Jimmy Liang](http://gsd.uwaterloo.ca/jliang), Developer.
-* Luke Michael Brown, co-op student May-Aug 2013. Many improvements.
-* Paulius Juodisius, [customized BNFC generator](https://github.com/juodaspaulius/bnfc) and layout resolver.
-* [Rafael Olaechea](http://gsd.uwaterloo.ca/rolaechea), Multi-Objective Optimization extensions.
-
-## Getting the Clafer compiler
-
-Clafer can be installed from a binary distribution (preferred), from Hackage, and from the source code.
-
-### Dependencies for running
-
-Regardless of the installation method, the following are
-
-Optional:
-
-* [Java Platform (JDK)](http://www.oracle.com/technetwork/java/javase/downloads/index.html) v8+, 64bit
-  * only needed for running Alloy validation
-  * 32bit on Windows
-* [Alloy4.2](http://alloy.mit.edu/alloy/download.html)
-  * only needed for Alloy output validation
-* [GraphViz](http://graphviz.org/)
-  * the program `dot` is needed only in the `html` mode for SVG graph generation
-
-### Installation from binaries
-
-Binary distributions of the release 0.4.4 of Clafer Tools for Windows, Mac, and Linux,
-can be downloaded from
-[Clafer Tools - Binary Distributions](http://gsd.uwaterloo.ca/clafer-tools-binary-distributions).
-
-1. Download the binaries and unpack `<target directory>` of your choice.
-2. Add the `<target directory>` to your system path so that the executables can be found.
-
-### Installation from Hackage
-
-Clafer is available on [Hackage](http://hackage.haskell.org/package/clafer-0.4.4/) and it can be installed using either [`stack`](https://github.com/commercialhaskell/stack) or [`cabal-install`](https://hackage.haskell.org/package/cabal-install).
-
-#### Installation using `stack`
-
-Stack is the only requirement: no other Haskell tooling needs to be installed because stack will automatically install everything that's needed.
-
-1. [Install `stack`](https://github.com/commercialhaskell/stack#how-to-install)
-   * (first time only) Execute `stack setup`.
-2. Execute `stack install clafer`.
-
-#### Installation using `cabal-install`
-
-Dependencies
-
-* [GHC](https://www.haskell.org/downloads) >= 7.10.3 or 8.0.1 are recommended,
-* `cabal-install` >= 1.22, should be installed together with a GHC distribution,
-* [alex](https://hackage.haskell.org/package/alex),
-* [happy](https://hackage.haskell.org/package/happy).
-
-1. Install GHC
-2. `cabal update`
-3. `cabal install alex happy`
-4. `cabal install clafer`
-5. on Windows `cd C:\Users\<user>\AppData\Roaming\cabal\x86_64-windows-ghc-8.0.1\clafer-0.4.4`
-6. on Linux `ca ~/.cabal/share/x86_64-linux-ghc-8.0.1/clafer-0.4.4/`
-7. to automatically download Alloy jars, execute
-  * `make alloy4.2.jar`,
-  * move `alloy4.2.jar` to the location of the clafer executable.
-
-### Installation from the source code
-
-Dependencies
-
-* [`stack`](https://github.com/commercialhaskell/stack#how-to-install)
-* [Git](http://git-scm.com/)
-
-On Windows
-
-* [MSYS2](http://msys2.sourceforge.net/)
-  * it is installed automatically by `stack setup`
-  * update MSYS2 following the [update procedure](http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/):
-    * `stack exec pacman -- -Sy`
-    * `stack exec pacman -- --needed -S bash pacman pacman-mirrors msys2-runtime`
-    * restart shell if the runtime was updated
-    * `stack exec pacman -- -Su`
-  * `stack exec pacman -- -S make wget unzip diffutils`
-
-#### Important: branches must correspond
-
-All related projects are following the *simultaneous release model*.
-The branch `master` contains releases, whereas the branch `develop` contains code under development.
-When building the tools, the branches should match.
-Releases from branches 'master` are guaranteed to work well together.
-Development versions from branches `develop` should work well together but this might not always be the case.
-
-#### Building
-
-1. in some `<source directory>` of your choice, execute
-  * `git clone git://github.com/gsdlab/clafer.git`
-2. in `<source directory>/clafer`, execute `stack setup`. This will install all dependencies, build tools, and MSYS2 (on Windows).
-3. `cd <source directory>`
-  * `make` on Linux/Mac
-  * `stack exec make` on Windows
-
-### Installation
-
-1. Execute
-  * `make install to=<target directory>` on Linux/Mac
-  * `stack exec make install to=<target directory>` on Windows
-
-#### Note:
-> On Windows, use `/` with the `make` command instead of `\`, e.g., `make install to=/c/clafer-tools-0.4.4/`
-
-## Integration with Sublime Text 2/3
-
-See [ClaferToolsST](https://github.com/gsdlab/ClaferToolsST)
-
-## Integration with VIM
-
-See [clafer-vim](https://github.com/wasowski/clafer-vim)
-
-## Usage
-
-### Clafer Compiler
-
-(As printed by `clafer --help`)
-
-```
-Clafer 0.4.4
-
-clafer [OPTIONS] [FILE]
-
-Common flags:
-  -m --mode=CLAFERMODE                    Generated output type. Available
-                                          CLAFERMODEs are: 'alloy' (default,
-                                          Alloy 4.2); 'json' (intermediate
-                                          representation of Clafer model);
-                                          'clafer' (analyzed and desugared
-                                          clafer model); 'html' (original model
-                                          in HTML); 'graph' (graphical
-                                          representation written in DOT
-                                          language); 'cvlgraph' (cvl notation
-                                          representation written in DOT
-                                          language); 'choco' (Choco constraint
-                                          programming solver). Multiple modes
-                                          can be specified at the same time,
-                                          e.g., '-m alloy -m html'.
-  -o --console-output                     Output code on console.
-  -i --flatten-inheritance                Flatten inheritance ('alloy' mode
-                                          only).
-     --timeout-analysis=INT               Timeout for analysis.
-  -l --no-layout                          Don't resolve off-side rule layout.
-  -n --nl --new-layout                    Use new fast layout resolver
-                                          (experimental).
-  -c --check-duplicates                   Check duplicated clafer names in
-                                          the entire model.
-  -f --skip-resolver                      Skip name resolution.
-  -k --keep-unused                        Keep uninstantated abstract clafers
-                                          ('alloy' mode only).
-  -s --no-stats                           Don't print statistics.
-  -v --validate                           Validate outputs of all modes. Uses
-                                          '<tooldir>/alloy4.2.jar' for Alloy
-                                          models, '<tooldir>/chocosolver.jar'
-                                          for Alloy models, and Clafer
-                                          translator for desugared Clafer
-                                          models. Use '--tooldir' to override
-                                          the default location ('.') of these
-                                          tools.
-     --tooldir=DIR                        Specify the tools directory
-                                          ('validate' only). Default: '.'
-                                          (current directory).
-  -a --alloy-mapping                      Generate mapping to Alloy source
-                                          code ('alloy' mode only).
-     --self-contained                     Generate a self-contained html
-                                          document ('html' mode only).
-     --add-graph                          Add a graph to the generated html
-                                          model ('html' mode only). Requires
-                                          the "dot" executable to be on the
-                                          system path.
-     --sr --show-references               Whether the links for references
-                                          should be rendered. ('html' and
-                                          'graph' modes only).
-     --add-comments                       Include comments from the source
-                                          file in the html output ('html' mode
-                                          only).
-  -e --ecore2clafer                       Translate an ECore model into
-                                          Clafer.
-     --ss=SCOPESTRATEGY --scope-strategy  Use scope computation strategy:
-                                          none or simple (default).
-     --check-afm --afm                    Throws an error if the cardinality
-                                          of any of the clafers is above 1.
-     --meta-data                          Generate a 'fully qualified
-                                          name'-'least-partially-qualified
-                                          name'-'unique ID' map ('.cfr-map').
-                                          In Alloy and Choco modes, generate
-                                          the scopes map ('.cfr-scope').
-  -? --help                               Display help message
-  -V --version                            Print version information
-     --numeric-version                    Print just the version number
-```
-
-The dependencies among the command line arguments are described on the [model wiki](http://t3-necsis.cs.uwaterloo.ca:8091/ClaferTools/CommandLineArguments).
-
-Multiple modes can be used at the same time. For example,
-
-`clafer model.cfr -m alloy -m json -m html -m graph --self-contained --show-references --no-stats`
-
-The mode `-m alloy` is only the default mode if no other modes are given. When other modes are given, the mode `-m alloy` must be added explicitly if needed.
-
-Additionally, `[OPTIONS]` can also be specified directly in the model file by inserting the following compiler directive as the first line of the file:
-
-```
-//# [OPTIONS]
-```
-
-for example
-
-```
-//# --keep-unused -m=alloy
-```
-
-Options given at command line override the options given in the file using `//#` which, in turn, override the defaults.
-
-### Using compiler directives
-
-Compiler directives are comments of the form
-
-```
-//# <directive name>
-```
-
-The following directives are markers of locations in the input files for different purposes:
-
-* `//# FRAGMENT` - marks the beginning of the new [module fragment](http://gsd.uwaterloo.ca:8888/question/463/multi-fragment-modules).
-* `//# GRAPH` - marks the insertion point for a graph rendering. The graph is only produced in HTML mode with the argument `--add-graph`.
-* `//# STATS` - marks the insertion point for module statistics. The statistics can be omitted using the argument `--no-stats`.
-* `//# SUMMARY` - shorthand for `//# GRAPH` and `//# STATS`
-
-# Developing Clafer
-
-Here is some information about the development of the Clafer compiler.
-
-## Branching
-
-We are following the simplified version of the [successful Git branching model](http://nvie.com/posts/a-successful-git-branching-model/).
-The branch `master` is for releases and hot fixes only.
-The branch `develop` is for minor development and for integration of features from feature branches.
-For any substantial work, branch off from `develop` and create a pull request back into `develop` after the work is completed.
-We do testing and code review before merging into develop.
-If the `develop` is ahead, merge it into the feature branch and perform integration testing there.
-To make a release, we create a pull request from `develop` into `master`.
-We tag `master` with version numbers after each release merge.
-
-## Building
-
-We have switched to [Haskell Tool Stack](https://github.com/commercialhaskell/stack#the-haskell-tool-stack).
-Install the tool first.
-
-## Testing
-
-We have both automated tests and regression tests.
-
-To run the automated tests (including both unit tests and [doctests](https://github.com/sol/doctest#readme)), execute
-
-```
-stack test
-```
-
-To only run unit tests, execute `stack test test-suite`.
-
-To only run doctests, execute `stack test doctests`.
-
-> Note: it is still possible to run `cabal test` as previously; however, the `Makefile` uses `stack` by default.
-
-For instructions for adding new modules to the doctest suite, see [cabal integration](https://github.com/sol/doctest#cabal-integration).
-
-To run all the automated tests and the regression tests, execute
-
-```
-make test
-```
-
-We do test-driven development in the following way:
-
-1. create a test case Clafer model in either `test/positive` or `test/negative` depending on whether a test case should compile successfully or return an error. For example, see a positive test case [test/positive/redefinition.cfr](https://github.com/gsdlab/clafer/blob/namedDrefs/test/positive/redefinition.cfr).
-2. produce the intended compiler output automatically if possible and manually fix the output. Save the intended output as a regression test case. For example, see [test/regression/redefinition.cfr.reg](https://github.com/gsdlab/clafer/blob/namedDrefs/test/regression/redefinition.als.reg).
-3. implement the feature to reproduce the intended output: compiler the test case and execute
-
-```
-cd test
-make diffRegressions
-```
-
-this will show you how the current output diverges from the intended output.
-
-
-## Modifying the grammar
-
-We are using a [customized version of BNCF](https://github.com/juodaspaulius/bnfc).
-Clone the repository and install a binary of `bnfc` so that it's visible in your `PATH`.
-After changing the grammar, execute
-
-```
-make grammar
-```
-
-
-# Need help?
-
-* Visit [language's website](http://clafer.org).
-* Report issues to [issue tracker](https://github.com/gsdlab/clafer/issues)
+[![Hackage](https://img.shields.io/hackage/v/clafer.svg)](https://hackage.haskell.org/package/clafer)
+[![Build Status](https://secure.travis-ci.org/gsdlab/clafer.svg)](http://travis-ci.org/gsdlab/clafer)
+
+# Clafer, the language
+
+##### v0.4.5
+
+
+[Clafer](http://clafer.org) is a general-purpose lightweight structural modeling language developed by
+[GSD Lab](http://gsd.uwaterloo.ca/), [University of Waterloo](http://uwaterloo.ca), and
+[MODELS](http://www.itu.dk/research/models/) group at [IT University of Copenhagen](http://www.itu.dk/).
+Clafer can be used for modeling of static hierarchical structures but has no support for modeling the change of the structures over time (behavior).
+The main goal of Clafer is to make modeling more accessible to a wider range of users and domains.
+
+There are many possible applications of Clafer; however, three are prominent:
+
+1. *Product-Line Architecture Modeling* - aims at representing and managing commonality and variability of assets in product lines and creating and verifying product configurations.
+Clafer naturally supports multi-staged configuration.
+
+2. *Multi-Objective Product Optimization* - aims at finding a set of products in a given product line that are optimal with respect to a set of objectives.
+Clafer multi-objective optimizer generates a Pareto front of optimal product configurations.
+
+3. *Domain Modeling* - aims at improving the understanding of the problem domain in the early stages of software development and determining the requirements with fewer defects.
+This is also known as *Concept Modeling* or *Ontology Modeling*.
+
+May applications actually combine the three. For example, see [Technical Report: Case Studies on E/E Architectures for Power Window and Central Door Locks Systems](http://www.clafer.org/2016/06/technical-report-case-studies-on-ee.html).
+
+### Resources
+
+* [Learning Clafer](http://t3-necsis.cs.uwaterloo.ca:8091/#learning-clafer)
+* [Cheat Sheet](doc/CheatSheet.md)
+* [Syntax Documentation](doc/clafer.pdf)
+* [Grammar](src/clafer.cf)
+
+# Clafer, the compiler
+
+Clafer compiler provides a reference implementation of Clafer, the language.
+It translates models in Clafer to other formats (e.g., Alloy, JSON, JS, HTML, DOT) to allow for reasoning and processing with existing tools (Alloy Analyzer, Choco3, and GraphViz).
+
+Currently, the compiler is used by
+
+* Backends
+  * Alloy-based Instance Generator ([ClaferIG](https://github.com/gsdlab/claferIG)),
+  * Choco3-based Instance Generator and Multi-Objective Optimizer ([chocosolver](https://github.com/gsdlab/chocosolver).
+* Web Frontends
+  * Clafer Integrated Development Environment ([ClaferIDE](https://github.com/gsdlab/claferIDE)),
+  * Clafer Configurator ([ClaferConfigurator](https://github.com/gsdlab/ClaferConfigurator)),
+  * Multi-Objective [Visualizer and Explorer](https://github.com/gsdlab/ClaferMooVisualizer), and
+  * Clafer Wiki ([ClaferWiki](https://github.com/gsdlab/claferwiki)).
+
+## Contributors
+
+* [Michał Antkiewicz](http://gsd.uwaterloo.ca/mantkiew), Main developer.
+* [Kacper Bak](http://gsd.uwaterloo.ca/kbak), Original developer.
+* [Jimmy Liang](http://gsd.uwaterloo.ca/jliang), Developer.
+* Luke Michael Brown, co-op student May-Aug 2013. Many improvements.
+* Paulius Juodisius, [customized BNFC generator](https://github.com/juodaspaulius/bnfc) and layout resolver.
+* [Rafael Olaechea](http://gsd.uwaterloo.ca/rolaechea), Multi-Objective Optimization extensions.
+
+## Getting the Clafer compiler
+
+Clafer can be installed from a binary distribution (preferred), from Hackage, and from the source code.
+
+### Dependencies for running
+
+Regardless of the installation method, the following are
+
+Optional:
+
+* [Java Platform (JDK)](http://www.oracle.com/technetwork/java/javase/downloads/index.html) v8+, 64bit
+  * only needed for running Alloy validation
+  * 32bit on Windows
+* [Alloy4.2](http://alloy.mit.edu/alloy/download.html)
+  * only needed for Alloy output validation
+* [GraphViz](http://graphviz.org/)
+  * the program `dot` is needed only in the `html` mode for SVG graph generation
+
+### Installation from binaries
+
+Binary distributions of the release 0.4.5 of Clafer Tools for Windows, Mac, and Linux,
+can be downloaded from
+[Clafer Tools - Binary Distributions](http://gsd.uwaterloo.ca/clafer-tools-binary-distributions).
+
+1. Download the binaries and unpack `<target directory>` of your choice.
+2. Add the `<target directory>` to your system path so that the executables can be found.
+
+### Installation from Hackage
+
+Clafer is available on [Hackage](http://hackage.haskell.org/package/clafer-0.4.5/) and it can be installed using either [`stack`](https://github.com/commercialhaskell/stack) or [`cabal-install`](https://hackage.haskell.org/package/cabal-install).
+
+#### Installation using `stack`
+
+Stack is the only requirement: no other Haskell tooling needs to be installed because stack will automatically install everything that's needed.
+
+1. [Install `stack`](https://github.com/commercialhaskell/stack#how-to-install)
+   * (first time only) Execute `stack setup`.
+2. Execute `stack install clafer`.
+
+#### Installation using `cabal-install`
+
+Dependencies
+
+* [GHC](https://www.haskell.org/downloads) >= 7.10.3 or 8.0.1 are recommended,
+* `cabal-install` >= 1.22, should be installed together with a GHC distribution,
+* [alex](https://hackage.haskell.org/package/alex),
+* [happy](https://hackage.haskell.org/package/happy).
+
+1. Install GHC
+2. `cabal update`
+3. `cabal install alex happy`
+4. `cabal install clafer`
+5. on Windows `cd C:\Users\<user>\AppData\Roaming\cabal\x86_64-windows-ghc-8.0.1\clafer-0.4.5`
+6. on Linux `ca ~/.cabal/share/x86_64-linux-ghc-8.0.1/clafer-0.4.5/`
+7. to automatically download Alloy jars, execute
+  * `make alloy4.2.jar`,
+  * move `alloy4.2.jar` to the location of the clafer executable.
+
+### Installation from the source code
+
+Dependencies
+
+* [`stack`](https://github.com/commercialhaskell/stack#how-to-install)
+* [Git](http://git-scm.com/)
+
+On Windows
+
+* [MSYS2](http://msys2.sourceforge.net/)
+  * it is installed automatically by `stack setup`
+  * update MSYS2 following the [update procedure](http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/):
+    * `stack exec pacman -- -Sy`
+    * `stack exec pacman -- --needed -S bash pacman pacman-mirrors msys2-runtime`
+    * restart shell if the runtime was updated
+    * `stack exec pacman -- -Su`
+  * `stack exec pacman -- -S make wget unzip diffutils`
+
+#### Important: branches must correspond
+
+All related projects are following the *simultaneous release model*.
+The branch `master` contains releases, whereas the branch `develop` contains code under development.
+When building the tools, the branches should match.
+Releases from branches 'master` are guaranteed to work well together.
+Development versions from branches `develop` should work well together but this might not always be the case.
+
+#### Building
+
+1. in some `<source directory>` of your choice, execute
+  * `git clone git://github.com/gsdlab/clafer.git`
+2. in `<source directory>/clafer`, execute `stack setup`. This will install all dependencies, build tools, and MSYS2 (on Windows).
+3. `cd <source directory>`
+  * `make` on Linux/Mac
+  * `stack exec make` on Windows
+
+### Installation
+
+1. Execute
+  * `make install to=<target directory>` on Linux/Mac
+  * `stack exec make install to=<target directory>` on Windows
+
+#### Note:
+> On Windows, use `/` with the `make` command instead of `\`, e.g., `make install to=/c/clafer-tools-0.4.5/`
+
+## Integration with Sublime Text 2/3
+
+See [ClaferToolsST](https://github.com/gsdlab/ClaferToolsST)
+
+## Integration with VIM
+
+See [clafer-vim](https://github.com/wasowski/clafer-vim)
+
+## Usage
+
+### Clafer Compiler
+
+(As printed by `clafer --help`)
+
+```
+Clafer 0.4.5
+
+clafer [OPTIONS] [FILE]
+
+Common flags:
+  -m --mode=CLAFERMODE                    Generated output type. Available
+                                          CLAFERMODEs are: 'alloy' (default,
+                                          Alloy 4.2); 'json' (intermediate
+                                          representation of Clafer model);
+                                          'clafer' (analyzed and desugared
+                                          clafer model); 'html' (original model
+                                          in HTML); 'graph' (graphical
+                                          representation written in DOT
+                                          language); 'cvlgraph' (cvl notation
+                                          representation written in DOT
+                                          language); 'choco' (Choco constraint
+                                          programming solver). Multiple modes
+                                          can be specified at the same time,
+                                          e.g., '-m alloy -m html'.
+  -o --console-output                     Output code on console.
+  -i --flatten-inheritance                Flatten inheritance ('alloy' mode
+                                          only).
+     --timeout-analysis=INT               Timeout for analysis.
+  -l --no-layout                          Don't resolve off-side rule layout.
+  -n --nl --new-layout                    Use new fast layout resolver
+                                          (experimental).
+  -c --check-duplicates                   Check duplicated clafer names in
+                                          the entire model.
+  -f --skip-resolver                      Skip name resolution.
+  -k --keep-unused                        Keep uninstantated abstract clafers
+                                          ('alloy' mode only).
+  -s --no-stats                           Don't print statistics.
+  -v --validate                           Validate outputs of all modes. Uses
+                                          '<tooldir>/alloy4.2.jar' for Alloy
+                                          models, '<tooldir>/chocosolver.jar'
+                                          for Alloy models, and Clafer
+                                          translator for desugared Clafer
+                                          models. Use '--tooldir' to override
+                                          the default location ('.') of these
+                                          tools.
+     --tooldir=DIR                        Specify the tools directory
+                                          ('validate' only). Default: '.'
+                                          (current directory).
+  -a --alloy-mapping                      Generate mapping to Alloy source
+                                          code ('alloy' mode only).
+     --self-contained                     Generate a self-contained html
+                                          document ('html' mode only).
+     --add-graph                          Add a graph to the generated html
+                                          model ('html' mode only). Requires
+                                          the "dot" executable to be on the
+                                          system path.
+     --sr --show-references               Whether the links for references
+                                          should be rendered. ('html' and
+                                          'graph' modes only).
+     --add-comments                       Include comments from the source
+                                          file in the html output ('html' mode
+                                          only).
+  -e --ecore2clafer                       Translate an ECore model into
+                                          Clafer.
+     --ss=SCOPESTRATEGY --scope-strategy  Use scope computation strategy:
+                                          none or simple (default).
+     --check-afm --afm                    Throws an error if the cardinality
+                                          of any of the clafers is above 1.
+     --meta-data                          Generate a 'fully qualified
+                                          name'-'least-partially-qualified
+                                          name'-'unique ID' map ('.cfr-map').
+                                          In Alloy and Choco modes, generate
+                                          the scopes map ('.cfr-scope').
+  -? --help                               Display help message
+  -V --version                            Print version information
+     --numeric-version                    Print just the version number
+```
+
+The dependencies among the command line arguments are described on the [model wiki](http://t3-necsis.cs.uwaterloo.ca:8091/ClaferTools/CommandLineArguments).
+
+Multiple modes can be used at the same time. For example,
+
+`clafer model.cfr -m alloy -m json -m html -m graph --self-contained --show-references --no-stats`
+
+The mode `-m alloy` is only the default mode if no other modes are given. When other modes are given, the mode `-m alloy` must be added explicitly if needed.
+
+Additionally, `[OPTIONS]` can also be specified directly in the model file by inserting the following compiler directive as the first line of the file:
+
+```
+//# [OPTIONS]
+```
+
+for example
+
+```
+//# --keep-unused -m=alloy
+```
+
+Options given at command line override the options given in the file using `//#` which, in turn, override the defaults.
+
+### Using compiler directives
+
+Compiler directives are comments of the form
+
+```
+//# <directive name>
+```
+
+The following directives are markers of locations in the input files for different purposes:
+
+* `//# FRAGMENT` - marks the beginning of the new [module fragment](http://gsd.uwaterloo.ca:8888/question/463/multi-fragment-modules).
+* `//# GRAPH` - marks the insertion point for a graph rendering. The graph is only produced in HTML mode with the argument `--add-graph`.
+* `//# STATS` - marks the insertion point for module statistics. The statistics can be omitted using the argument `--no-stats`.
+* `//# SUMMARY` - shorthand for `//# GRAPH` and `//# STATS`
+
+# Developing Clafer
+
+Here is some information about the development of the Clafer compiler.
+
+## Branching
+
+We are following the simplified version of the [successful Git branching model](http://nvie.com/posts/a-successful-git-branching-model/).
+The branch `master` is for releases and hot fixes only.
+The branch `develop` is for minor development and for integration of features from feature branches.
+For any substantial work, branch off from `develop` and create a pull request back into `develop` after the work is completed.
+We do testing and code review before merging into develop.
+If the `develop` is ahead, merge it into the feature branch and perform integration testing there.
+To make a release, we create a pull request from `develop` into `master`.
+We tag `master` with version numbers after each release merge.
+
+## Building
+
+We have switched to [Haskell Tool Stack](https://github.com/commercialhaskell/stack#the-haskell-tool-stack).
+Install the tool first.
+
+## Testing
+
+We have both automated tests and regression tests.
+
+To run the automated tests (including both unit tests and [doctests](https://github.com/sol/doctest#readme)), execute
+
+```
+stack test
+```
+
+To only run unit tests, execute `stack test test-suite`.
+
+To only run doctests, execute `stack test doctests`.
+
+> Note: it is still possible to run `cabal test` as previously; however, the `Makefile` uses `stack` by default.
+
+For instructions for adding new modules to the doctest suite, see [cabal integration](https://github.com/sol/doctest#cabal-integration).
+
+To run all the automated tests and the regression tests, execute
+
+```
+make test
+```
+
+We do test-driven development in the following way:
+
+1. create a test case Clafer model in either `test/positive` or `test/negative` depending on whether a test case should compile successfully or return an error. For example, see a positive test case [test/positive/redefinition.cfr](https://github.com/gsdlab/clafer/blob/namedDrefs/test/positive/redefinition.cfr).
+2. produce the intended compiler output automatically if possible and manually fix the output. Save the intended output as a regression test case. For example, see [test/regression/redefinition.cfr.reg](https://github.com/gsdlab/clafer/blob/namedDrefs/test/regression/redefinition.als.reg).
+3. implement the feature to reproduce the intended output: compiler the test case and execute
+
+```
+cd test
+make diffRegressions
+```
+
+this will show you how the current output diverges from the intended output.
+
+
+## Modifying the grammar
+
+We are using a [customized version of BNCF](https://github.com/juodaspaulius/bnfc).
+Clone the repository and install a binary of `bnfc` so that it's visible in your `PATH`.
+After changing the grammar, execute
+
+```
+make grammar
+```
+
+
+# Need help?
+
+* Visit [language's website](http://clafer.org).
+* Report issues to [issue tracker](https://github.com/gsdlab/clafer/issues)
diff --git a/clafer.cabal b/clafer.cabal
--- a/clafer.cabal
+++ b/clafer.cabal
@@ -1,174 +1,175 @@
-Name:                   clafer
-Version:                0.4.4
-Synopsis:               Compiles Clafer models to other formats: Alloy, JavaScript, JSON, HTML, Dot.
-Description:            Clafer is a general purpose, lightweight, structural modeling language developed at GSD Lab, University of Waterloo, and MODELS group at IT University of Copenhagen. Lightweight modeling aims at improving the understanding of the problem domain in the early stages of software development and determining the requirements with fewer defects. Clafer's goal is to make modeling more accessible to a wider range of users and domains. The tool provides a reference language implementation. It translates models to other formats (e.g. Alloy, JavaScript, JSON) to allow for reasoning with existing tools.
-Homepage:               http://clafer.org
-License:                MIT
-License-file:           LICENSE
-Author:                 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Ed Zulkoski, Luke Michael Brown, Paulius Juodisius, Rafael Olaechea
-Maintainer:             Michal Antkiewicz <mantkiew@gsd.uwaterloo.ca>
-Stability:              Experimental
-Category:               Model
-Build-type:             Simple
-tested-with:            GHC == 7.10.3
-                      , GHC == 8.0.1
-Cabal-version:          >= 1.22
-data-files:             README.md
-                      , CHANGES.md
-                      , logo.pdf
-                      , Makefile
-                      , ecore2clafer.jar
-                      , stack.yaml
-extra-source-files:     src/Language/Clafer/clafer.css
-source-repository head
-    type:               git
-    location:           git://github.com/gsdlab/clafer.git
-Executable clafer
-    build-tools:        ghc >= 7.10.3
-    default-language:   Haskell2010
-    main-is:            clafer.hs
-    hs-source-dirs:     src-cmd
-    if impl(ghc >= 8.0)
-      ghc-options: -Wcompat
-      -- -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
-    else
-      build-depends: fail == 4.9.*, semigroups == 0.18.*
-    build-depends:      base >= 4.7.0.1 && < 5
-                      , containers >= 0.5.5.1
-                      , filepath >= 1.3.0.2
-                      , process >= 1.2.0.0
-
-                      , mtl >= 2.1.3.1
-
-                      , cmdargs >= 0.10.12
-                      , split >= 0.2.2
-
-                      , clafer == 0.4.4
-    other-modules:      Paths_clafer
-
-library
-    build-tools:        ghc >= 7.10.3
-                      , alex >= 3.1.7
-                      , happy >= 1.19.5
-    default-language:   Haskell2010
-    if impl(ghc >= 8.0)
-      ghc-options: -Wcompat
-      -- -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
-    else
-      build-depends: fail == 4.9.*, semigroups == 0.18.*
-    build-depends:      array >= 0.5.0.0
-                      , base >= 4.7.0.1 && < 5
-                      , bytestring >= 0.10.4.0
-                      , containers >= 0.5.5.1
-                      , directory >= 1.2.1.0
-                      , filepath >= 1.3.0.2
-                      , process >= 1.2.0.0
-                      , transformers >= 0.3.0.0
-
-                      , HTTP >= 4000.2.10
-                      , mtl >= 2.1.3.1
-                      , network >= 2.4.2.3
-                      , parsec >= 3.1.5
-                      , text >= 1.1.0.0
-
-                      , aeson >= 0.11.1.2
-                      , cmdargs >= 0.10.12
-                      , data-stringmap >= 1.0.1.1
-                      , executable-path >= 0.0.3
-                      , file-embed >= 0.0.9
-                      , json-builder >= 0.3
-                      , lens >= 4.6.0.1
-                      , lens-aeson >= 1.0.0.5
-                      , network-uri >= 2.5.0.0
-                      , string-conversions >= 0.3.0.3
-                      , split >= 0.2.2
-                      , transformers-compat >= 0.3
-                      , mtl-compat >= 0.2.1
-
-    hs-source-dirs:     src
-    ghc-options:        -Wall -fno-warn-orphans
-    exposed-modules:    Language.Clafer
-                      , Language.ClaferT
-                      , Language.Clafer.ClaferArgs
-                      , Language.Clafer.Comments
-                      , Language.Clafer.Common
-                      , Language.Clafer.Css
-                      , Language.Clafer.JSONMetaData
-                      , Language.Clafer.QNameUID
-                      , Language.Clafer.Front.AbsClafer
-                      , Language.Clafer.Front.ErrM
-                      , Language.Clafer.Front.LayoutResolver
-                      , Language.Clafer.Front.LexClafer
-                      , Language.Clafer.Front.ParClafer
-                      , Language.Clafer.Front.PrintClafer
-                      , Language.Clafer.Generator.Alloy
-                      , Language.Clafer.Generator.Choco
-                      , Language.Clafer.Generator.Concat
-                      , Language.Clafer.Generator.Graph
-                      , Language.Clafer.Generator.Html
-                      , Language.Clafer.Generator.Stats
-                      , Language.Clafer.Intermediate.Desugarer
-                      , Language.Clafer.Intermediate.Intclafer
-                      , Language.Clafer.Intermediate.Resolver
-                      , Language.Clafer.Intermediate.ResolverInheritance
-                      , Language.Clafer.Intermediate.ResolverName
-                      , Language.Clafer.Intermediate.ResolverType
-                      , Language.Clafer.Intermediate.ScopeAnalysis
-                      , Language.Clafer.Intermediate.SimpleScopeAnalyzer
-                      , Language.Clafer.Intermediate.StringAnalyzer
-                      , Language.Clafer.Intermediate.Tracing
-                      , Language.Clafer.Intermediate.Transformer
-                      , Language.Clafer.Intermediate.TypeSystem
-                      , Language.Clafer.Optimizer.Optimizer
-                      , Language.Clafer.SplitJoin
-                      , Paths_clafer
-    other-modules:      GetURL
-
-Test-Suite test-suite
-    build-tools:        ghc >= 7.10.3
-    default-language:   Haskell2010
-    type:               exitcode-stdio-1.0
-    main-is:            test-suite.hs
-    hs-source-dirs:     test
-    if impl(ghc >= 8.0)
-      ghc-options: -Wcompat
-      -- -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
-    else
-      build-depends: fail == 4.9.*, semigroups == 0.18.*
-    build-depends:      base >= 4.7.0.1 && < 5
-                      , containers >= 0.5.5.1
-                      , directory >= 1.2.1.0
-                      , filepath >= 1.3.0.2
-
-                      , HUnit >= 1.2.5.2
-                      , mtl >= 2.1.3.1
-                      , QuickCheck >= 2.6
-
-                      , data-stringmap >= 1.0.1.1
-                      , lens >= 4.6.0.1
-                      , lens-aeson >= 1.0.0.5
-                      , tasty >= 0.10.1.2
-                      , tasty-hunit >= 0.9.2
-                      , tasty-th >= 0.1.3
-                      , transformers-compat >= 0.3
-                      , mtl-compat >= 0.2.1
-                      , clafer == 0.4.4
-
-    ghc-options:        -Wall
-
-    other-modules:      Functions
-                      , Suite.Positive
-                      , Suite.Negative
-                      , Suite.SimpleScopeAnalyser
-                      , Suite.Redefinition
-                      , Suite.TypeSystem
-
-Test-suite doctests
-    build-tools:        ghc >= 7.10.3
-    default-language:   Haskell2010
-    type:               exitcode-stdio-1.0
-    ghc-options:        -threaded -Wall
-    main-is:            doctests.hs
-    hs-source-dirs:     test
-    build-depends:      base
-                      , doctest >= 0.10.1
+Name:                   clafer
+Version:                0.4.5
+Synopsis:               Compiles Clafer models to other formats: Alloy, JavaScript, JSON, HTML, Dot.
+Description:            Clafer is a general purpose, lightweight, structural modeling language developed at GSD Lab, University of Waterloo, and MODELS group at IT University of Copenhagen. Lightweight modeling aims at improving the understanding of the problem domain in the early stages of software development and determining the requirements with fewer defects. Clafer's goal is to make modeling more accessible to a wider range of users and domains. The tool provides a reference language implementation. It translates models to other formats (e.g. Alloy, JavaScript, JSON) to allow for reasoning with existing tools.
+Homepage:               http://clafer.org
+License:                MIT
+License-file:           LICENSE
+Author:                 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Ed Zulkoski, Luke Michael Brown, Paulius Juodisius, Rafael Olaechea
+Maintainer:             Michal Antkiewicz <mantkiew@gsd.uwaterloo.ca>
+Stability:              Experimental
+Category:               Model
+Build-type:             Simple
+tested-with:            GHC == 7.10.3
+                      , GHC == 8.0.1
+                      , GHC == 8.0.2
+Cabal-version:          >= 1.22
+data-files:             README.md
+                      , CHANGES.md
+                      , logo.pdf
+                      , Makefile
+                      , ecore2clafer.jar
+                      , stack.yaml
+extra-source-files:     src/Language/Clafer/clafer.css
+source-repository head
+    type:               git
+    location:           git://github.com/gsdlab/clafer.git
+Executable clafer
+    build-tools:        ghc >= 7.10.3
+    default-language:   Haskell2010
+    main-is:            clafer.hs
+    hs-source-dirs:     src-cmd
+    if impl(ghc >= 8.0)
+      ghc-options: -Wcompat
+      -- -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
+    else
+      build-depends: fail == 4.9.*, semigroups == 0.18.*
+    build-depends:      base >= 4.7.0.1 && < 5
+                      , containers >= 0.5.5.1
+                      , filepath >= 1.3.0.2
+                      , process >= 1.2.0.0
+
+                      , mtl >= 2.1.3.1
+
+                      , cmdargs >= 0.10.12
+                      , split >= 0.2.2
+
+                      , clafer == 0.4.5
+    other-modules:      Paths_clafer
+
+library
+    build-tools:        ghc >= 7.10.3
+                      , alex >= 3.1.7
+                      , happy >= 1.19.5
+    default-language:   Haskell2010
+    if impl(ghc >= 8.0)
+      ghc-options: -Wcompat
+      -- -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
+    else
+      build-depends: fail == 4.9.*, semigroups == 0.18.*
+    build-depends:      array >= 0.5.0.0
+                      , base >= 4.7.0.1 && < 5
+                      , bytestring >= 0.10.4.0
+                      , containers >= 0.5.5.1
+                      , directory >= 1.2.1.0
+                      , filepath >= 1.3.0.2
+                      , process >= 1.2.0.0
+                      , transformers >= 0.3.0.0
+
+                      , HTTP >= 4000.2.10
+                      , mtl >= 2.1.3.1
+                      , network >= 2.4.2.3
+                      , parsec >= 3.1.5
+                      , text >= 1.1.0.0
+
+                      , aeson >= 0.11.1.2
+                      , cmdargs >= 0.10.12
+                      , data-stringmap >= 1.0.1.1
+                      , executable-path >= 0.0.3
+                      , file-embed >= 0.0.9
+                      , json-builder >= 0.3
+                      , lens >= 4.6.0.1
+                      , lens-aeson >= 1.0.0.5
+                      , network-uri >= 2.5.0.0
+                      , string-conversions >= 0.3.0.3
+                      , split >= 0.2.2
+                      , transformers-compat >= 0.3
+                      , mtl-compat >= 0.2.1
+
+    hs-source-dirs:     src
+    ghc-options:        -Wall -fno-warn-orphans
+    exposed-modules:    Language.Clafer
+                      , Language.ClaferT
+                      , Language.Clafer.ClaferArgs
+                      , Language.Clafer.Comments
+                      , Language.Clafer.Common
+                      , Language.Clafer.Css
+                      , Language.Clafer.JSONMetaData
+                      , Language.Clafer.QNameUID
+                      , Language.Clafer.Front.AbsClafer
+                      , Language.Clafer.Front.ErrM
+                      , Language.Clafer.Front.LayoutResolver
+                      , Language.Clafer.Front.LexClafer
+                      , Language.Clafer.Front.ParClafer
+                      , Language.Clafer.Front.PrintClafer
+                      , Language.Clafer.Generator.Alloy
+                      , Language.Clafer.Generator.Choco
+                      , Language.Clafer.Generator.Concat
+                      , Language.Clafer.Generator.Graph
+                      , Language.Clafer.Generator.Html
+                      , Language.Clafer.Generator.Stats
+                      , Language.Clafer.Intermediate.Desugarer
+                      , Language.Clafer.Intermediate.Intclafer
+                      , Language.Clafer.Intermediate.Resolver
+                      , Language.Clafer.Intermediate.ResolverInheritance
+                      , Language.Clafer.Intermediate.ResolverName
+                      , Language.Clafer.Intermediate.ResolverType
+                      , Language.Clafer.Intermediate.ScopeAnalysis
+                      , Language.Clafer.Intermediate.SimpleScopeAnalyzer
+                      , Language.Clafer.Intermediate.StringAnalyzer
+                      , Language.Clafer.Intermediate.Tracing
+                      , Language.Clafer.Intermediate.Transformer
+                      , Language.Clafer.Intermediate.TypeSystem
+                      , Language.Clafer.Optimizer.Optimizer
+                      , Language.Clafer.SplitJoin
+                      , Paths_clafer
+    other-modules:      GetURL
+
+Test-Suite test-suite
+    build-tools:        ghc >= 7.10.3
+    default-language:   Haskell2010
+    type:               exitcode-stdio-1.0
+    main-is:            test-suite.hs
+    hs-source-dirs:     test
+    if impl(ghc >= 8.0)
+      ghc-options: -Wcompat
+      -- -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
+    else
+      build-depends: fail == 4.9.*, semigroups == 0.18.*
+    build-depends:      base >= 4.7.0.1 && < 5
+                      , containers >= 0.5.5.1
+                      , directory >= 1.2.1.0
+                      , filepath >= 1.3.0.2
+
+                      , HUnit >= 1.2.5.2
+                      , mtl >= 2.1.3.1
+                      , QuickCheck >= 2.6
+
+                      , data-stringmap >= 1.0.1.1
+                      , lens >= 4.6.0.1
+                      , lens-aeson >= 1.0.0.5
+                      , tasty >= 0.10.1.2
+                      , tasty-hunit >= 0.9.2
+                      , tasty-th >= 0.1.3
+                      , transformers-compat >= 0.3
+                      , mtl-compat >= 0.2.1
+                      , clafer == 0.4.5
+
+    ghc-options:        -Wall
+
+    other-modules:      Functions
+                      , Suite.Positive
+                      , Suite.Negative
+                      , Suite.SimpleScopeAnalyser
+                      , Suite.Redefinition
+                      , Suite.TypeSystem
+
+Test-suite doctests
+    build-tools:        ghc >= 7.10.3
+    default-language:   Haskell2010
+    type:               exitcode-stdio-1.0
+    ghc-options:        -threaded -Wall
+    main-is:            doctests.hs
+    hs-source-dirs:     test
+    build-depends:      base
+                      , doctest >= 0.10.1
diff --git a/src-cmd/clafer.hs b/src-cmd/clafer.hs
--- a/src-cmd/clafer.hs
+++ b/src-cmd/clafer.hs
@@ -1,5 +1,5 @@
 {-
- Copyright (C) 2012-2015 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer.hs b/src/Language/Clafer.hs
--- a/src/Language/Clafer.hs
+++ b/src/Language/Clafer.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE NamedFieldPuns     #-}
 {-
- Copyright (C) 2012-2015 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/ClaferArgs.hs b/src/Language/Clafer/ClaferArgs.hs
--- a/src/Language/Clafer/ClaferArgs.hs
+++ b/src/Language/Clafer/ClaferArgs.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 {-
- Copyright (C) 2012-2015 Kacper Bak, Jimmy Liang <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Common.hs b/src/Language/Clafer/Common.hs
--- a/src/Language/Clafer/Common.hs
+++ b/src/Language/Clafer/Common.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE DeriveDataTypeable, RankNTypes, KindSignatures, FlexibleContexts #-}
 {-
- Copyright (C) 2012-2015 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Front/ErrM.hs b/src/Language/Clafer/Front/ErrM.hs
--- a/src/Language/Clafer/Front/ErrM.hs
+++ b/src/Language/Clafer/Front/ErrM.hs
@@ -1,40 +1,40 @@
--- BNF Converter: Error Monad
--- Copyright (C) 2004  Author:  Aarne Ranta
-
--- This file comes with NO WARRANTY and may be used FOR ANY PURPOSE.
-module Language.Clafer.Front.ErrM where
-
--- the Error monad: like Maybe type with error msgs
-
-import Control.Monad
-import Control.Applicative
-import Prelude
-
-import Language.Clafer.Front.AbsClafer
-
-data Err a = Ok a | Bad Pos String
-  deriving (Read, Show, Eq, Ord)
-
-instance Monad Err where
-  return      = pure
-  fail        = Bad noPos
-  Ok a  >>= f = f a
-  Bad p s >>= _ = Bad p s
-
-instance Applicative Err where
-  pure = Ok
-  (Bad p s) <*> _ = Bad p s
-  (Ok f) <*> o  = fmap f o
-
-
-instance Functor Err where
-  fmap = liftM
-
-instance MonadPlus Err where
-  mzero = Bad noPos "Err.mzero"
-  mplus (Bad _ _) y = y
-  mplus x       _ = x
-
-instance Alternative Err where
-  empty = mzero
-  (<|>) = mplus
+-- BNF Converter: Error Monad
+-- Copyright (C) 2004  Author:  Aarne Ranta
+
+-- This file comes with NO WARRANTY and may be used FOR ANY PURPOSE.
+module Language.Clafer.Front.ErrM where
+
+-- the Error monad: like Maybe type with error msgs
+
+import Control.Monad
+import Control.Applicative
+import Prelude
+
+import Language.Clafer.Front.AbsClafer
+
+data Err a = Ok a | Bad Pos String
+  deriving (Read, Show, Eq, Ord)
+
+instance Monad Err where
+  return      = pure
+  fail        = Bad noPos
+  Ok a  >>= f = f a
+  Bad p s >>= _ = Bad p s
+
+instance Applicative Err where
+  pure = Ok
+  (Bad p s) <*> _ = Bad p s
+  (Ok f) <*> o  = fmap f o
+
+
+instance Functor Err where
+  fmap = liftM
+
+instance MonadPlus Err where
+  mzero = Bad noPos "Err.mzero"
+  mplus (Bad _ _) y = y
+  mplus x       _ = x
+
+instance Alternative Err where
+  empty = mzero
+  (<|>) = mplus
diff --git a/src/Language/Clafer/Front/LayoutResolver.hs b/src/Language/Clafer/Front/LayoutResolver.hs
--- a/src/Language/Clafer/Front/LayoutResolver.hs
+++ b/src/Language/Clafer/Front/LayoutResolver.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-
- Copyright (C) 2012 Kacper Bak, Christopher Walker <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Christopher Walker <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Front/LexClafer.hs b/src/Language/Clafer/Front/LexClafer.hs
--- a/src/Language/Clafer/Front/LexClafer.hs
+++ b/src/Language/Clafer/Front/LexClafer.hs
@@ -1,420 +1,420 @@
-{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}
-{-# LANGUAGE CPP,MagicHash #-}
-{-# LINE 3 "Language/Clafer/Front/LexClafer.x" #-}
-
-{-# OPTIONS -fno-warn-incomplete-patterns #-}
-{-# OPTIONS_GHC -w #-}
-module Language.Clafer.Front.LexClafer where
-
-
-
-import qualified Data.Bits
-import Data.Word (Word8)
-
-#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_tab_size :: Int
-alex_tab_size = 8
-alex_base :: AlexAddr
-alex_base = AlexA# "\xf8\xff\xff\xff\x4c\x00\x00\x00\xef\x00\x00\x00\x92\x01\x00\x00\x35\x02\x00\x00\xd8\x02\x00\x00\x8d\xff\xff\xff\x98\xff\xff\xff\x99\xff\xff\xff\xa6\xff\xff\xff\x9b\xff\xff\xff\xa3\xff\xff\xff\xa0\xff\xff\xff\xa1\xff\xff\xff\xd8\x03\x00\x00\x92\xff\xff\xff\x98\x03\x00\x00\x98\x04\x00\x00\x93\xff\xff\xff\x58\x04\x00\x00\x58\x05\x00\x00\x18\x05\x00\x00\x9c\x05\x00\x00\x20\x06\x00\x00\xa4\x06\x00\x00\x28\x07\x00\x00\xfe\x07\x00\x00\xfe\x08\x00\x00\x34\x00\x00\x00\x69\x07\x00\x00\x7e\x09\x00\x00\x3e\x09\x00\x00\xbe\x09\x00\x00\x33\x0a\x00\x00\x4d\x00\x00\x00\x61\x00\x00\x00\x79\x00\x00\x00\x7e\x00\x00\x00\xe5\xff\xff\xff\x4f\x00\x00\x00\xd4\xff\xff\xff\xd5\xff\xff\xff\xed\xff\xff\xff\xb3\xff\xff\xff\x00\x00\x00\x00\xbc\xff\xff\xff\xd7\xff\xff\xff\x3d\x00\x00\x00\xf1\xff\xff\xff\x2d\x00\x00\x00\x52\x00\x00\x00\x8c\x00\x00\x00\x1d\x01\x00\x00\x03\x0b\x00\x00\x00\x00\x00\x00\x28\x0b\x00\x00\x79\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x0b\x00\x00\x00\x00\x00\x00\x81\x0c\x00\x00"#
-
-alex_table :: AlexAddr
-alex_table = AlexA# "\x00\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x12\x00\x0f\x00\x06\x00\x07\x00\x09\x00\x0a\x00\x0d\x00\x08\x00\x17\x00\x19\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x0c\x00\x2c\x00\x0b\x00\x1a\x00\x25\x00\x28\x00\x21\x00\x2c\x00\x38\x00\x2c\x00\x32\x00\x2c\x00\x2c\x00\x2c\x00\x31\x00\x26\x00\x2c\x00\x27\x00\x30\x00\x2a\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x29\x00\x2c\x00\x2f\x00\x2e\x00\x29\x00\x2c\x00\x2c\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x2b\x00\x2c\x00\x2c\x00\x21\x00\x2c\x00\x2c\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x2c\x00\x2d\x00\x2c\x00\x01\x00\x2c\x00\x2c\x00\x2c\x00\x2e\x00\x39\x00\x2c\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x00\x00\x2e\x00\x24\x00\x00\x00\x21\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x20\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x36\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x1d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\xff\xff\x00\x00\x00\x00\x00\x00\x37\x00\x00\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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_check :: AlexAddr
-alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x79\x00\x6f\x00\x6f\x00\x63\x00\x6f\x00\x68\x00\x6c\x00\x6c\x00\x7c\x00\x7c\x00\x2b\x00\x3d\x00\x3d\x00\x3e\x00\x61\x00\x3e\x00\x63\x00\x2a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x2f\x00\x25\x00\x26\x00\x2e\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\x7c\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\x22\x00\x2a\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x2a\x00\x3a\x00\x26\x00\x3c\x00\x3d\x00\x2f\x00\x2d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x3e\x00\x2d\x00\xff\xff\x5c\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\x20\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\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\x2e\x00\xc3\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x5d\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x22\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\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\x0a\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#
-
-alex_deflt :: AlexAddr
-alex_deflt = AlexA# "\xff\xff\x1a\x00\x19\x00\x19\x00\x17\x00\x17\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\xff\xff\x17\x00\x19\x00\xff\xff\x19\x00\x1a\x00\x1a\x00\x17\x00\x17\x00\x19\x00\x19\x00\x1a\x00\x21\x00\xff\xff\x21\x00\x38\x00\x38\x00\xff\xff\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x19\x00\xff\xff\x17\x00"#
-
-alex_accept = listArray (0::Int,61) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),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_9),AlexAcc (alex_action_10),AlexAcc (alex_action_10)]
-{-# LINE 45 "Language/Clafer/Front/LexClafer.x" #-}
-
-
-tok :: (Posn -> String -> Token) -> (Posn -> String -> Token)
-tok f p s = f p s
-
-share :: String -> String
-share = id
-
-data Tok =
-   TS !String !Int    -- reserved words and symbols
- | TL !String         -- string literals
- | TI !String         -- integer literals
- | TV !String         -- identifiers
- | TD !String         -- double precision float literals
- | TC !String         -- character literals
- | T_PosInteger !String
- | T_PosDouble !String
- | T_PosReal !String
- | T_PosString !String
- | T_PosIdent !String
- | T_PosLineComment !String
- | T_PosBlockComment !String
- | T_PosAlloy !String
- | T_PosChoco !String
-
- deriving (Eq,Show,Ord)
-
-data Token =
-   PT  Posn Tok
- | Err Posn
-  deriving (Eq,Show,Ord)
-
-tokenPos :: [Token] -> String
-tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l
-tokenPos (Err (Pn _ l _) :_) = "line " ++ show l
-tokenPos _ = "end of file"
-
-tokenPosn :: Token -> Posn
-tokenPosn (PT p _) = p
-tokenPosn (Err p) = p
-
-tokenLineCol :: Token -> (Int, Int)
-tokenLineCol = posLineCol . tokenPosn
-
-posLineCol :: Posn -> (Int, Int)
-posLineCol (Pn _ l c) = (l,c)
-
-mkPosToken :: Token -> ((Int, Int), String)
-mkPosToken t@(PT p _) = (posLineCol p, prToken t)
-
-prToken :: Token -> String
-prToken t = case t of
-  PT _ (TS s _) -> s
-  PT _ (TL s)   -> show s
-  PT _ (TI s)   -> s
-  PT _ (TV s)   -> s
-  PT _ (TD s)   -> s
-  PT _ (TC s)   -> s
-  PT _ (T_PosInteger s) -> s
-  PT _ (T_PosDouble s) -> s
-  PT _ (T_PosReal s) -> s
-  PT _ (T_PosString s) -> s
-  PT _ (T_PosIdent s) -> s
-  PT _ (T_PosLineComment s) -> s
-  PT _ (T_PosBlockComment s) -> s
-  PT _ (T_PosAlloy s) -> s
-  PT _ (T_PosChoco s) -> s
-
-
-data BTree = N | B String Tok BTree BTree deriving (Show)
-
-eitherResIdent :: (String -> Tok) -> String -> Tok
-eitherResIdent tv s = treeFind resWords
-  where
-  treeFind N = tv s
-  treeFind (B a t left right) | s < a  = treeFind left
-                              | s > a  = treeFind right
-                              | s == a = t
-
-resWords :: BTree
-resWords = b ">>" 34 (b "->>" 17 (b "*" 9 (b "&" 5 (b "#" 3 (b "!=" 2 (b "!" 1 N N) N) (b "%" 4 N N)) (b "(" 7 (b "&&" 6 N N) (b ")" 8 N N))) (b "," 13 (b "+" 11 (b "**" 10 N N) (b "++" 12 N N)) (b "--" 15 (b "-" 14 N N) (b "->" 16 N N)))) (b "<:" 26 (b ":=" 22 (b "/" 20 (b ".." 19 (b "." 18 N N) N) (b ":" 21 N N)) (b ";" 24 (b ":>" 23 N N) (b "<" 25 N N))) (b "=" 30 (b "<=" 28 (b "<<" 27 N N) (b "<=>" 29 N N)) (b ">" 32 (b "=>" 31 N N) (b ">=" 33 N N))))) (b "min" 51 (b "disj" 43 (b "`" 39 (b "\\" 37 (b "[" 36 (b "?" 35 N N) N) (b "]" 38 N N)) (b "all" 41 (b "abstract" 40 N N) (b "assert" 42 N N))) (b "in" 47 (b "enum" 45 (b "else" 44 N N) (b "if" 46 N N)) (b "max" 49 (b "lone" 48 N N) (b "maximize" 50 N N)))) (b "some" 60 (b "one" 56 (b "no" 54 (b "mux" 53 (b "minimize" 52 N N) N) (b "not" 55 N N)) (b "or" 58 (b "opt" 57 N N) (b "product" 59 N N))) (b "{" 64 (b "then" 62 (b "sum" 61 N N) (b "xor" 63 N N)) (b "||" 66 (b "|" 65 N N) (b "}" 67 N N)))))
-   where b s n = let bs = id s
-                  in B bs (TS bs n)
-
-unescapeInitTail :: String -> String
-unescapeInitTail = id . unesc . tail . id where
-  unesc s = case s of
-    '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs
-    '\\':'n':cs  -> '\n' : unesc cs
-    '\\':'t':cs  -> '\t' : unesc cs
-    '"':[]    -> []
-    c:cs      -> c : unesc cs
-    _         -> []
-
--------------------------------------------------------------------
--- Alex wrapper code.
--- A modified "posn" wrapper.
--------------------------------------------------------------------
-
-data Posn = Pn !Int !Int !Int
-      deriving (Eq, Show,Ord)
-
-alexStartPos :: Posn
-alexStartPos = Pn 0 1 1
-
-alexMove :: Posn -> Char -> Posn
-alexMove (Pn a l c) '\t' = Pn (a+1)  l     (((c+7) `div` 8)*8+1)
-alexMove (Pn a l c) '\n' = Pn (a+1) (l+1)   1
-alexMove (Pn a l c) _    = Pn (a+1)  l     (c+1)
-
-type Byte = Word8
-
-type AlexInput = (Posn,     -- current position,
-                  Char,     -- previous char
-                  [Byte],   -- pending bytes on the current char
-                  String)   -- current input string
-
-tokens :: String -> [Token]
-tokens str = go (alexStartPos, '\n', [], str)
-    where
-      go :: AlexInput -> [Token]
-      go inp@(pos, _, _, str) =
-               case alexScan inp 0 of
-                AlexEOF                   -> []
-                AlexError (pos, _, _, _)  -> [Err pos]
-                AlexSkip  inp' len        -> go inp'
-                AlexToken inp' len act    -> act pos (take len str) : (go inp')
-
-alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)
-alexGetByte (p, c, (b:bs), s) = Just (b, (p, c, bs, s))
-alexGetByte (p, _, [], s) =
-  case  s of
-    []  -> Nothing
-    (c:s) ->
-             let p'     = alexMove p c
-                 (b:bs) = utf8Encode c
-              in p' `seq` Just (b, (p', c, bs, s))
-
-alexInputPrevChar :: AlexInput -> Char
-alexInputPrevChar (p, c, bs, s) = c
-
--- | Encode a Haskell String to a list of Word8 values, in UTF8 format.
-utf8Encode :: Char -> [Word8]
-utf8Encode = map fromIntegral . go . ord
- where
-  go oc
-   | oc <= 0x7f       = [oc]
-
-   | oc <= 0x7ff      = [ 0xc0 + (oc `Data.Bits.shiftR` 6)
-                        , 0x80 + oc Data.Bits..&. 0x3f
-                        ]
-
-   | oc <= 0xffff     = [ 0xe0 + (oc `Data.Bits.shiftR` 12)
-                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)
-                        , 0x80 + oc Data.Bits..&. 0x3f
-                        ]
-   | otherwise        = [ 0xf0 + (oc `Data.Bits.shiftR` 18)
-                        , 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)
-                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)
-                        , 0x80 + oc Data.Bits..&. 0x3f
-                        ]
-
-alex_action_1 =  tok (\p s -> PT p (eitherResIdent (TV . share) s))
-alex_action_2 =  tok (\p s -> PT p (eitherResIdent (T_PosInteger . share) s))
-alex_action_3 =  tok (\p s -> PT p (eitherResIdent (T_PosDouble . share) s))
-alex_action_4 =  tok (\p s -> PT p (eitherResIdent (T_PosReal . share) s))
-alex_action_5 =  tok (\p s -> PT p (eitherResIdent (T_PosString . share) s))
-alex_action_6 =  tok (\p s -> PT p (eitherResIdent (T_PosIdent . share) s))
-alex_action_7 =  tok (\p s -> PT p (eitherResIdent (T_PosLineComment . share) s))
-alex_action_8 =  tok (\p s -> PT p (eitherResIdent (T_PosBlockComment . share) s))
-alex_action_9 =  tok (\p s -> PT p (eitherResIdent (T_PosAlloy . share) s))
-alex_action_10 =  tok (\p s -> PT p (eitherResIdent (T_PosChoco . share) s))
-alex_action_11 =  tok (\p s -> PT p (eitherResIdent (TV . share) s))
-{-# LINE 1 "templates\GenericTemplate.hs" #-}
-{-# LINE 1 "templates\\GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
-{-# LINE 1 "<command-line>" #-}
-{-# LINE 11 "<command-line>" #-}
-{-# LINE 1 "C:\\Users\\mantkiew\\AppData\\Local\\Programs\\stack\\x86_64-windows\\ghc-7.10.3\\lib/include\\ghcversion.h" #-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{-# LINE 11 "<command-line>" #-}
-{-# LINE 1 "templates\\GenericTemplate.hs" #-}
--- -----------------------------------------------------------------------------
--- ALEX TEMPLATE
---
--- This code is in the PUBLIC DOMAIN; you may copy it freely and use
--- it for any purpose whatsoever.
-
--- -----------------------------------------------------------------------------
--- INTERNALS and main scanner engine
-
-{-# LINE 21 "templates\\GenericTemplate.hs" #-}
-
-
-
-
-
--- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
-#if __GLASGOW_HASKELL__ > 706
-#define GTE(n,m) (tagToEnum# (n >=# m))
-#define EQ(n,m) (tagToEnum# (n ==# m))
-#else
-#define GTE(n,m) (n >=# m)
-#define EQ(n,m) (n ==# m)
-#endif
-{-# LINE 51 "templates\\GenericTemplate.hs" #-}
-
-
-data AlexAddr = AlexA# Addr#
--- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
-#if __GLASGOW_HASKELL__ < 503
-uncheckedShiftL# = shiftL#
-#endif
-
-{-# INLINE alexIndexInt16OffAddr #-}
-alexIndexInt16OffAddr (AlexA# arr) off =
-#ifdef WORDS_BIGENDIAN
-  narrow16Int# i
-  where
-        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
-        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
-        low  = int2Word# (ord# (indexCharOffAddr# arr off'))
-        off' = off *# 2#
-#else
-  indexInt16OffAddr# arr off
-#endif
-
-
-
-
-
-{-# INLINE alexIndexInt32OffAddr #-}
-alexIndexInt32OffAddr (AlexA# arr) off =
-#ifdef WORDS_BIGENDIAN
-  narrow32Int# i
-  where
-   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
-                     (b2 `uncheckedShiftL#` 16#) `or#`
-                     (b1 `uncheckedShiftL#` 8#) `or#` b0)
-   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))
-   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))
-   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
-   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))
-   off' = off *# 4#
-#else
-  indexInt32OffAddr# arr off
-#endif
-
-
-
-
-
-
-#if __GLASGOW_HASKELL__ < 503
-quickIndex arr i = arr ! i
-#else
--- GHC >= 503, unsafeAt is available from Data.Array.Base.
-quickIndex = unsafeAt
-#endif
-
-
-
-
--- -----------------------------------------------------------------------------
--- Main lexing routines
-
-data AlexReturn a
-  = AlexEOF
-  | AlexError  !AlexInput
-  | AlexSkip   !AlexInput !Int
-  | AlexToken  !AlexInput !Int a
-
--- alexScan :: AlexInput -> StartCode -> AlexReturn a
-alexScan input (I# (sc))
-  = alexScanUser undefined input (I# (sc))
-
-alexScanUser user input (I# (sc))
-  = case alex_scan_tkn user input 0# input sc AlexNone of
-        (AlexNone, input') ->
-                case alexGetByte input of
-                        Nothing ->
-
-
-
-                                   AlexEOF
-                        Just _ ->
-
-
-
-                                   AlexError input'
-
-        (AlexLastSkip input'' len, _) ->
-
-
-
-                AlexSkip input'' len
-
-        (AlexLastAcc k input''' len, _) ->
-
-
-
-                AlexToken input''' len k
-
-
--- Push the input through the DFA, remembering the most recent accepting
--- state it encountered.
-
-alex_scan_tkn user orig_input len input s last_acc =
-  input `seq` -- strict in the input
-  let
-        new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))
-  in
-  new_acc `seq`
-  case alexGetByte input of
-     Nothing -> (new_acc, input)
-     Just (c, new_input) ->
-
-
-
-      case fromIntegral c of { (I# (ord_c)) ->
-        let
-                base   = alexIndexInt32OffAddr alex_base s
-                offset = (base +# ord_c)
-                check  = alexIndexInt16OffAddr alex_check offset
-
-                new_s = if GTE(offset,0#) && EQ(check,ord_c)
-                          then alexIndexInt16OffAddr alex_table offset
-                          else alexIndexInt16OffAddr alex_deflt s
-        in
-        case new_s of
-            -1# -> (new_acc, input)
-                -- on an error, we want to keep the input *before* the
-                -- character that failed, not after.
-            _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)
-                                                -- note that the length is increased ONLY if this is the 1st byte in a char encoding)
-                        new_input new_s new_acc
-      }
-  where
-        check_accs (AlexAccNone) = last_acc
-        check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))
-        check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))
-{-# LINE 198 "templates\\GenericTemplate.hs" #-}
-
-data AlexLastAcc a
-  = AlexNone
-  | AlexLastAcc a !AlexInput !Int
-  | AlexLastSkip  !AlexInput !Int
-
-instance Functor AlexLastAcc where
-    fmap _ AlexNone = AlexNone
-    fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z
-    fmap _ (AlexLastSkip x y) = AlexLastSkip x y
-
-data AlexAcc a user
-  = AlexAccNone
-  | AlexAcc a
-  | AlexAccSkip
+{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}
+{-# LANGUAGE CPP,MagicHash #-}
+{-# LINE 3 "Language/Clafer/Front/LexClafer.x" #-}
+
+{-# OPTIONS -fno-warn-incomplete-patterns #-}
+{-# OPTIONS_GHC -w #-}
+module Language.Clafer.Front.LexClafer where
+
+
+
+import qualified Data.Bits
+import Data.Word (Word8)
+
+#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_tab_size :: Int
+alex_tab_size = 8
+alex_base :: AlexAddr
+alex_base = AlexA# "\xf8\xff\xff\xff\x4c\x00\x00\x00\xef\x00\x00\x00\x92\x01\x00\x00\x35\x02\x00\x00\xd8\x02\x00\x00\x8d\xff\xff\xff\x98\xff\xff\xff\x99\xff\xff\xff\xa6\xff\xff\xff\x9b\xff\xff\xff\xa3\xff\xff\xff\xa0\xff\xff\xff\xa1\xff\xff\xff\xd8\x03\x00\x00\x92\xff\xff\xff\x98\x03\x00\x00\x98\x04\x00\x00\x93\xff\xff\xff\x58\x04\x00\x00\x58\x05\x00\x00\x18\x05\x00\x00\x9c\x05\x00\x00\x20\x06\x00\x00\xa4\x06\x00\x00\x28\x07\x00\x00\xfe\x07\x00\x00\xfe\x08\x00\x00\x34\x00\x00\x00\x69\x07\x00\x00\x7e\x09\x00\x00\x3e\x09\x00\x00\xbe\x09\x00\x00\x33\x0a\x00\x00\x4d\x00\x00\x00\x61\x00\x00\x00\x79\x00\x00\x00\x7e\x00\x00\x00\xe5\xff\xff\xff\x4f\x00\x00\x00\xd4\xff\xff\xff\xd5\xff\xff\xff\xed\xff\xff\xff\xb3\xff\xff\xff\x00\x00\x00\x00\xbc\xff\xff\xff\xd7\xff\xff\xff\x3d\x00\x00\x00\xf1\xff\xff\xff\x2d\x00\x00\x00\x52\x00\x00\x00\x8c\x00\x00\x00\x1d\x01\x00\x00\x03\x0b\x00\x00\x00\x00\x00\x00\x28\x0b\x00\x00\x79\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x0b\x00\x00\x00\x00\x00\x00\x81\x0c\x00\x00"#
+
+alex_table :: AlexAddr
+alex_table = AlexA# "\x00\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x12\x00\x0f\x00\x06\x00\x07\x00\x09\x00\x0a\x00\x0d\x00\x08\x00\x17\x00\x19\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x0c\x00\x2c\x00\x0b\x00\x1a\x00\x25\x00\x28\x00\x21\x00\x2c\x00\x38\x00\x2c\x00\x32\x00\x2c\x00\x2c\x00\x2c\x00\x31\x00\x26\x00\x2c\x00\x27\x00\x30\x00\x2a\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x29\x00\x2c\x00\x2f\x00\x2e\x00\x29\x00\x2c\x00\x2c\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x2b\x00\x2c\x00\x2c\x00\x21\x00\x2c\x00\x2c\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x2c\x00\x2d\x00\x2c\x00\x01\x00\x2c\x00\x2c\x00\x2c\x00\x2e\x00\x39\x00\x2c\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x00\x00\x2e\x00\x24\x00\x00\x00\x21\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x20\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x36\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x1d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\xff\xff\x00\x00\x00\x00\x00\x00\x37\x00\x00\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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_check :: AlexAddr
+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x79\x00\x6f\x00\x6f\x00\x63\x00\x6f\x00\x68\x00\x6c\x00\x6c\x00\x7c\x00\x7c\x00\x2b\x00\x3d\x00\x3d\x00\x3e\x00\x61\x00\x3e\x00\x63\x00\x2a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x2f\x00\x25\x00\x26\x00\x2e\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\x7c\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\x22\x00\x2a\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x2a\x00\x3a\x00\x26\x00\x3c\x00\x3d\x00\x2f\x00\x2d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x3e\x00\x2d\x00\xff\xff\x5c\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\x20\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\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\x2e\x00\xc3\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x5d\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x22\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\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\x0a\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#
+
+alex_deflt :: AlexAddr
+alex_deflt = AlexA# "\xff\xff\x1a\x00\x19\x00\x19\x00\x17\x00\x17\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\xff\xff\x17\x00\x19\x00\xff\xff\x19\x00\x1a\x00\x1a\x00\x17\x00\x17\x00\x19\x00\x19\x00\x1a\x00\x21\x00\xff\xff\x21\x00\x38\x00\x38\x00\xff\xff\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x19\x00\xff\xff\x17\x00"#
+
+alex_accept = listArray (0::Int,61) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_1),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_9),AlexAcc (alex_action_10),AlexAcc (alex_action_10)]
+{-# LINE 45 "Language/Clafer/Front/LexClafer.x" #-}
+
+
+tok :: (Posn -> String -> Token) -> (Posn -> String -> Token)
+tok f p s = f p s
+
+share :: String -> String
+share = id
+
+data Tok =
+   TS !String !Int    -- reserved words and symbols
+ | TL !String         -- string literals
+ | TI !String         -- integer literals
+ | TV !String         -- identifiers
+ | TD !String         -- double precision float literals
+ | TC !String         -- character literals
+ | T_PosInteger !String
+ | T_PosDouble !String
+ | T_PosReal !String
+ | T_PosString !String
+ | T_PosIdent !String
+ | T_PosLineComment !String
+ | T_PosBlockComment !String
+ | T_PosAlloy !String
+ | T_PosChoco !String
+
+ deriving (Eq,Show,Ord)
+
+data Token =
+   PT  Posn Tok
+ | Err Posn
+  deriving (Eq,Show,Ord)
+
+tokenPos :: [Token] -> String
+tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l
+tokenPos (Err (Pn _ l _) :_) = "line " ++ show l
+tokenPos _ = "end of file"
+
+tokenPosn :: Token -> Posn
+tokenPosn (PT p _) = p
+tokenPosn (Err p) = p
+
+tokenLineCol :: Token -> (Int, Int)
+tokenLineCol = posLineCol . tokenPosn
+
+posLineCol :: Posn -> (Int, Int)
+posLineCol (Pn _ l c) = (l,c)
+
+mkPosToken :: Token -> ((Int, Int), String)
+mkPosToken t@(PT p _) = (posLineCol p, prToken t)
+
+prToken :: Token -> String
+prToken t = case t of
+  PT _ (TS s _) -> s
+  PT _ (TL s)   -> show s
+  PT _ (TI s)   -> s
+  PT _ (TV s)   -> s
+  PT _ (TD s)   -> s
+  PT _ (TC s)   -> s
+  PT _ (T_PosInteger s) -> s
+  PT _ (T_PosDouble s) -> s
+  PT _ (T_PosReal s) -> s
+  PT _ (T_PosString s) -> s
+  PT _ (T_PosIdent s) -> s
+  PT _ (T_PosLineComment s) -> s
+  PT _ (T_PosBlockComment s) -> s
+  PT _ (T_PosAlloy s) -> s
+  PT _ (T_PosChoco s) -> s
+
+
+data BTree = N | B String Tok BTree BTree deriving (Show)
+
+eitherResIdent :: (String -> Tok) -> String -> Tok
+eitherResIdent tv s = treeFind resWords
+  where
+  treeFind N = tv s
+  treeFind (B a t left right) | s < a  = treeFind left
+                              | s > a  = treeFind right
+                              | s == a = t
+
+resWords :: BTree
+resWords = b ">>" 34 (b "->>" 17 (b "*" 9 (b "&" 5 (b "#" 3 (b "!=" 2 (b "!" 1 N N) N) (b "%" 4 N N)) (b "(" 7 (b "&&" 6 N N) (b ")" 8 N N))) (b "," 13 (b "+" 11 (b "**" 10 N N) (b "++" 12 N N)) (b "--" 15 (b "-" 14 N N) (b "->" 16 N N)))) (b "<:" 26 (b ":=" 22 (b "/" 20 (b ".." 19 (b "." 18 N N) N) (b ":" 21 N N)) (b ";" 24 (b ":>" 23 N N) (b "<" 25 N N))) (b "=" 30 (b "<=" 28 (b "<<" 27 N N) (b "<=>" 29 N N)) (b ">" 32 (b "=>" 31 N N) (b ">=" 33 N N))))) (b "min" 51 (b "disj" 43 (b "`" 39 (b "\\" 37 (b "[" 36 (b "?" 35 N N) N) (b "]" 38 N N)) (b "all" 41 (b "abstract" 40 N N) (b "assert" 42 N N))) (b "in" 47 (b "enum" 45 (b "else" 44 N N) (b "if" 46 N N)) (b "max" 49 (b "lone" 48 N N) (b "maximize" 50 N N)))) (b "some" 60 (b "one" 56 (b "no" 54 (b "mux" 53 (b "minimize" 52 N N) N) (b "not" 55 N N)) (b "or" 58 (b "opt" 57 N N) (b "product" 59 N N))) (b "{" 64 (b "then" 62 (b "sum" 61 N N) (b "xor" 63 N N)) (b "||" 66 (b "|" 65 N N) (b "}" 67 N N)))))
+   where b s n = let bs = id s
+                  in B bs (TS bs n)
+
+unescapeInitTail :: String -> String
+unescapeInitTail = id . unesc . tail . id where
+  unesc s = case s of
+    '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs
+    '\\':'n':cs  -> '\n' : unesc cs
+    '\\':'t':cs  -> '\t' : unesc cs
+    '"':[]    -> []
+    c:cs      -> c : unesc cs
+    _         -> []
+
+-------------------------------------------------------------------
+-- Alex wrapper code.
+-- A modified "posn" wrapper.
+-------------------------------------------------------------------
+
+data Posn = Pn !Int !Int !Int
+      deriving (Eq, Show,Ord)
+
+alexStartPos :: Posn
+alexStartPos = Pn 0 1 1
+
+alexMove :: Posn -> Char -> Posn
+alexMove (Pn a l c) '\t' = Pn (a+1)  l     (((c+7) `div` 8)*8+1)
+alexMove (Pn a l c) '\n' = Pn (a+1) (l+1)   1
+alexMove (Pn a l c) _    = Pn (a+1)  l     (c+1)
+
+type Byte = Word8
+
+type AlexInput = (Posn,     -- current position,
+                  Char,     -- previous char
+                  [Byte],   -- pending bytes on the current char
+                  String)   -- current input string
+
+tokens :: String -> [Token]
+tokens str = go (alexStartPos, '\n', [], str)
+    where
+      go :: AlexInput -> [Token]
+      go inp@(pos, _, _, str) =
+               case alexScan inp 0 of
+                AlexEOF                   -> []
+                AlexError (pos, _, _, _)  -> [Err pos]
+                AlexSkip  inp' len        -> go inp'
+                AlexToken inp' len act    -> act pos (take len str) : (go inp')
+
+alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)
+alexGetByte (p, c, (b:bs), s) = Just (b, (p, c, bs, s))
+alexGetByte (p, _, [], s) =
+  case  s of
+    []  -> Nothing
+    (c:s) ->
+             let p'     = alexMove p c
+                 (b:bs) = utf8Encode c
+              in p' `seq` Just (b, (p', c, bs, s))
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar (p, c, bs, s) = c
+
+-- | Encode a Haskell String to a list of Word8 values, in UTF8 format.
+utf8Encode :: Char -> [Word8]
+utf8Encode = map fromIntegral . go . ord
+ where
+  go oc
+   | oc <= 0x7f       = [oc]
+
+   | oc <= 0x7ff      = [ 0xc0 + (oc `Data.Bits.shiftR` 6)
+                        , 0x80 + oc Data.Bits..&. 0x3f
+                        ]
+
+   | oc <= 0xffff     = [ 0xe0 + (oc `Data.Bits.shiftR` 12)
+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)
+                        , 0x80 + oc Data.Bits..&. 0x3f
+                        ]
+   | otherwise        = [ 0xf0 + (oc `Data.Bits.shiftR` 18)
+                        , 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)
+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)
+                        , 0x80 + oc Data.Bits..&. 0x3f
+                        ]
+
+alex_action_1 =  tok (\p s -> PT p (eitherResIdent (TV . share) s))
+alex_action_2 =  tok (\p s -> PT p (eitherResIdent (T_PosInteger . share) s))
+alex_action_3 =  tok (\p s -> PT p (eitherResIdent (T_PosDouble . share) s))
+alex_action_4 =  tok (\p s -> PT p (eitherResIdent (T_PosReal . share) s))
+alex_action_5 =  tok (\p s -> PT p (eitherResIdent (T_PosString . share) s))
+alex_action_6 =  tok (\p s -> PT p (eitherResIdent (T_PosIdent . share) s))
+alex_action_7 =  tok (\p s -> PT p (eitherResIdent (T_PosLineComment . share) s))
+alex_action_8 =  tok (\p s -> PT p (eitherResIdent (T_PosBlockComment . share) s))
+alex_action_9 =  tok (\p s -> PT p (eitherResIdent (T_PosAlloy . share) s))
+alex_action_10 =  tok (\p s -> PT p (eitherResIdent (T_PosChoco . share) s))
+alex_action_11 =  tok (\p s -> PT p (eitherResIdent (TV . share) s))
+{-# LINE 1 "templates\GenericTemplate.hs" #-}
+{-# LINE 1 "templates\\GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command-line>" #-}
+{-# LINE 11 "<command-line>" #-}
+{-# LINE 1 "C:\\Users\\mantkiew\\AppData\\Local\\Programs\\stack\\x86_64-windows\\ghc-7.10.3\\lib/include\\ghcversion.h" #-}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{-# LINE 11 "<command-line>" #-}
+{-# LINE 1 "templates\\GenericTemplate.hs" #-}
+-- -----------------------------------------------------------------------------
+-- ALEX TEMPLATE
+--
+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use
+-- it for any purpose whatsoever.
+
+-- -----------------------------------------------------------------------------
+-- INTERNALS and main scanner engine
+
+{-# LINE 21 "templates\\GenericTemplate.hs" #-}
+
+
+
+
+
+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
+#if __GLASGOW_HASKELL__ > 706
+#define GTE(n,m) (tagToEnum# (n >=# m))
+#define EQ(n,m) (tagToEnum# (n ==# m))
+#else
+#define GTE(n,m) (n >=# m)
+#define EQ(n,m) (n ==# m)
+#endif
+{-# LINE 51 "templates\\GenericTemplate.hs" #-}
+
+
+data AlexAddr = AlexA# Addr#
+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
+#if __GLASGOW_HASKELL__ < 503
+uncheckedShiftL# = shiftL#
+#endif
+
+{-# INLINE alexIndexInt16OffAddr #-}
+alexIndexInt16OffAddr (AlexA# arr) off =
+#ifdef WORDS_BIGENDIAN
+  narrow16Int# i
+  where
+        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
+        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+        low  = int2Word# (ord# (indexCharOffAddr# arr off'))
+        off' = off *# 2#
+#else
+  indexInt16OffAddr# arr off
+#endif
+
+
+
+
+
+{-# INLINE alexIndexInt32OffAddr #-}
+alexIndexInt32OffAddr (AlexA# arr) off =
+#ifdef WORDS_BIGENDIAN
+  narrow32Int# i
+  where
+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
+                     (b2 `uncheckedShiftL#` 16#) `or#`
+                     (b1 `uncheckedShiftL#` 8#) `or#` b0)
+   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))
+   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))
+   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))
+   off' = off *# 4#
+#else
+  indexInt32OffAddr# arr off
+#endif
+
+
+
+
+
+
+#if __GLASGOW_HASKELL__ < 503
+quickIndex arr i = arr ! i
+#else
+-- GHC >= 503, unsafeAt is available from Data.Array.Base.
+quickIndex = unsafeAt
+#endif
+
+
+
+
+-- -----------------------------------------------------------------------------
+-- Main lexing routines
+
+data AlexReturn a
+  = AlexEOF
+  | AlexError  !AlexInput
+  | AlexSkip   !AlexInput !Int
+  | AlexToken  !AlexInput !Int a
+
+-- alexScan :: AlexInput -> StartCode -> AlexReturn a
+alexScan input (I# (sc))
+  = alexScanUser undefined input (I# (sc))
+
+alexScanUser user input (I# (sc))
+  = case alex_scan_tkn user input 0# input sc AlexNone of
+        (AlexNone, input') ->
+                case alexGetByte input of
+                        Nothing ->
+
+
+
+                                   AlexEOF
+                        Just _ ->
+
+
+
+                                   AlexError input'
+
+        (AlexLastSkip input'' len, _) ->
+
+
+
+                AlexSkip input'' len
+
+        (AlexLastAcc k input''' len, _) ->
+
+
+
+                AlexToken input''' len k
+
+
+-- Push the input through the DFA, remembering the most recent accepting
+-- state it encountered.
+
+alex_scan_tkn user orig_input len input s last_acc =
+  input `seq` -- strict in the input
+  let
+        new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))
+  in
+  new_acc `seq`
+  case alexGetByte input of
+     Nothing -> (new_acc, input)
+     Just (c, new_input) ->
+
+
+
+      case fromIntegral c of { (I# (ord_c)) ->
+        let
+                base   = alexIndexInt32OffAddr alex_base s
+                offset = (base +# ord_c)
+                check  = alexIndexInt16OffAddr alex_check offset
+
+                new_s = if GTE(offset,0#) && EQ(check,ord_c)
+                          then alexIndexInt16OffAddr alex_table offset
+                          else alexIndexInt16OffAddr alex_deflt s
+        in
+        case new_s of
+            -1# -> (new_acc, input)
+                -- on an error, we want to keep the input *before* the
+                -- character that failed, not after.
+            _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)
+                                                -- note that the length is increased ONLY if this is the 1st byte in a char encoding)
+                        new_input new_s new_acc
+      }
+  where
+        check_accs (AlexAccNone) = last_acc
+        check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))
+        check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))
+{-# LINE 198 "templates\\GenericTemplate.hs" #-}
+
+data AlexLastAcc a
+  = AlexNone
+  | AlexLastAcc a !AlexInput !Int
+  | AlexLastSkip  !AlexInput !Int
+
+instance Functor AlexLastAcc where
+    fmap _ AlexNone = AlexNone
+    fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z
+    fmap _ (AlexLastSkip x y) = AlexLastSkip x y
+
+data AlexAcc a user
+  = AlexAccNone
+  | AlexAcc a
+  | AlexAccSkip
diff --git a/src/Language/Clafer/Front/ParClafer.hs b/src/Language/Clafer/Front/ParClafer.hs
--- a/src/Language/Clafer/Front/ParClafer.hs
+++ b/src/Language/Clafer/Front/ParClafer.hs
@@ -1,2188 +1,2188 @@
-{-# OPTIONS_GHC -w #-}
-{-# OPTIONS -fglasgow-exts -cpp #-}
-{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
-module Language.Clafer.Front.ParClafer where
-import Language.Clafer.Front.AbsClafer
-import Language.Clafer.Front.LexClafer
-import Language.Clafer.Front.ErrM
-import qualified Data.Array as Happy_Data_Array
-import qualified GHC.Exts as Happy_GHC_Exts
-import Control.Applicative(Applicative(..))
-import Control.Monad (ap)
-
--- parser produced by Happy Version 1.19.5
-
-newtype HappyAbsSyn  = HappyAbsSyn HappyAny
-#if __GLASGOW_HASKELL__ >= 607
-type HappyAny = Happy_GHC_Exts.Any
-#else
-type HappyAny = forall a . a
-#endif
-happyIn8 :: (PosInteger) -> (HappyAbsSyn )
-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn8 #-}
-happyOut8 :: (HappyAbsSyn ) -> (PosInteger)
-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut8 #-}
-happyIn9 :: (PosDouble) -> (HappyAbsSyn )
-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn9 #-}
-happyOut9 :: (HappyAbsSyn ) -> (PosDouble)
-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut9 #-}
-happyIn10 :: (PosReal) -> (HappyAbsSyn )
-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn10 #-}
-happyOut10 :: (HappyAbsSyn ) -> (PosReal)
-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut10 #-}
-happyIn11 :: (PosString) -> (HappyAbsSyn )
-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn11 #-}
-happyOut11 :: (HappyAbsSyn ) -> (PosString)
-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut11 #-}
-happyIn12 :: (PosIdent) -> (HappyAbsSyn )
-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn12 #-}
-happyOut12 :: (HappyAbsSyn ) -> (PosIdent)
-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut12 #-}
-happyIn13 :: (PosLineComment) -> (HappyAbsSyn )
-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn13 #-}
-happyOut13 :: (HappyAbsSyn ) -> (PosLineComment)
-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut13 #-}
-happyIn14 :: (PosBlockComment) -> (HappyAbsSyn )
-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn14 #-}
-happyOut14 :: (HappyAbsSyn ) -> (PosBlockComment)
-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut14 #-}
-happyIn15 :: (PosAlloy) -> (HappyAbsSyn )
-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn15 #-}
-happyOut15 :: (HappyAbsSyn ) -> (PosAlloy)
-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut15 #-}
-happyIn16 :: (PosChoco) -> (HappyAbsSyn )
-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn16 #-}
-happyOut16 :: (HappyAbsSyn ) -> (PosChoco)
-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut16 #-}
-happyIn17 :: (Module) -> (HappyAbsSyn )
-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn17 #-}
-happyOut17 :: (HappyAbsSyn ) -> (Module)
-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut17 #-}
-happyIn18 :: (Declaration) -> (HappyAbsSyn )
-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn18 #-}
-happyOut18 :: (HappyAbsSyn ) -> (Declaration)
-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut18 #-}
-happyIn19 :: (Clafer) -> (HappyAbsSyn )
-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn19 #-}
-happyOut19 :: (HappyAbsSyn ) -> (Clafer)
-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut19 #-}
-happyIn20 :: (Constraint) -> (HappyAbsSyn )
-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn20 #-}
-happyOut20 :: (HappyAbsSyn ) -> (Constraint)
-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut20 #-}
-happyIn21 :: (Assertion) -> (HappyAbsSyn )
-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn21 #-}
-happyOut21 :: (HappyAbsSyn ) -> (Assertion)
-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut21 #-}
-happyIn22 :: (Goal) -> (HappyAbsSyn )
-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn22 #-}
-happyOut22 :: (HappyAbsSyn ) -> (Goal)
-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut22 #-}
-happyIn23 :: (Abstract) -> (HappyAbsSyn )
-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn23 #-}
-happyOut23 :: (HappyAbsSyn ) -> (Abstract)
-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut23 #-}
-happyIn24 :: (Elements) -> (HappyAbsSyn )
-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn24 #-}
-happyOut24 :: (HappyAbsSyn ) -> (Elements)
-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut24 #-}
-happyIn25 :: (Element) -> (HappyAbsSyn )
-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn25 #-}
-happyOut25 :: (HappyAbsSyn ) -> (Element)
-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut25 #-}
-happyIn26 :: (Super) -> (HappyAbsSyn )
-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn26 #-}
-happyOut26 :: (HappyAbsSyn ) -> (Super)
-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut26 #-}
-happyIn27 :: (Reference) -> (HappyAbsSyn )
-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn27 #-}
-happyOut27 :: (HappyAbsSyn ) -> (Reference)
-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut27 #-}
-happyIn28 :: (Init) -> (HappyAbsSyn )
-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn28 #-}
-happyOut28 :: (HappyAbsSyn ) -> (Init)
-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut28 #-}
-happyIn29 :: (InitHow) -> (HappyAbsSyn )
-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn29 #-}
-happyOut29 :: (HappyAbsSyn ) -> (InitHow)
-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut29 #-}
-happyIn30 :: (GCard) -> (HappyAbsSyn )
-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn30 #-}
-happyOut30 :: (HappyAbsSyn ) -> (GCard)
-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut30 #-}
-happyIn31 :: (Card) -> (HappyAbsSyn )
-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn31 #-}
-happyOut31 :: (HappyAbsSyn ) -> (Card)
-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut31 #-}
-happyIn32 :: (NCard) -> (HappyAbsSyn )
-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn32 #-}
-happyOut32 :: (HappyAbsSyn ) -> (NCard)
-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut32 #-}
-happyIn33 :: (ExInteger) -> (HappyAbsSyn )
-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn33 #-}
-happyOut33 :: (HappyAbsSyn ) -> (ExInteger)
-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut33 #-}
-happyIn34 :: (Name) -> (HappyAbsSyn )
-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn34 #-}
-happyOut34 :: (HappyAbsSyn ) -> (Name)
-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut34 #-}
-happyIn35 :: (Exp) -> (HappyAbsSyn )
-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn35 #-}
-happyOut35 :: (HappyAbsSyn ) -> (Exp)
-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut35 #-}
-happyIn36 :: (Exp) -> (HappyAbsSyn )
-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn36 #-}
-happyOut36 :: (HappyAbsSyn ) -> (Exp)
-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut36 #-}
-happyIn37 :: (Exp) -> (HappyAbsSyn )
-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn37 #-}
-happyOut37 :: (HappyAbsSyn ) -> (Exp)
-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut37 #-}
-happyIn38 :: (Exp) -> (HappyAbsSyn )
-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn38 #-}
-happyOut38 :: (HappyAbsSyn ) -> (Exp)
-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut38 #-}
-happyIn39 :: (Exp) -> (HappyAbsSyn )
-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn39 #-}
-happyOut39 :: (HappyAbsSyn ) -> (Exp)
-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut39 #-}
-happyIn40 :: (Exp) -> (HappyAbsSyn )
-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn40 #-}
-happyOut40 :: (HappyAbsSyn ) -> (Exp)
-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut40 #-}
-happyIn41 :: (Exp) -> (HappyAbsSyn )
-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn41 #-}
-happyOut41 :: (HappyAbsSyn ) -> (Exp)
-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut41 #-}
-happyIn42 :: (Exp) -> (HappyAbsSyn )
-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn42 #-}
-happyOut42 :: (HappyAbsSyn ) -> (Exp)
-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut42 #-}
-happyIn43 :: (Exp) -> (HappyAbsSyn )
-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn43 #-}
-happyOut43 :: (HappyAbsSyn ) -> (Exp)
-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut43 #-}
-happyIn44 :: (Exp) -> (HappyAbsSyn )
-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn44 #-}
-happyOut44 :: (HappyAbsSyn ) -> (Exp)
-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut44 #-}
-happyIn45 :: (Exp) -> (HappyAbsSyn )
-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn45 #-}
-happyOut45 :: (HappyAbsSyn ) -> (Exp)
-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut45 #-}
-happyIn46 :: (Exp) -> (HappyAbsSyn )
-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn46 #-}
-happyOut46 :: (HappyAbsSyn ) -> (Exp)
-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut46 #-}
-happyIn47 :: (Exp) -> (HappyAbsSyn )
-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn47 #-}
-happyOut47 :: (HappyAbsSyn ) -> (Exp)
-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut47 #-}
-happyIn48 :: (Exp) -> (HappyAbsSyn )
-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn48 #-}
-happyOut48 :: (HappyAbsSyn ) -> (Exp)
-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut48 #-}
-happyIn49 :: (Exp) -> (HappyAbsSyn )
-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn49 #-}
-happyOut49 :: (HappyAbsSyn ) -> (Exp)
-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut49 #-}
-happyIn50 :: (Exp) -> (HappyAbsSyn )
-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn50 #-}
-happyOut50 :: (HappyAbsSyn ) -> (Exp)
-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut50 #-}
-happyIn51 :: (Exp) -> (HappyAbsSyn )
-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn51 #-}
-happyOut51 :: (HappyAbsSyn ) -> (Exp)
-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut51 #-}
-happyIn52 :: (Exp) -> (HappyAbsSyn )
-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn52 #-}
-happyOut52 :: (HappyAbsSyn ) -> (Exp)
-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut52 #-}
-happyIn53 :: (Exp) -> (HappyAbsSyn )
-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn53 #-}
-happyOut53 :: (HappyAbsSyn ) -> (Exp)
-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut53 #-}
-happyIn54 :: (Decl) -> (HappyAbsSyn )
-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn54 #-}
-happyOut54 :: (HappyAbsSyn ) -> (Decl)
-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut54 #-}
-happyIn55 :: (Quant) -> (HappyAbsSyn )
-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn55 #-}
-happyOut55 :: (HappyAbsSyn ) -> (Quant)
-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut55 #-}
-happyIn56 :: (EnumId) -> (HappyAbsSyn )
-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn56 #-}
-happyOut56 :: (HappyAbsSyn ) -> (EnumId)
-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut56 #-}
-happyIn57 :: (ModId) -> (HappyAbsSyn )
-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn57 #-}
-happyOut57 :: (HappyAbsSyn ) -> (ModId)
-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut57 #-}
-happyIn58 :: (LocId) -> (HappyAbsSyn )
-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn58 #-}
-happyOut58 :: (HappyAbsSyn ) -> (LocId)
-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut58 #-}
-happyIn59 :: ([Declaration]) -> (HappyAbsSyn )
-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn59 #-}
-happyOut59 :: (HappyAbsSyn ) -> ([Declaration])
-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut59 #-}
-happyIn60 :: ([EnumId]) -> (HappyAbsSyn )
-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn60 #-}
-happyOut60 :: (HappyAbsSyn ) -> ([EnumId])
-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut60 #-}
-happyIn61 :: ([Element]) -> (HappyAbsSyn )
-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn61 #-}
-happyOut61 :: (HappyAbsSyn ) -> ([Element])
-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut61 #-}
-happyIn62 :: ([Exp]) -> (HappyAbsSyn )
-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn62 #-}
-happyOut62 :: (HappyAbsSyn ) -> ([Exp])
-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut62 #-}
-happyIn63 :: ([LocId]) -> (HappyAbsSyn )
-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn63 #-}
-happyOut63 :: (HappyAbsSyn ) -> ([LocId])
-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut63 #-}
-happyIn64 :: ([ModId]) -> (HappyAbsSyn )
-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn64 #-}
-happyOut64 :: (HappyAbsSyn ) -> ([ModId])
-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut64 #-}
-happyIn65 :: (Exp) -> (HappyAbsSyn )
-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn65 #-}
-happyOut65 :: (HappyAbsSyn ) -> (Exp)
-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut65 #-}
-happyInTok :: (Token) -> (HappyAbsSyn )
-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyInTok #-}
-happyOutTok :: (HappyAbsSyn ) -> (Token)
-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOutTok #-}
-
-
-happyActOffsets :: HappyAddr
-happyActOffsets = HappyA# "\x00\x00\x10\x01\x15\x01\x09\x01\x13\x01\xf0\x00\x00\x00\xe2\x00\x95\x00\xe2\x00\x02\x01\xda\x00\x00\x00\xda\x00\xa0\x00\x00\x00\xda\x00\xac\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x00\xe1\x00\x0f\x01\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x00\xb2\x00\x6a\x00\x22\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\x01\xd9\x00\xdf\x00\x14\x01\x00\x00\xc2\x05\x00\x00\x61\x00\x09\x00\x00\x00\x00\x00\xff\x00\x01\x01\xc4\x00\x03\x01\x0b\x00\xfe\x00\x00\x00\x66\x01\xea\x00\x00\x00\x00\x00\xcf\x00\x1d\x00\x42\x01\x1d\x00\x00\x00\xde\xff\x42\x01\x00\x00\x3c\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x00\xfd\xff\xef\x00\xfc\xff\xfb\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\xab\x00\x1d\x00\xe4\x00\xe4\x00\x00\x00\x00\x00\x11\x00\x00\x00\xc2\x00\xdc\x00\xde\x00\xb4\x00\xd6\x00\x04\x00\xd6\x00\xc2\x05\x3c\x00\xad\x00\xfe\xff\x00\x00\xb1\x00\xa9\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x50\x01\x50\x01\x50\x01\x50\x01\x50\x01\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xbd\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x00\xac\x00\xe0\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x9e\x00\xd2\x00\xd2\x00\x0b\x00\xaf\x00\xaf\x00\x00\x00\x96\x00\x42\x01\x00\x00\x00\x00\x75\x00\x1d\x00\x8b\x00\x42\x01\x42\x01\x92\x00\xfc\xff\x1d\x00\x1d\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\xf0\xff\x6c\x00\x9e\x00\x9e\x00\x38\x00\xed\xff\x81\x00\x00\x00\x9e\x00\x42\x01\x81\x00\x42\x01\x00\x00\x81\x00\x81\x00\x42\x01\x56\x00\x42\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x7f\x00\x00\x00"#
-
-happyGotoOffsets :: HappyAddr
-happyGotoOffsets = HappyA# "\xf8\xff\x13\x00\x85\x00\x80\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x7c\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x7a\x00\x00\x00\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x03\x53\x00\x51\x00\x45\x00\x3a\x00\x1b\x00\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x05\x00\x00\x00\x00\x00\x00\x70\x04\x1c\x07\x29\x03\xfd\x06\x00\x00\x71\x00\xf7\x02\x00\x00\xb6\x06\x97\x06\x00\x00\x00\x00\x00\x00\xe9\x06\x00\x00\xca\x06\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x03\x00\x00\x00\x6e\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x08\x00\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x06\x0a\x00\x00\x00\x00\x00\x00\x00\x29\x00\x08\x08\xfc\x07\xc9\x07\xc3\x07\xbb\x07\xa7\x07\x88\x07\x30\x07\x64\x06\x50\x06\x31\x06\x1d\x06\xeb\x05\xa4\x05\x89\x05\x57\x05\x3c\x05\x0a\x05\xef\x04\xbd\x04\x00\x00\x55\x04\x23\x04\xf1\x03\xbf\x03\x8d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\x00\x00\x00\x00\x74\x07\x93\x00\x93\x02\x61\x02\x00\x00\x5c\x00\x6b\x07\x39\x07\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\xfa\x01\x79\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x02\x00\x00\xfd\x01\x00\x00\x00\x00\x00\x00\xcb\x01\x18\x00\x99\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
-
-happyDefActions :: HappyAddr
-happyDefActions = HappyA# "\x7d\xff\xe7\xff\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\xff\x00\x00\xd5\xff\xe6\xff\x00\x00\xe7\xff\x7c\xff\xe3\xff\xe1\xff\xdf\xff\xe0\xff\xef\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xff\xd2\xff\xd1\xff\xd3\xff\xd4\xff\x00\x00\x77\xff\x77\xff\x77\xff\x77\xff\x77\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\xff\x8a\xff\x89\xff\x88\xff\x7f\xff\x8c\xff\x76\xff\x71\xff\xbd\xff\xbb\xff\xb9\xff\xb7\xff\xb5\xff\xac\xff\xaa\xff\xa7\xff\xa3\xff\xa0\xff\x9b\xff\x99\xff\x97\xff\x94\xff\x92\xff\x8f\xff\x8d\xff\x00\x00\x73\xff\xc6\xff\xbf\xff\x00\x00\x00\x00\x00\x00\x00\x00\xed\xff\x00\x00\x00\x00\x83\xff\x00\x00\x00\x00\x85\xff\x84\xff\x82\xff\x00\x00\x81\xff\x00\x00\xf9\xff\xf8\xff\xf7\xff\xf6\xff\xde\xff\x00\x00\x00\x00\xcf\xff\xcb\xff\xe5\xff\xca\xff\xcc\xff\xcd\xff\xce\xff\x00\x00\xc7\xff\xc9\xff\xc8\xff\xdc\xff\x00\x00\x9f\xff\x9e\xff\xa1\xff\xa2\xff\x00\x00\x7e\xff\x00\x00\x75\xff\x00\x00\x00\x00\x9c\xff\x00\x00\x9d\xff\xb6\xff\x00\x00\x00\x00\x7f\xff\xab\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\xff\xea\xff\xe8\xff\xeb\xff\xe9\xff\xc0\xff\xbe\xff\xbc\xff\xba\xff\xb8\xff\x00\x00\xae\xff\xb0\xff\xb3\xff\xb2\xff\xb1\xff\xb4\xff\xaf\xff\xa8\xff\xa9\xff\xa5\xff\xa6\xff\xa4\xff\x9a\xff\x98\xff\x95\xff\x96\xff\x93\xff\x91\xff\x90\xff\x8e\xff\x00\x00\x00\x00\x72\xff\x87\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xff\xcf\xff\x00\x00\x00\x00\x80\xff\x7b\xff\xf0\xff\xe2\xff\x79\xff\xe7\xff\x00\x00\xda\xff\xdb\xff\xd9\xff\x00\x00\xc4\xff\x74\xff\x86\xff\x00\x00\xc2\xff\x00\x00\xad\xff\xc3\xff\xc5\xff\x00\x00\xe5\xff\x00\x00\xd6\xff\xd7\xff\x7a\xff\x78\xff\xe4\xff\xd8\xff\xee\xff\xc1\xff"#
-
-happyCheck :: HappyAddr
-happyCheck = HappyA# "\xff\xff\x09\x00\x01\x00\x00\x00\x03\x00\x09\x00\x09\x00\x0b\x00\x07\x00\x2b\x00\x1d\x00\x1b\x00\x08\x00\x04\x00\x04\x00\x0e\x00\x05\x00\x35\x00\x09\x00\x15\x00\x24\x00\x0a\x00\x18\x00\x27\x00\x28\x00\x2c\x00\x2a\x00\x13\x00\x19\x00\x14\x00\x0b\x00\x23\x00\x04\x00\x1d\x00\x0f\x00\x01\x00\x07\x00\x03\x00\x48\x00\x26\x00\x10\x00\x07\x00\x29\x00\x33\x00\x12\x00\x04\x00\x1d\x00\x2e\x00\x0e\x00\x30\x00\x31\x00\x43\x00\x33\x00\x10\x00\x1a\x00\x36\x00\x37\x00\x38\x00\x04\x00\x31\x00\x3b\x00\x3c\x00\x3d\x00\x03\x00\x44\x00\x44\x00\x38\x00\x07\x00\x22\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x0e\x00\x29\x00\x04\x00\x31\x00\x16\x00\x3e\x00\x2e\x00\x36\x00\x30\x00\x31\x00\x38\x00\x33\x00\x1e\x00\x2e\x00\x36\x00\x37\x00\x38\x00\x32\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x37\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x0b\x00\x03\x00\x00\x00\x0e\x00\x36\x00\x07\x00\x0e\x00\x17\x00\x18\x00\x04\x00\x2e\x00\x3b\x00\x0e\x00\x3d\x00\x32\x00\x36\x00\x00\x00\x04\x00\x04\x00\x37\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x17\x00\x18\x00\x36\x00\x01\x00\x36\x00\x03\x00\x36\x00\x22\x00\x0d\x00\x07\x00\x14\x00\x15\x00\x0c\x00\x16\x00\x29\x00\x18\x00\x0e\x00\x40\x00\x04\x00\x2e\x00\x41\x00\x30\x00\x31\x00\x1d\x00\x33\x00\x1d\x00\x2e\x00\x36\x00\x37\x00\x38\x00\x32\x00\x12\x00\x3b\x00\x3c\x00\x3d\x00\x37\x00\x30\x00\x0c\x00\x0d\x00\x04\x00\x34\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x48\x00\x03\x00\x41\x00\x30\x00\x31\x00\x07\x00\x33\x00\x10\x00\x11\x00\x36\x00\x37\x00\x38\x00\x0e\x00\x12\x00\x3b\x00\x3c\x00\x3d\x00\x32\x00\x31\x00\x32\x00\x33\x00\x34\x00\x37\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x0c\x00\x0d\x00\x03\x00\x48\x00\x22\x00\x35\x00\x07\x00\x41\x00\x30\x00\x39\x00\x3a\x00\x29\x00\x34\x00\x0e\x00\x17\x00\x3f\x00\x2e\x00\x0f\x00\x30\x00\x31\x00\x44\x00\x33\x00\x06\x00\x42\x00\x36\x00\x37\x00\x38\x00\x3f\x00\x2f\x00\x3b\x00\x3c\x00\x3d\x00\x1a\x00\x48\x00\x41\x00\x15\x00\x18\x00\x48\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x48\x00\x03\x00\x1a\x00\x30\x00\x31\x00\x07\x00\x33\x00\x41\x00\x48\x00\x36\x00\x37\x00\x38\x00\x0e\x00\x40\x00\x3b\x00\x3c\x00\x3d\x00\x1e\x00\x13\x00\x25\x00\x12\x00\x15\x00\x0f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x17\x00\x1a\x00\x06\x00\x42\x00\x22\x00\x1d\x00\x3f\x00\x01\x00\x48\x00\x03\x00\x13\x00\x29\x00\x1f\x00\x07\x00\x24\x00\x4d\x00\x2e\x00\x48\x00\x30\x00\x31\x00\x0e\x00\x33\x00\x1b\x00\x4d\x00\x36\x00\x37\x00\x38\x00\x2a\x00\x44\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x26\x00\x03\x00\xff\xff\x29\x00\xff\xff\x07\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x0e\x00\x33\x00\xff\xff\x03\x00\x36\x00\x37\x00\x38\x00\x07\x00\xff\xff\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\x0e\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x03\x00\xff\xff\x29\x00\xff\xff\x07\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x0e\x00\x33\x00\xff\xff\xff\xff\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1b\x00\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x24\x00\x38\x00\x39\x00\x27\x00\x28\x00\xff\xff\x2a\x00\xff\xff\xff\xff\x2d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\xff\xff\x11\x00\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x4d\x00\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\xff\xff\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x02\x00\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x19\x00\x38\x00\xff\xff\x1c\x00\xff\xff\x1e\x00\xff\xff\x20\x00\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x1a\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x1a\x00\xff\xff\x31\x00\x32\x00\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\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\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\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\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\xff\xff\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\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\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\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\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x1a\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x38\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x38\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\x38\x00\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x1a\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\x38\x00\x31\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x38\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x38\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x10\x00\x4a\x00\x68\x00\x4b\x00\x65\x00\x6b\x00\x66\x00\x4c\x00\x77\x00\x9b\x00\x09\x00\xbe\x00\x8a\x00\x30\x00\x4d\x00\x83\x00\xcc\x00\x8b\x00\x7e\xff\x0d\x00\x84\x00\x7e\xff\x19\x00\x10\x00\xdc\x00\x0b\x00\xc4\x00\x69\x00\x8c\x00\x0d\x00\x67\x00\x30\x00\x9b\x00\x0e\x00\x4a\x00\x4c\x00\x4b\x00\x5d\x00\x9c\x00\xe4\x00\x4c\x00\x4f\x00\x11\x00\x6b\x00\x72\x00\x9b\x00\x50\x00\x4d\x00\x51\x00\x52\x00\xe3\x00\x53\x00\xca\x00\x60\x00\x54\x00\x55\x00\x56\x00\x5d\x00\x46\x00\x57\x00\x58\x00\x59\x00\x4b\x00\x07\x00\x07\x00\xbc\x00\x4c\x00\x9d\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4d\x00\x4f\x00\x72\x00\x46\x00\xdf\x00\xc3\x00\x50\x00\x27\x00\x51\x00\x52\x00\x47\x00\x53\x00\xe0\x00\xba\x00\x54\x00\x55\x00\x56\x00\x74\x00\x61\x00\x57\x00\x58\x00\x59\x00\x75\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4a\x00\x8d\x00\x4b\x00\x61\x00\x8e\x00\x28\x00\x4c\x00\x07\x00\xd0\x00\x63\x00\x72\x00\xbe\x00\x57\x00\x4d\x00\x59\x00\x74\x00\x29\x00\x1a\x00\xc7\x00\x5f\x00\x75\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x62\x00\x63\x00\x2a\x00\x4a\x00\x2b\x00\x4b\x00\x21\x00\x9e\x00\x09\x00\x4c\x00\xdc\x00\xdd\x00\x0b\x00\x1b\x00\x4f\x00\x1c\x00\x4d\x00\xcc\x00\x72\x00\x50\x00\xce\x00\x51\x00\x52\x00\x9b\x00\x53\x00\x9b\x00\x73\x00\x54\x00\x55\x00\x56\x00\x74\x00\x82\x00\x57\x00\x58\x00\x59\x00\x75\x00\xc8\x00\x86\x00\x87\x00\xc7\x00\xe0\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4a\x00\x5d\x00\x4b\x00\xd6\x00\x51\x00\x52\x00\x4c\x00\x53\x00\xc6\x00\xc7\x00\x54\x00\x55\x00\x56\x00\x4d\x00\x82\x00\x57\x00\x58\x00\x59\x00\x74\x00\x24\x00\x25\x00\x26\x00\x27\x00\xd3\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x86\x00\x87\x00\x4b\x00\x5d\x00\x9f\x00\x1e\x00\x4c\x00\xd8\x00\xc8\x00\x1f\x00\x20\x00\x4f\x00\xc9\x00\x4d\x00\x88\x00\x21\x00\x50\x00\x85\x00\x51\x00\x52\x00\x07\x00\x53\x00\x97\x00\x99\x00\x54\x00\x55\x00\x56\x00\x98\x00\xa6\x00\x57\x00\x58\x00\x59\x00\x89\x00\x5d\x00\xbc\x00\xc0\x00\xc1\x00\x5d\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4a\x00\x5d\x00\x4b\x00\x89\x00\x51\x00\x52\x00\x4c\x00\x53\x00\xc2\x00\x5d\x00\x54\x00\x55\x00\x56\x00\x4d\x00\xcc\x00\x57\x00\x58\x00\x59\x00\x68\x00\x5f\x00\x7d\x00\x82\x00\x6d\x00\x85\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x88\x00\x89\x00\x97\x00\x99\x00\xa0\x00\x9b\x00\x98\x00\x4a\x00\x5d\x00\x4b\x00\x5f\x00\x4f\x00\x9a\x00\x4c\x00\x23\x00\xff\xff\x50\x00\x5d\x00\x51\x00\x52\x00\x4d\x00\x53\x00\x09\x00\xff\xff\x54\x00\x55\x00\x56\x00\x0b\x00\x07\x00\x57\x00\x58\x00\x59\x00\x10\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4a\x00\x4e\x00\x4b\x00\x00\x00\x4f\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x50\x00\x00\x00\x51\x00\x52\x00\x4d\x00\x53\x00\x00\x00\x4b\x00\x54\x00\x55\x00\x56\x00\x4c\x00\x00\x00\x57\x00\x58\x00\x59\x00\x00\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x4f\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x50\x00\x00\x00\x51\x00\x52\x00\x4d\x00\x53\x00\x00\x00\x00\x00\x54\x00\x55\x00\x56\x00\x00\x00\x00\x00\x57\x00\x58\x00\x59\x00\x00\x00\x52\x00\x00\x00\x53\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x57\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xe3\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\x09\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x0d\x00\x47\x00\x48\x00\x19\x00\x10\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x1a\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0e\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x31\x00\xe5\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\xf1\xff\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0e\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xd9\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xda\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xd1\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xd2\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xd6\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x71\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x78\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\xa1\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\xa2\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xa4\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\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x7a\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xd8\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xa7\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xa9\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xab\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x8f\x00\x00\x00\xac\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x7d\x00\x90\x00\x47\x00\x00\x00\x91\x00\x00\x00\x92\x00\x00\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x7e\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x7f\x00\x31\x00\x00\x00\x46\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x00\x47\x00\xad\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\xaf\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\xb1\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x00\x00\x6f\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x00\x00\x00\x00\x6d\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x00\x00\x00\x00\x77\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x47\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\xce\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x47\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\xd4\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x47\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\xb5\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\xb6\x00\x43\x00\x44\x00\x00\x00\x00\x00\x47\x00\x46\x00\xb7\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x47\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\xc3\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x47\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x46\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
-
-happyReduceArr = Happy_Data_Array.array (5, 142) [
-	(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)
-	]
-
-happy_n_terms = 78 :: Int
-happy_n_nonterms = 58 :: Int
-
-happyReduce_5 = happySpecReduce_1  0# happyReduction_5
-happyReduction_5 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn8
-		 (PosInteger (mkPosToken happy_var_1)
-	)}
-
-happyReduce_6 = happySpecReduce_1  1# happyReduction_6
-happyReduction_6 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn9
-		 (PosDouble (mkPosToken happy_var_1)
-	)}
-
-happyReduce_7 = happySpecReduce_1  2# happyReduction_7
-happyReduction_7 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn10
-		 (PosReal (mkPosToken happy_var_1)
-	)}
-
-happyReduce_8 = happySpecReduce_1  3# happyReduction_8
-happyReduction_8 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn11
-		 (PosString (mkPosToken happy_var_1)
-	)}
-
-happyReduce_9 = happySpecReduce_1  4# happyReduction_9
-happyReduction_9 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn12
-		 (PosIdent (mkPosToken happy_var_1)
-	)}
-
-happyReduce_10 = happySpecReduce_1  5# happyReduction_10
-happyReduction_10 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn13
-		 (PosLineComment (mkPosToken happy_var_1)
-	)}
-
-happyReduce_11 = happySpecReduce_1  6# happyReduction_11
-happyReduction_11 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn14
-		 (PosBlockComment (mkPosToken happy_var_1)
-	)}
-
-happyReduce_12 = happySpecReduce_1  7# happyReduction_12
-happyReduction_12 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn15
-		 (PosAlloy (mkPosToken happy_var_1)
-	)}
-
-happyReduce_13 = happySpecReduce_1  8# happyReduction_13
-happyReduction_13 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn16
-		 (PosChoco (mkPosToken happy_var_1)
-	)}
-
-happyReduce_14 = happySpecReduce_1  9# happyReduction_14
-happyReduction_14 happy_x_1
-	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
-	happyIn17
-		 (Language.Clafer.Front.AbsClafer.Module ((mkCatSpan happy_var_1)) (reverse happy_var_1)
-	)}
-
-happyReduce_15 = happyReduce 4# 10# happyReduction_15
-happyReduction_15 (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 happyOut12 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut60 happy_x_4 of { happy_var_4 -> 
-	happyIn18
-		 (Language.Clafer.Front.AbsClafer.EnumDecl ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_16 = happySpecReduce_1  10# happyReduction_16
-happyReduction_16 happy_x_1
-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
-	happyIn18
-		 (Language.Clafer.Front.AbsClafer.ElementDecl ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_17 = happyReduce 8# 11# happyReduction_17
-happyReduction_17 (happy_x_8 `HappyStk`
-	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 happyOut23 happy_x_1 of { happy_var_1 -> 
-	case happyOut30 happy_x_2 of { happy_var_2 -> 
-	case happyOut12 happy_x_3 of { happy_var_3 -> 
-	case happyOut26 happy_x_4 of { happy_var_4 -> 
-	case happyOut27 happy_x_5 of { happy_var_5 -> 
-	case happyOut31 happy_x_6 of { happy_var_6 -> 
-	case happyOut28 happy_x_7 of { happy_var_7 -> 
-	case happyOut24 happy_x_8 of { happy_var_8 -> 
-	happyIn19
-		 (Language.Clafer.Front.AbsClafer.Clafer ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkCatSpan happy_var_5) >- (mkCatSpan happy_var_6) >- (mkCatSpan happy_var_7) >- (mkCatSpan happy_var_8)) happy_var_1 happy_var_2 happy_var_3 happy_var_4 happy_var_5 happy_var_6 happy_var_7 happy_var_8
-	) `HappyStk` happyRest}}}}}}}}
-
-happyReduce_18 = happySpecReduce_3  12# happyReduction_18
-happyReduction_18 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	happyIn20
-		 (Language.Clafer.Front.AbsClafer.Constraint ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
-	)}}}
-
-happyReduce_19 = happyReduce 4# 13# happyReduction_19
-happyReduction_19 (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 happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut62 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	happyIn21
-		 (Language.Clafer.Front.AbsClafer.Assertion ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_20 = happyReduce 4# 14# happyReduction_20
-happyReduction_20 (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 happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut62 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	happyIn22
-		 (Language.Clafer.Front.AbsClafer.GoalMinDeprecated ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_21 = happyReduce 4# 14# 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 happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut62 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	happyIn22
-		 (Language.Clafer.Front.AbsClafer.GoalMaxDeprecated ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_22 = happyReduce 4# 14# 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 happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut62 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	happyIn22
-		 (Language.Clafer.Front.AbsClafer.GoalMinimize ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_23 = happyReduce 4# 14# happyReduction_23
-happyReduction_23 (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 happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut62 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	happyIn22
-		 (Language.Clafer.Front.AbsClafer.GoalMaximize ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_24 = happySpecReduce_0  15# happyReduction_24
-happyReduction_24  =  happyIn23
-		 (Language.Clafer.Front.AbsClafer.AbstractEmpty noSpan
-	)
-
-happyReduce_25 = happySpecReduce_1  15# happyReduction_25
-happyReduction_25 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn23
-		 (Language.Clafer.Front.AbsClafer.Abstract ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_26 = happySpecReduce_0  16# happyReduction_26
-happyReduction_26  =  happyIn24
-		 (Language.Clafer.Front.AbsClafer.ElementsEmpty noSpan
-	)
-
-happyReduce_27 = happySpecReduce_3  16# happyReduction_27
-happyReduction_27 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut61 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	happyIn24
-		 (Language.Clafer.Front.AbsClafer.ElementsList ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
-	)}}}
-
-happyReduce_28 = happySpecReduce_1  17# happyReduction_28
-happyReduction_28 happy_x_1
-	 =  case happyOut19 happy_x_1 of { happy_var_1 -> 
-	happyIn25
-		 (Language.Clafer.Front.AbsClafer.Subclafer ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_29 = happyReduce 4# 17# happyReduction_29
-happyReduction_29 (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 happyOut34 happy_x_2 of { happy_var_2 -> 
-	case happyOut31 happy_x_3 of { happy_var_3 -> 
-	case happyOut24 happy_x_4 of { happy_var_4 -> 
-	happyIn25
-		 (Language.Clafer.Front.AbsClafer.ClaferUse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_3 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_30 = happySpecReduce_1  17# happyReduction_30
-happyReduction_30 happy_x_1
-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> 
-	happyIn25
-		 (Language.Clafer.Front.AbsClafer.Subconstraint ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_31 = happySpecReduce_1  17# happyReduction_31
-happyReduction_31 happy_x_1
-	 =  case happyOut22 happy_x_1 of { happy_var_1 -> 
-	happyIn25
-		 (Language.Clafer.Front.AbsClafer.Subgoal ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_32 = happySpecReduce_1  17# happyReduction_32
-happyReduction_32 happy_x_1
-	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
-	happyIn25
-		 (Language.Clafer.Front.AbsClafer.SubAssertion ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_33 = happySpecReduce_0  18# happyReduction_33
-happyReduction_33  =  happyIn26
-		 (Language.Clafer.Front.AbsClafer.SuperEmpty noSpan
-	)
-
-happyReduce_34 = happySpecReduce_2  18# happyReduction_34
-happyReduction_34 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut52 happy_x_2 of { happy_var_2 -> 
-	happyIn26
-		 (Language.Clafer.Front.AbsClafer.SuperSome ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_35 = happySpecReduce_0  19# happyReduction_35
-happyReduction_35  =  happyIn27
-		 (Language.Clafer.Front.AbsClafer.ReferenceEmpty noSpan
-	)
-
-happyReduce_36 = happySpecReduce_2  19# happyReduction_36
-happyReduction_36 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut49 happy_x_2 of { happy_var_2 -> 
-	happyIn27
-		 (Language.Clafer.Front.AbsClafer.ReferenceSet ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_37 = happySpecReduce_2  19# happyReduction_37
-happyReduction_37 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut49 happy_x_2 of { happy_var_2 -> 
-	happyIn27
-		 (Language.Clafer.Front.AbsClafer.ReferenceBag ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_38 = happySpecReduce_0  20# happyReduction_38
-happyReduction_38  =  happyIn28
-		 (Language.Clafer.Front.AbsClafer.InitEmpty noSpan
-	)
-
-happyReduce_39 = happySpecReduce_2  20# happyReduction_39
-happyReduction_39 happy_x_2
-	happy_x_1
-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
-	case happyOut35 happy_x_2 of { happy_var_2 -> 
-	happyIn28
-		 (Language.Clafer.Front.AbsClafer.InitSome ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2
-	)}}
-
-happyReduce_40 = happySpecReduce_1  21# happyReduction_40
-happyReduction_40 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn29
-		 (Language.Clafer.Front.AbsClafer.InitConstant ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_41 = happySpecReduce_1  21# happyReduction_41
-happyReduction_41 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn29
-		 (Language.Clafer.Front.AbsClafer.InitDefault ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_42 = happySpecReduce_0  22# happyReduction_42
-happyReduction_42  =  happyIn30
-		 (Language.Clafer.Front.AbsClafer.GCardEmpty noSpan
-	)
-
-happyReduce_43 = happySpecReduce_1  22# happyReduction_43
-happyReduction_43 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn30
-		 (Language.Clafer.Front.AbsClafer.GCardXor ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_44 = happySpecReduce_1  22# happyReduction_44
-happyReduction_44 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn30
-		 (Language.Clafer.Front.AbsClafer.GCardOr ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_45 = happySpecReduce_1  22# happyReduction_45
-happyReduction_45 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn30
-		 (Language.Clafer.Front.AbsClafer.GCardMux ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_46 = happySpecReduce_1  22# happyReduction_46
-happyReduction_46 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn30
-		 (Language.Clafer.Front.AbsClafer.GCardOpt ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_47 = happySpecReduce_1  22# happyReduction_47
-happyReduction_47 happy_x_1
-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
-	happyIn30
-		 (Language.Clafer.Front.AbsClafer.GCardInterval ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_48 = happySpecReduce_0  23# happyReduction_48
-happyReduction_48  =  happyIn31
-		 (Language.Clafer.Front.AbsClafer.CardEmpty noSpan
-	)
-
-happyReduce_49 = happySpecReduce_1  23# happyReduction_49
-happyReduction_49 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn31
-		 (Language.Clafer.Front.AbsClafer.CardLone ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_50 = happySpecReduce_1  23# happyReduction_50
-happyReduction_50 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn31
-		 (Language.Clafer.Front.AbsClafer.CardSome ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_51 = happySpecReduce_1  23# happyReduction_51
-happyReduction_51 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn31
-		 (Language.Clafer.Front.AbsClafer.CardAny ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_52 = happySpecReduce_1  23# happyReduction_52
-happyReduction_52 happy_x_1
-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
-	happyIn31
-		 (Language.Clafer.Front.AbsClafer.CardNum ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_53 = happySpecReduce_1  23# happyReduction_53
-happyReduction_53 happy_x_1
-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
-	happyIn31
-		 (Language.Clafer.Front.AbsClafer.CardInterval ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_54 = happySpecReduce_3  24# happyReduction_54
-happyReduction_54 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut33 happy_x_3 of { happy_var_3 -> 
-	happyIn32
-		 (Language.Clafer.Front.AbsClafer.NCard ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_55 = happySpecReduce_1  25# happyReduction_55
-happyReduction_55 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn33
-		 (Language.Clafer.Front.AbsClafer.ExIntegerAst ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_56 = happySpecReduce_1  25# happyReduction_56
-happyReduction_56 happy_x_1
-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
-	happyIn33
-		 (Language.Clafer.Front.AbsClafer.ExIntegerNum ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_57 = happySpecReduce_1  26# happyReduction_57
-happyReduction_57 happy_x_1
-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> 
-	happyIn34
-		 (Language.Clafer.Front.AbsClafer.Path ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_58 = happyReduce 5# 27# happyReduction_58
-happyReduction_58 (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 happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut54 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	case happyOut35 happy_x_5 of { happy_var_5 -> 
-	happyIn35
-		 (Language.Clafer.Front.AbsClafer.EDeclAllDisj ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_3 happy_var_5
-	) `HappyStk` happyRest}}}}}
-
-happyReduce_59 = happyReduce 4# 27# happyReduction_59
-happyReduction_59 (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 happyOut54 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut35 happy_x_4 of { happy_var_4 -> 
-	happyIn35
-		 (Language.Clafer.Front.AbsClafer.EDeclAll ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_60 = happyReduce 5# 27# happyReduction_60
-happyReduction_60 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut55 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut54 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	case happyOut35 happy_x_5 of { happy_var_5 -> 
-	happyIn35
-		 (Language.Clafer.Front.AbsClafer.EDeclQuantDisj ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_1 happy_var_3 happy_var_5
-	) `HappyStk` happyRest}}}}}
-
-happyReduce_61 = happyReduce 4# 27# happyReduction_61
-happyReduction_61 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut55 happy_x_1 of { happy_var_1 -> 
-	case happyOut54 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut35 happy_x_4 of { happy_var_4 -> 
-	happyIn35
-		 (Language.Clafer.Front.AbsClafer.EDeclQuant ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_62 = happyReduce 6# 27# happyReduction_62
-happyReduction_62 (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 happyOut35 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut35 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_5 of { happy_var_5 -> 
-	case happyOut35 happy_x_6 of { happy_var_6 -> 
-	happyIn35
-		 (Language.Clafer.Front.AbsClafer.EImpliesElse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkTokenSpan happy_var_5) >- (mkCatSpan happy_var_6)) happy_var_2 happy_var_4 happy_var_6
-	) `HappyStk` happyRest}}}}}}
-
-happyReduce_63 = happySpecReduce_3  27# happyReduction_63
-happyReduction_63 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut65 happy_x_3 of { happy_var_3 -> 
-	happyIn35
-		 (Language.Clafer.Front.AbsClafer.EIff ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_64 = happySpecReduce_1  27# happyReduction_64
-happyReduction_64 happy_x_1
-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> 
-	happyIn35
-		 (happy_var_1
-	)}
-
-happyReduce_65 = happySpecReduce_3  28# happyReduction_65
-happyReduction_65 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut37 happy_x_3 of { happy_var_3 -> 
-	happyIn36
-		 (Language.Clafer.Front.AbsClafer.EImplies ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_66 = happySpecReduce_1  28# happyReduction_66
-happyReduction_66 happy_x_1
-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
-	happyIn36
-		 (happy_var_1
-	)}
-
-happyReduce_67 = happySpecReduce_3  29# happyReduction_67
-happyReduction_67 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	happyIn37
-		 (Language.Clafer.Front.AbsClafer.EOr ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_68 = happySpecReduce_1  29# happyReduction_68
-happyReduction_68 happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	happyIn37
-		 (happy_var_1
-	)}
-
-happyReduce_69 = happySpecReduce_3  30# happyReduction_69
-happyReduction_69 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut39 happy_x_3 of { happy_var_3 -> 
-	happyIn38
-		 (Language.Clafer.Front.AbsClafer.EXor ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_70 = happySpecReduce_1  30# happyReduction_70
-happyReduction_70 happy_x_1
-	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
-	happyIn38
-		 (happy_var_1
-	)}
-
-happyReduce_71 = happySpecReduce_3  31# happyReduction_71
-happyReduction_71 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut40 happy_x_3 of { happy_var_3 -> 
-	happyIn39
-		 (Language.Clafer.Front.AbsClafer.EAnd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_72 = happySpecReduce_1  31# happyReduction_72
-happyReduction_72 happy_x_1
-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
-	happyIn39
-		 (happy_var_1
-	)}
-
-happyReduce_73 = happySpecReduce_2  32# happyReduction_73
-happyReduction_73 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut41 happy_x_2 of { happy_var_2 -> 
-	happyIn40
-		 (Language.Clafer.Front.AbsClafer.ENeg ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_74 = happySpecReduce_1  32# happyReduction_74
-happyReduction_74 happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	happyIn40
-		 (happy_var_1
-	)}
-
-happyReduce_75 = happySpecReduce_3  33# happyReduction_75
-happyReduction_75 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut42 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (Language.Clafer.Front.AbsClafer.ELt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_76 = happySpecReduce_3  33# happyReduction_76
-happyReduction_76 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut42 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (Language.Clafer.Front.AbsClafer.EGt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_77 = happySpecReduce_3  33# happyReduction_77
-happyReduction_77 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut42 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (Language.Clafer.Front.AbsClafer.EEq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_78 = happySpecReduce_3  33# happyReduction_78
-happyReduction_78 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut42 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (Language.Clafer.Front.AbsClafer.ELte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_79 = happySpecReduce_3  33# happyReduction_79
-happyReduction_79 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut42 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (Language.Clafer.Front.AbsClafer.EGte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_80 = happySpecReduce_3  33# happyReduction_80
-happyReduction_80 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut42 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (Language.Clafer.Front.AbsClafer.ENeq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_81 = happySpecReduce_3  33# happyReduction_81
-happyReduction_81 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut42 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (Language.Clafer.Front.AbsClafer.EIn ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_82 = happyReduce 4# 33# happyReduction_82
-happyReduction_82 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut42 happy_x_4 of { happy_var_4 -> 
-	happyIn41
-		 (Language.Clafer.Front.AbsClafer.ENin ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_83 = happySpecReduce_1  33# happyReduction_83
-happyReduction_83 happy_x_1
-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
-	happyIn41
-		 (happy_var_1
-	)}
-
-happyReduce_84 = happySpecReduce_2  34# happyReduction_84
-happyReduction_84 happy_x_2
-	happy_x_1
-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
-	case happyOut46 happy_x_2 of { happy_var_2 -> 
-	happyIn42
-		 (Language.Clafer.Front.AbsClafer.EQuantExp ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2
-	)}}
-
-happyReduce_85 = happySpecReduce_1  34# happyReduction_85
-happyReduction_85 happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	happyIn42
-		 (happy_var_1
-	)}
-
-happyReduce_86 = happySpecReduce_3  35# happyReduction_86
-happyReduction_86 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut44 happy_x_3 of { happy_var_3 -> 
-	happyIn43
-		 (Language.Clafer.Front.AbsClafer.EAdd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_87 = happySpecReduce_3  35# happyReduction_87
-happyReduction_87 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut44 happy_x_3 of { happy_var_3 -> 
-	happyIn43
-		 (Language.Clafer.Front.AbsClafer.ESub ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_88 = happySpecReduce_1  35# happyReduction_88
-happyReduction_88 happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	happyIn43
-		 (happy_var_1
-	)}
-
-happyReduce_89 = happySpecReduce_3  36# happyReduction_89
-happyReduction_89 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut45 happy_x_3 of { happy_var_3 -> 
-	happyIn44
-		 (Language.Clafer.Front.AbsClafer.EMul ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_90 = happySpecReduce_3  36# happyReduction_90
-happyReduction_90 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut45 happy_x_3 of { happy_var_3 -> 
-	happyIn44
-		 (Language.Clafer.Front.AbsClafer.EDiv ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_91 = happySpecReduce_3  36# happyReduction_91
-happyReduction_91 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut45 happy_x_3 of { happy_var_3 -> 
-	happyIn44
-		 (Language.Clafer.Front.AbsClafer.ERem ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_92 = happySpecReduce_1  36# happyReduction_92
-happyReduction_92 happy_x_1
-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
-	happyIn44
-		 (happy_var_1
-	)}
-
-happyReduce_93 = happySpecReduce_2  37# happyReduction_93
-happyReduction_93 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut46 happy_x_2 of { happy_var_2 -> 
-	happyIn45
-		 (Language.Clafer.Front.AbsClafer.EGMax ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_94 = happySpecReduce_2  37# happyReduction_94
-happyReduction_94 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut46 happy_x_2 of { happy_var_2 -> 
-	happyIn45
-		 (Language.Clafer.Front.AbsClafer.EGMin ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_95 = happySpecReduce_1  37# happyReduction_95
-happyReduction_95 happy_x_1
-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
-	happyIn45
-		 (happy_var_1
-	)}
-
-happyReduce_96 = happySpecReduce_2  38# happyReduction_96
-happyReduction_96 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut47 happy_x_2 of { happy_var_2 -> 
-	happyIn46
-		 (Language.Clafer.Front.AbsClafer.ESum ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_97 = happySpecReduce_2  38# happyReduction_97
-happyReduction_97 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut47 happy_x_2 of { happy_var_2 -> 
-	happyIn46
-		 (Language.Clafer.Front.AbsClafer.EProd ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_98 = happySpecReduce_2  38# happyReduction_98
-happyReduction_98 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut47 happy_x_2 of { happy_var_2 -> 
-	happyIn46
-		 (Language.Clafer.Front.AbsClafer.ECard ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_99 = happySpecReduce_2  38# happyReduction_99
-happyReduction_99 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut47 happy_x_2 of { happy_var_2 -> 
-	happyIn46
-		 (Language.Clafer.Front.AbsClafer.EMinExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_100 = happySpecReduce_1  38# happyReduction_100
-happyReduction_100 happy_x_1
-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
-	happyIn46
-		 (happy_var_1
-	)}
-
-happyReduce_101 = happySpecReduce_3  39# happyReduction_101
-happyReduction_101 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut48 happy_x_3 of { happy_var_3 -> 
-	happyIn47
-		 (Language.Clafer.Front.AbsClafer.EDomain ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_102 = happySpecReduce_1  39# happyReduction_102
-happyReduction_102 happy_x_1
-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
-	happyIn47
-		 (happy_var_1
-	)}
-
-happyReduce_103 = happySpecReduce_3  40# happyReduction_103
-happyReduction_103 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut49 happy_x_3 of { happy_var_3 -> 
-	happyIn48
-		 (Language.Clafer.Front.AbsClafer.ERange ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_104 = happySpecReduce_1  40# happyReduction_104
-happyReduction_104 happy_x_1
-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
-	happyIn48
-		 (happy_var_1
-	)}
-
-happyReduce_105 = happySpecReduce_3  41# happyReduction_105
-happyReduction_105 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut50 happy_x_3 of { happy_var_3 -> 
-	happyIn49
-		 (Language.Clafer.Front.AbsClafer.EUnion ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_106 = happySpecReduce_3  41# happyReduction_106
-happyReduction_106 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut50 happy_x_3 of { happy_var_3 -> 
-	happyIn49
-		 (Language.Clafer.Front.AbsClafer.EUnionCom ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_107 = happySpecReduce_1  41# happyReduction_107
-happyReduction_107 happy_x_1
-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
-	happyIn49
-		 (happy_var_1
-	)}
-
-happyReduce_108 = happySpecReduce_3  42# happyReduction_108
-happyReduction_108 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut51 happy_x_3 of { happy_var_3 -> 
-	happyIn50
-		 (Language.Clafer.Front.AbsClafer.EDifference ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_109 = happySpecReduce_1  42# happyReduction_109
-happyReduction_109 happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	happyIn50
-		 (happy_var_1
-	)}
-
-happyReduce_110 = happySpecReduce_3  43# happyReduction_110
-happyReduction_110 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut52 happy_x_3 of { happy_var_3 -> 
-	happyIn51
-		 (Language.Clafer.Front.AbsClafer.EIntersection ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_111 = happySpecReduce_3  43# happyReduction_111
-happyReduction_111 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut52 happy_x_3 of { happy_var_3 -> 
-	happyIn51
-		 (Language.Clafer.Front.AbsClafer.EIntersectionDeprecated ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_112 = happySpecReduce_1  43# happyReduction_112
-happyReduction_112 happy_x_1
-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
-	happyIn51
-		 (happy_var_1
-	)}
-
-happyReduce_113 = happySpecReduce_3  44# happyReduction_113
-happyReduction_113 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut53 happy_x_3 of { happy_var_3 -> 
-	happyIn52
-		 (Language.Clafer.Front.AbsClafer.EJoin ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_114 = happySpecReduce_1  44# happyReduction_114
-happyReduction_114 happy_x_1
-	 =  case happyOut53 happy_x_1 of { happy_var_1 -> 
-	happyIn52
-		 (happy_var_1
-	)}
-
-happyReduce_115 = happySpecReduce_1  45# happyReduction_115
-happyReduction_115 happy_x_1
-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
-	happyIn53
-		 (Language.Clafer.Front.AbsClafer.ClaferId ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_116 = happySpecReduce_1  45# happyReduction_116
-happyReduction_116 happy_x_1
-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
-	happyIn53
-		 (Language.Clafer.Front.AbsClafer.EInt ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_117 = happySpecReduce_1  45# happyReduction_117
-happyReduction_117 happy_x_1
-	 =  case happyOut9 happy_x_1 of { happy_var_1 -> 
-	happyIn53
-		 (Language.Clafer.Front.AbsClafer.EDouble ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_118 = happySpecReduce_1  45# happyReduction_118
-happyReduction_118 happy_x_1
-	 =  case happyOut10 happy_x_1 of { happy_var_1 -> 
-	happyIn53
-		 (Language.Clafer.Front.AbsClafer.EReal ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_119 = happySpecReduce_1  45# happyReduction_119
-happyReduction_119 happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	happyIn53
-		 (Language.Clafer.Front.AbsClafer.EStr ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_120 = happySpecReduce_3  45# happyReduction_120
-happyReduction_120 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut35 happy_x_2 of { happy_var_2 -> 
-	happyIn53
-		 (happy_var_2
-	)}
-
-happyReduce_121 = happySpecReduce_3  46# happyReduction_121
-happyReduction_121 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut49 happy_x_3 of { happy_var_3 -> 
-	happyIn54
-		 (Language.Clafer.Front.AbsClafer.Decl ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_122 = happySpecReduce_1  47# happyReduction_122
-happyReduction_122 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn55
-		 (Language.Clafer.Front.AbsClafer.QuantNo ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_123 = happySpecReduce_1  47# happyReduction_123
-happyReduction_123 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn55
-		 (Language.Clafer.Front.AbsClafer.QuantNot ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_124 = happySpecReduce_1  47# happyReduction_124
-happyReduction_124 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn55
-		 (Language.Clafer.Front.AbsClafer.QuantLone ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_125 = happySpecReduce_1  47# happyReduction_125
-happyReduction_125 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn55
-		 (Language.Clafer.Front.AbsClafer.QuantOne ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_126 = happySpecReduce_1  47# happyReduction_126
-happyReduction_126 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn55
-		 (Language.Clafer.Front.AbsClafer.QuantSome ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_127 = happySpecReduce_1  48# happyReduction_127
-happyReduction_127 happy_x_1
-	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
-	happyIn56
-		 (Language.Clafer.Front.AbsClafer.EnumIdIdent ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_128 = happySpecReduce_1  49# happyReduction_128
-happyReduction_128 happy_x_1
-	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
-	happyIn57
-		 (Language.Clafer.Front.AbsClafer.ModIdIdent ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_129 = happySpecReduce_1  50# happyReduction_129
-happyReduction_129 happy_x_1
-	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
-	happyIn58
-		 (Language.Clafer.Front.AbsClafer.LocIdIdent ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_130 = happySpecReduce_0  51# happyReduction_130
-happyReduction_130  =  happyIn59
-		 ([]
-	)
-
-happyReduce_131 = happySpecReduce_2  51# happyReduction_131
-happyReduction_131 happy_x_2
-	happy_x_1
-	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
-	case happyOut18 happy_x_2 of { happy_var_2 -> 
-	happyIn59
-		 (flip (:)  happy_var_1 happy_var_2
-	)}}
-
-happyReduce_132 = happySpecReduce_1  52# happyReduction_132
-happyReduction_132 happy_x_1
-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
-	happyIn60
-		 ((:[])  happy_var_1
-	)}
-
-happyReduce_133 = happySpecReduce_3  52# happyReduction_133
-happyReduction_133 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
-	case happyOut60 happy_x_3 of { happy_var_3 -> 
-	happyIn60
-		 ((:)  happy_var_1 happy_var_3
-	)}}
-
-happyReduce_134 = happySpecReduce_0  53# happyReduction_134
-happyReduction_134  =  happyIn61
-		 ([]
-	)
-
-happyReduce_135 = happySpecReduce_2  53# happyReduction_135
-happyReduction_135 happy_x_2
-	happy_x_1
-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
-	case happyOut25 happy_x_2 of { happy_var_2 -> 
-	happyIn61
-		 (flip (:)  happy_var_1 happy_var_2
-	)}}
-
-happyReduce_136 = happySpecReduce_0  54# happyReduction_136
-happyReduction_136  =  happyIn62
-		 ([]
-	)
-
-happyReduce_137 = happySpecReduce_2  54# happyReduction_137
-happyReduction_137 happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut35 happy_x_2 of { happy_var_2 -> 
-	happyIn62
-		 (flip (:)  happy_var_1 happy_var_2
-	)}}
-
-happyReduce_138 = happySpecReduce_1  55# happyReduction_138
-happyReduction_138 happy_x_1
-	 =  case happyOut58 happy_x_1 of { happy_var_1 -> 
-	happyIn63
-		 ((:[])  happy_var_1
-	)}
-
-happyReduce_139 = happySpecReduce_3  55# happyReduction_139
-happyReduction_139 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut58 happy_x_1 of { happy_var_1 -> 
-	case happyOut63 happy_x_3 of { happy_var_3 -> 
-	happyIn63
-		 ((:)  happy_var_1 happy_var_3
-	)}}
-
-happyReduce_140 = happySpecReduce_1  56# happyReduction_140
-happyReduction_140 happy_x_1
-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
-	happyIn64
-		 ((:[])  happy_var_1
-	)}
-
-happyReduce_141 = happySpecReduce_3  56# happyReduction_141
-happyReduction_141 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
-	case happyOut64 happy_x_3 of { happy_var_3 -> 
-	happyIn64
-		 ((:)  happy_var_1 happy_var_3
-	)}}
-
-happyReduce_142 = happySpecReduce_1  57# happyReduction_142
-happyReduction_142 happy_x_1
-	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
-	happyIn65
-		 (happy_var_1
-	)}
-
-happyNewToken action sts stk [] =
-	happyDoAction 77# notHappyAtAll action sts stk []
-
-happyNewToken action sts stk (tk:tks) =
-	let cont i = happyDoAction i tk action sts stk tks in
-	case tk of {
-	PT _ (TS _ 1) -> cont 1#;
-	PT _ (TS _ 2) -> cont 2#;
-	PT _ (TS _ 3) -> cont 3#;
-	PT _ (TS _ 4) -> cont 4#;
-	PT _ (TS _ 5) -> cont 5#;
-	PT _ (TS _ 6) -> cont 6#;
-	PT _ (TS _ 7) -> cont 7#;
-	PT _ (TS _ 8) -> cont 8#;
-	PT _ (TS _ 9) -> cont 9#;
-	PT _ (TS _ 10) -> cont 10#;
-	PT _ (TS _ 11) -> cont 11#;
-	PT _ (TS _ 12) -> cont 12#;
-	PT _ (TS _ 13) -> cont 13#;
-	PT _ (TS _ 14) -> cont 14#;
-	PT _ (TS _ 15) -> cont 15#;
-	PT _ (TS _ 16) -> cont 16#;
-	PT _ (TS _ 17) -> cont 17#;
-	PT _ (TS _ 18) -> cont 18#;
-	PT _ (TS _ 19) -> cont 19#;
-	PT _ (TS _ 20) -> cont 20#;
-	PT _ (TS _ 21) -> cont 21#;
-	PT _ (TS _ 22) -> cont 22#;
-	PT _ (TS _ 23) -> cont 23#;
-	PT _ (TS _ 24) -> cont 24#;
-	PT _ (TS _ 25) -> cont 25#;
-	PT _ (TS _ 26) -> cont 26#;
-	PT _ (TS _ 27) -> cont 27#;
-	PT _ (TS _ 28) -> cont 28#;
-	PT _ (TS _ 29) -> cont 29#;
-	PT _ (TS _ 30) -> cont 30#;
-	PT _ (TS _ 31) -> cont 31#;
-	PT _ (TS _ 32) -> cont 32#;
-	PT _ (TS _ 33) -> cont 33#;
-	PT _ (TS _ 34) -> cont 34#;
-	PT _ (TS _ 35) -> cont 35#;
-	PT _ (TS _ 36) -> cont 36#;
-	PT _ (TS _ 37) -> cont 37#;
-	PT _ (TS _ 38) -> cont 38#;
-	PT _ (TS _ 39) -> cont 39#;
-	PT _ (TS _ 40) -> cont 40#;
-	PT _ (TS _ 41) -> cont 41#;
-	PT _ (TS _ 42) -> cont 42#;
-	PT _ (TS _ 43) -> cont 43#;
-	PT _ (TS _ 44) -> cont 44#;
-	PT _ (TS _ 45) -> cont 45#;
-	PT _ (TS _ 46) -> cont 46#;
-	PT _ (TS _ 47) -> cont 47#;
-	PT _ (TS _ 48) -> cont 48#;
-	PT _ (TS _ 49) -> cont 49#;
-	PT _ (TS _ 50) -> cont 50#;
-	PT _ (TS _ 51) -> cont 51#;
-	PT _ (TS _ 52) -> cont 52#;
-	PT _ (TS _ 53) -> cont 53#;
-	PT _ (TS _ 54) -> cont 54#;
-	PT _ (TS _ 55) -> cont 55#;
-	PT _ (TS _ 56) -> cont 56#;
-	PT _ (TS _ 57) -> cont 57#;
-	PT _ (TS _ 58) -> cont 58#;
-	PT _ (TS _ 59) -> cont 59#;
-	PT _ (TS _ 60) -> cont 60#;
-	PT _ (TS _ 61) -> cont 61#;
-	PT _ (TS _ 62) -> cont 62#;
-	PT _ (TS _ 63) -> cont 63#;
-	PT _ (TS _ 64) -> cont 64#;
-	PT _ (TS _ 65) -> cont 65#;
-	PT _ (TS _ 66) -> cont 66#;
-	PT _ (TS _ 67) -> cont 67#;
-	PT _ (T_PosInteger _) -> cont 68#;
-	PT _ (T_PosDouble _) -> cont 69#;
-	PT _ (T_PosReal _) -> cont 70#;
-	PT _ (T_PosString _) -> cont 71#;
-	PT _ (T_PosIdent _) -> cont 72#;
-	PT _ (T_PosLineComment _) -> cont 73#;
-	PT _ (T_PosBlockComment _) -> cont 74#;
-	PT _ (T_PosAlloy _) -> cont 75#;
-	PT _ (T_PosChoco _) -> cont 76#;
-	_ -> happyError' (tk:tks)
-	}
-
-happyError_ 77# tk tks = happyError' tks
-happyError_ _ tk tks = happyError' (tk:tks)
-
-happyThen :: () => Err a -> (a -> Err b) -> Err b
-happyThen = (thenM)
-happyReturn :: () => a -> Err a
-happyReturn = (returnM)
-happyThen1 m k tks = (thenM) m (\a -> k a tks)
-happyReturn1 :: () => a -> b -> Err a
-happyReturn1 = \a tks -> (returnM) a
-happyError' :: () => [(Token)] -> Err a
-happyError' = happyError
-
-pModule tks = happySomeParser where
-  happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut17 x))
-
-pClafer tks = happySomeParser where
-  happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut19 x))
-
-pConstraint tks = happySomeParser where
-  happySomeParser = happyThen (happyParse 2# tks) (\x -> happyReturn (happyOut20 x))
-
-pAssertion tks = happySomeParser where
-  happySomeParser = happyThen (happyParse 3# tks) (\x -> happyReturn (happyOut21 x))
-
-pGoal tks = happySomeParser where
-  happySomeParser = happyThen (happyParse 4# tks) (\x -> happyReturn (happyOut22 x))
-
-happySeq = happyDontSeq
-
-
-returnM :: a -> Err a
-returnM = return
-
-thenM :: Err a -> (a -> Err b) -> Err b
-thenM = (>>=)
-
-happyError :: [Token] -> Err a
-happyError ts =
-  Bad (pp ts) $ "syntax error at " ++ tokenPos ts ++ 
-  case ts of
-    [] -> []
-    [Err _] -> " due to lexer error"
-    _ -> " before " ++ unwords (map (id . prToken) (take 4 ts))
-
-myLexer = tokens
-
-gp x@(PT (Pn _ l c) _) = Span (Pos (toInteger l) (toInteger c)) (Pos (toInteger l) (toInteger c + toInteger (length $ prToken x)))
-pp (PT (Pn _ l c) _ :_) = Pos (toInteger l) (toInteger c)
-pp (Err (Pn _ l c) :_) = Pos (toInteger l) (toInteger c)
-pp _ = error "EOF"
-
-mkCatSpan :: (Spannable c) => c -> Span
-mkCatSpan = getSpan
-
-mkTokenSpan :: Token -> Span
-mkTokenSpan = gp
-{-# LINE 1 "templates\GenericTemplate.hs" #-}
-{-# LINE 1 "templates\\GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
-{-# LINE 1 "<command-line>" #-}
-{-# LINE 12 "<command-line>" #-}
-{-# LINE 1 "C:\\Users\\mantkiew\\AppData\\Local\\Programs\\stack\\x86_64-windows\\ghc-7.10.3\\lib/include\\ghcversion.h" #-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{-# LINE 12 "<command-line>" #-}
-{-# LINE 1 "templates\\GenericTemplate.hs" #-}
--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
-
-{-# LINE 13 "templates\\GenericTemplate.hs" #-}
-
-
-
-
-
--- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
-#if __GLASGOW_HASKELL__ > 706
-#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)
-#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)
-#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)
-#else
-#define LT(n,m) (n Happy_GHC_Exts.<# m)
-#define GTE(n,m) (n Happy_GHC_Exts.>=# m)
-#define EQ(n,m) (n Happy_GHC_Exts.==# m)
-#endif
-{-# LINE 46 "templates\\GenericTemplate.hs" #-}
-
-
-data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
-
-
-
-
-
-{-# LINE 67 "templates\\GenericTemplate.hs" #-}
-
-{-# LINE 77 "templates\\GenericTemplate.hs" #-}
-
-{-# LINE 86 "templates\\GenericTemplate.hs" #-}
-
-infixr 9 `HappyStk`
-data HappyStk a = HappyStk a (HappyStk a)
-
------------------------------------------------------------------------------
--- starting the parse
-
-happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
-
------------------------------------------------------------------------------
--- Accepting the parse
-
--- If the current token is 0#, it means we've just accepted a partial
--- parse (a %partial parser).  We must ignore the saved token on the top of
--- the stack in this case.
-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
-        happyReturn1 ans
-happyAccept j tk st sts (HappyStk ans _) = 
-        (happyTcHack j (happyTcHack st)) (happyReturn1 ans)
-
------------------------------------------------------------------------------
--- Arrays only: do the next action
-
-
-
-happyDoAction i tk st
-        = {- nothing -}
-
-
-          case action of
-                0#           -> {- nothing -}
-                                     happyFail i tk st
-                -1#          -> {- nothing -}
-                                     happyAccept i tk st
-                n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
-
-                                                   (happyReduceArr Happy_Data_Array.! rule) i tk st
-                                                   where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
-                n                 -> {- nothing -}
-
-
-                                     happyShift new_state i tk st
-                                     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
-   where off    = indexShortOffAddr happyActOffsets st
-         off_i  = (off Happy_GHC_Exts.+# i)
-         check  = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))
-                  then EQ(indexShortOffAddr happyCheck off_i, i)
-                  else False
-         action
-          | check     = indexShortOffAddr happyTable off_i
-          | otherwise = indexShortOffAddr happyDefActions st
-
-
-indexShortOffAddr (HappyA# arr) off =
-        Happy_GHC_Exts.narrow16Int# i
-  where
-        i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
-        high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
-        low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))
-        off' = off Happy_GHC_Exts.*# 2#
-
-
-
-
-
-data HappyAddr = HappyA# Happy_GHC_Exts.Addr#
-
-
-
-
------------------------------------------------------------------------------
--- HappyState data type (not arrays)
-
-{-# LINE 170 "templates\\GenericTemplate.hs" #-}
-
------------------------------------------------------------------------------
--- Shifting a token
-
-happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
---     trace "shifting the error token" $
-     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
-
-happyShift new_state i tk st sts stk =
-     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
-
--- happyReduce is specialised for the common cases.
-
-happySpecReduce_0 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_0 nt fn j tk st@((action)) sts stk
-     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
-
-happySpecReduce_1 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
-     = let r = fn v1 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_2 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
-     = let r = fn v1 v2 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_3 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
-     = let r = fn v1 v2 v3 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happyReduce k i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyReduce k nt fn j tk st sts stk
-     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of
-         sts1@((HappyCons (st1@(action)) (_))) ->
-                let r = fn stk in  -- it doesn't hurt to always seq here...
-                happyDoSeq r (happyGoto nt j tk st1 sts1 r)
-
-happyMonadReduce k nt fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyMonadReduce k nt fn j tk st sts stk =
-      case happyDrop k (HappyCons (st) (sts)) of
-        sts1@((HappyCons (st1@(action)) (_))) ->
-          let drop_stk = happyDropStk k stk in
-          happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
-
-happyMonad2Reduce k nt fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyMonad2Reduce k nt fn j tk st sts stk =
-      case happyDrop k (HappyCons (st) (sts)) of
-        sts1@((HappyCons (st1@(action)) (_))) ->
-         let drop_stk = happyDropStk k stk
-
-             off = indexShortOffAddr happyGotoOffsets st1
-             off_i = (off Happy_GHC_Exts.+# nt)
-             new_state = indexShortOffAddr happyTable off_i
-
-
-
-          in
-          happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
-
-happyDrop 0# l = l
-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
-
-happyDropStk 0# l = l
-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs
-
------------------------------------------------------------------------------
--- Moving to a new state after a reduction
-
-
-happyGoto nt j tk st = 
-   {- nothing -}
-   happyDoAction j tk new_state
-   where off = indexShortOffAddr happyGotoOffsets st
-         off_i = (off Happy_GHC_Exts.+# nt)
-         new_state = indexShortOffAddr happyTable off_i
-
-
-
-
------------------------------------------------------------------------------
--- Error recovery (0# is the error token)
-
--- parse error if we are in recovery and we fail again
-happyFail 0# tk old_st _ stk@(x `HappyStk` _) =
-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
---      trace "failing" $ 
-        happyError_ i tk
-
-{-  We don't need state discarding for our restricted implementation of
-    "error".  In fact, it can cause some bogus parses, so I've disabled it
-    for now --SDM
-
--- discard a state
-happyFail  0# tk old_st (HappyCons ((action)) (sts)) 
-                                                (saved_tok `HappyStk` _ `HappyStk` stk) =
---      trace ("discarding state, depth " ++ show (length stk))  $
-        happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
--}
-
--- Enter error recovery: generate an error token,
---                       save the old token and carry on.
-happyFail  i tk (action) sts stk =
---      trace "entering error recovery" $
-        happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
-
--- Internal happy errors:
-
-notHappyAtAll :: a
-notHappyAtAll = error "Internal Happy error\n"
-
------------------------------------------------------------------------------
--- Hack to get the typechecker to accept our action functions
-
-
-happyTcHack :: Happy_GHC_Exts.Int# -> a -> a
-happyTcHack x y = y
-{-# INLINE happyTcHack #-}
-
-
------------------------------------------------------------------------------
--- Seq-ing.  If the --strict flag is given, then Happy emits 
---      happySeq = happyDoSeq
--- otherwise it emits
---      happySeq = happyDontSeq
-
-happyDoSeq, happyDontSeq :: a -> b -> b
-happyDoSeq   a b = a `seq` b
-happyDontSeq a b = b
-
------------------------------------------------------------------------------
--- Don't inline any functions from the template.  GHC has a nasty habit
--- of deciding to inline happyGoto everywhere, which increases the size of
--- the generated parser quite a bit.
-
-
-{-# NOINLINE happyDoAction #-}
-{-# NOINLINE happyTable #-}
-{-# NOINLINE happyCheck #-}
-{-# NOINLINE happyActOffsets #-}
-{-# NOINLINE happyGotoOffsets #-}
-{-# NOINLINE happyDefActions #-}
-
-{-# NOINLINE happyShift #-}
-{-# NOINLINE happySpecReduce_0 #-}
-{-# NOINLINE happySpecReduce_1 #-}
-{-# NOINLINE happySpecReduce_2 #-}
-{-# NOINLINE happySpecReduce_3 #-}
-{-# NOINLINE happyReduce #-}
-{-# NOINLINE happyMonadReduce #-}
-{-# NOINLINE happyGoto #-}
-{-# NOINLINE happyFail #-}
-
--- end of Happy Template.
+{-# OPTIONS_GHC -w #-}
+{-# OPTIONS -fglasgow-exts -cpp #-}
+{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
+module Language.Clafer.Front.ParClafer where
+import Language.Clafer.Front.AbsClafer
+import Language.Clafer.Front.LexClafer
+import Language.Clafer.Front.ErrM
+import qualified Data.Array as Happy_Data_Array
+import qualified GHC.Exts as Happy_GHC_Exts
+import Control.Applicative(Applicative(..))
+import Control.Monad (ap)
+
+-- parser produced by Happy Version 1.19.5
+
+newtype HappyAbsSyn  = HappyAbsSyn HappyAny
+#if __GLASGOW_HASKELL__ >= 607
+type HappyAny = Happy_GHC_Exts.Any
+#else
+type HappyAny = forall a . a
+#endif
+happyIn8 :: (PosInteger) -> (HappyAbsSyn )
+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn8 #-}
+happyOut8 :: (HappyAbsSyn ) -> (PosInteger)
+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut8 #-}
+happyIn9 :: (PosDouble) -> (HappyAbsSyn )
+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn9 #-}
+happyOut9 :: (HappyAbsSyn ) -> (PosDouble)
+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut9 #-}
+happyIn10 :: (PosReal) -> (HappyAbsSyn )
+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn10 #-}
+happyOut10 :: (HappyAbsSyn ) -> (PosReal)
+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut10 #-}
+happyIn11 :: (PosString) -> (HappyAbsSyn )
+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn11 #-}
+happyOut11 :: (HappyAbsSyn ) -> (PosString)
+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut11 #-}
+happyIn12 :: (PosIdent) -> (HappyAbsSyn )
+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn12 #-}
+happyOut12 :: (HappyAbsSyn ) -> (PosIdent)
+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut12 #-}
+happyIn13 :: (PosLineComment) -> (HappyAbsSyn )
+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn13 #-}
+happyOut13 :: (HappyAbsSyn ) -> (PosLineComment)
+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut13 #-}
+happyIn14 :: (PosBlockComment) -> (HappyAbsSyn )
+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn14 #-}
+happyOut14 :: (HappyAbsSyn ) -> (PosBlockComment)
+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut14 #-}
+happyIn15 :: (PosAlloy) -> (HappyAbsSyn )
+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn15 #-}
+happyOut15 :: (HappyAbsSyn ) -> (PosAlloy)
+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut15 #-}
+happyIn16 :: (PosChoco) -> (HappyAbsSyn )
+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn16 #-}
+happyOut16 :: (HappyAbsSyn ) -> (PosChoco)
+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut16 #-}
+happyIn17 :: (Module) -> (HappyAbsSyn )
+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn17 #-}
+happyOut17 :: (HappyAbsSyn ) -> (Module)
+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut17 #-}
+happyIn18 :: (Declaration) -> (HappyAbsSyn )
+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn18 #-}
+happyOut18 :: (HappyAbsSyn ) -> (Declaration)
+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut18 #-}
+happyIn19 :: (Clafer) -> (HappyAbsSyn )
+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn19 #-}
+happyOut19 :: (HappyAbsSyn ) -> (Clafer)
+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut19 #-}
+happyIn20 :: (Constraint) -> (HappyAbsSyn )
+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn20 #-}
+happyOut20 :: (HappyAbsSyn ) -> (Constraint)
+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut20 #-}
+happyIn21 :: (Assertion) -> (HappyAbsSyn )
+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn21 #-}
+happyOut21 :: (HappyAbsSyn ) -> (Assertion)
+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut21 #-}
+happyIn22 :: (Goal) -> (HappyAbsSyn )
+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn22 #-}
+happyOut22 :: (HappyAbsSyn ) -> (Goal)
+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut22 #-}
+happyIn23 :: (Abstract) -> (HappyAbsSyn )
+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn23 #-}
+happyOut23 :: (HappyAbsSyn ) -> (Abstract)
+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut23 #-}
+happyIn24 :: (Elements) -> (HappyAbsSyn )
+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn24 #-}
+happyOut24 :: (HappyAbsSyn ) -> (Elements)
+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut24 #-}
+happyIn25 :: (Element) -> (HappyAbsSyn )
+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn25 #-}
+happyOut25 :: (HappyAbsSyn ) -> (Element)
+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut25 #-}
+happyIn26 :: (Super) -> (HappyAbsSyn )
+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn26 #-}
+happyOut26 :: (HappyAbsSyn ) -> (Super)
+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut26 #-}
+happyIn27 :: (Reference) -> (HappyAbsSyn )
+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn27 #-}
+happyOut27 :: (HappyAbsSyn ) -> (Reference)
+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut27 #-}
+happyIn28 :: (Init) -> (HappyAbsSyn )
+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn28 #-}
+happyOut28 :: (HappyAbsSyn ) -> (Init)
+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut28 #-}
+happyIn29 :: (InitHow) -> (HappyAbsSyn )
+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn29 #-}
+happyOut29 :: (HappyAbsSyn ) -> (InitHow)
+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut29 #-}
+happyIn30 :: (GCard) -> (HappyAbsSyn )
+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn30 #-}
+happyOut30 :: (HappyAbsSyn ) -> (GCard)
+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut30 #-}
+happyIn31 :: (Card) -> (HappyAbsSyn )
+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn31 #-}
+happyOut31 :: (HappyAbsSyn ) -> (Card)
+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut31 #-}
+happyIn32 :: (NCard) -> (HappyAbsSyn )
+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn32 #-}
+happyOut32 :: (HappyAbsSyn ) -> (NCard)
+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut32 #-}
+happyIn33 :: (ExInteger) -> (HappyAbsSyn )
+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn33 #-}
+happyOut33 :: (HappyAbsSyn ) -> (ExInteger)
+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut33 #-}
+happyIn34 :: (Name) -> (HappyAbsSyn )
+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn34 #-}
+happyOut34 :: (HappyAbsSyn ) -> (Name)
+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut34 #-}
+happyIn35 :: (Exp) -> (HappyAbsSyn )
+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn35 #-}
+happyOut35 :: (HappyAbsSyn ) -> (Exp)
+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut35 #-}
+happyIn36 :: (Exp) -> (HappyAbsSyn )
+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn36 #-}
+happyOut36 :: (HappyAbsSyn ) -> (Exp)
+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut36 #-}
+happyIn37 :: (Exp) -> (HappyAbsSyn )
+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn37 #-}
+happyOut37 :: (HappyAbsSyn ) -> (Exp)
+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut37 #-}
+happyIn38 :: (Exp) -> (HappyAbsSyn )
+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn38 #-}
+happyOut38 :: (HappyAbsSyn ) -> (Exp)
+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut38 #-}
+happyIn39 :: (Exp) -> (HappyAbsSyn )
+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn39 #-}
+happyOut39 :: (HappyAbsSyn ) -> (Exp)
+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut39 #-}
+happyIn40 :: (Exp) -> (HappyAbsSyn )
+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn40 #-}
+happyOut40 :: (HappyAbsSyn ) -> (Exp)
+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut40 #-}
+happyIn41 :: (Exp) -> (HappyAbsSyn )
+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn41 #-}
+happyOut41 :: (HappyAbsSyn ) -> (Exp)
+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut41 #-}
+happyIn42 :: (Exp) -> (HappyAbsSyn )
+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn42 #-}
+happyOut42 :: (HappyAbsSyn ) -> (Exp)
+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut42 #-}
+happyIn43 :: (Exp) -> (HappyAbsSyn )
+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn43 #-}
+happyOut43 :: (HappyAbsSyn ) -> (Exp)
+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut43 #-}
+happyIn44 :: (Exp) -> (HappyAbsSyn )
+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn44 #-}
+happyOut44 :: (HappyAbsSyn ) -> (Exp)
+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut44 #-}
+happyIn45 :: (Exp) -> (HappyAbsSyn )
+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn45 #-}
+happyOut45 :: (HappyAbsSyn ) -> (Exp)
+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut45 #-}
+happyIn46 :: (Exp) -> (HappyAbsSyn )
+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn46 #-}
+happyOut46 :: (HappyAbsSyn ) -> (Exp)
+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut46 #-}
+happyIn47 :: (Exp) -> (HappyAbsSyn )
+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn47 #-}
+happyOut47 :: (HappyAbsSyn ) -> (Exp)
+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut47 #-}
+happyIn48 :: (Exp) -> (HappyAbsSyn )
+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn48 #-}
+happyOut48 :: (HappyAbsSyn ) -> (Exp)
+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut48 #-}
+happyIn49 :: (Exp) -> (HappyAbsSyn )
+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn49 #-}
+happyOut49 :: (HappyAbsSyn ) -> (Exp)
+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut49 #-}
+happyIn50 :: (Exp) -> (HappyAbsSyn )
+happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn50 #-}
+happyOut50 :: (HappyAbsSyn ) -> (Exp)
+happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut50 #-}
+happyIn51 :: (Exp) -> (HappyAbsSyn )
+happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn51 #-}
+happyOut51 :: (HappyAbsSyn ) -> (Exp)
+happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut51 #-}
+happyIn52 :: (Exp) -> (HappyAbsSyn )
+happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn52 #-}
+happyOut52 :: (HappyAbsSyn ) -> (Exp)
+happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut52 #-}
+happyIn53 :: (Exp) -> (HappyAbsSyn )
+happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn53 #-}
+happyOut53 :: (HappyAbsSyn ) -> (Exp)
+happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut53 #-}
+happyIn54 :: (Decl) -> (HappyAbsSyn )
+happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn54 #-}
+happyOut54 :: (HappyAbsSyn ) -> (Decl)
+happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut54 #-}
+happyIn55 :: (Quant) -> (HappyAbsSyn )
+happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn55 #-}
+happyOut55 :: (HappyAbsSyn ) -> (Quant)
+happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut55 #-}
+happyIn56 :: (EnumId) -> (HappyAbsSyn )
+happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn56 #-}
+happyOut56 :: (HappyAbsSyn ) -> (EnumId)
+happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut56 #-}
+happyIn57 :: (ModId) -> (HappyAbsSyn )
+happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn57 #-}
+happyOut57 :: (HappyAbsSyn ) -> (ModId)
+happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut57 #-}
+happyIn58 :: (LocId) -> (HappyAbsSyn )
+happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn58 #-}
+happyOut58 :: (HappyAbsSyn ) -> (LocId)
+happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut58 #-}
+happyIn59 :: ([Declaration]) -> (HappyAbsSyn )
+happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn59 #-}
+happyOut59 :: (HappyAbsSyn ) -> ([Declaration])
+happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut59 #-}
+happyIn60 :: ([EnumId]) -> (HappyAbsSyn )
+happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn60 #-}
+happyOut60 :: (HappyAbsSyn ) -> ([EnumId])
+happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut60 #-}
+happyIn61 :: ([Element]) -> (HappyAbsSyn )
+happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn61 #-}
+happyOut61 :: (HappyAbsSyn ) -> ([Element])
+happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut61 #-}
+happyIn62 :: ([Exp]) -> (HappyAbsSyn )
+happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn62 #-}
+happyOut62 :: (HappyAbsSyn ) -> ([Exp])
+happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut62 #-}
+happyIn63 :: ([LocId]) -> (HappyAbsSyn )
+happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn63 #-}
+happyOut63 :: (HappyAbsSyn ) -> ([LocId])
+happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut63 #-}
+happyIn64 :: ([ModId]) -> (HappyAbsSyn )
+happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn64 #-}
+happyOut64 :: (HappyAbsSyn ) -> ([ModId])
+happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut64 #-}
+happyIn65 :: (Exp) -> (HappyAbsSyn )
+happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn65 #-}
+happyOut65 :: (HappyAbsSyn ) -> (Exp)
+happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut65 #-}
+happyInTok :: (Token) -> (HappyAbsSyn )
+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyInTok #-}
+happyOutTok :: (HappyAbsSyn ) -> (Token)
+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOutTok #-}
+
+
+happyActOffsets :: HappyAddr
+happyActOffsets = HappyA# "\x00\x00\x10\x01\x15\x01\x09\x01\x13\x01\xf0\x00\x00\x00\xe2\x00\x95\x00\xe2\x00\x02\x01\xda\x00\x00\x00\xda\x00\xa0\x00\x00\x00\xda\x00\xac\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x00\xe1\x00\x0f\x01\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x00\xb2\x00\x6a\x00\x22\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\x01\xd9\x00\xdf\x00\x14\x01\x00\x00\xc2\x05\x00\x00\x61\x00\x09\x00\x00\x00\x00\x00\xff\x00\x01\x01\xc4\x00\x03\x01\x0b\x00\xfe\x00\x00\x00\x66\x01\xea\x00\x00\x00\x00\x00\xcf\x00\x1d\x00\x42\x01\x1d\x00\x00\x00\xde\xff\x42\x01\x00\x00\x3c\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x00\xfd\xff\xef\x00\xfc\xff\xfb\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\xab\x00\x1d\x00\xe4\x00\xe4\x00\x00\x00\x00\x00\x11\x00\x00\x00\xc2\x00\xdc\x00\xde\x00\xb4\x00\xd6\x00\x04\x00\xd6\x00\xc2\x05\x3c\x00\xad\x00\xfe\xff\x00\x00\xb1\x00\xa9\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x50\x01\x50\x01\x50\x01\x50\x01\x50\x01\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xbd\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x00\xac\x00\xe0\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x9e\x00\xd2\x00\xd2\x00\x0b\x00\xaf\x00\xaf\x00\x00\x00\x96\x00\x42\x01\x00\x00\x00\x00\x75\x00\x1d\x00\x8b\x00\x42\x01\x42\x01\x92\x00\xfc\xff\x1d\x00\x1d\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\xf0\xff\x6c\x00\x9e\x00\x9e\x00\x38\x00\xed\xff\x81\x00\x00\x00\x9e\x00\x42\x01\x81\x00\x42\x01\x00\x00\x81\x00\x81\x00\x42\x01\x56\x00\x42\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x7f\x00\x00\x00"#
+
+happyGotoOffsets :: HappyAddr
+happyGotoOffsets = HappyA# "\xf8\xff\x13\x00\x85\x00\x80\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x7c\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x7a\x00\x00\x00\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x03\x53\x00\x51\x00\x45\x00\x3a\x00\x1b\x00\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x05\x00\x00\x00\x00\x00\x00\x70\x04\x1c\x07\x29\x03\xfd\x06\x00\x00\x71\x00\xf7\x02\x00\x00\xb6\x06\x97\x06\x00\x00\x00\x00\x00\x00\xe9\x06\x00\x00\xca\x06\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x03\x00\x00\x00\x6e\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x08\x00\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x06\x0a\x00\x00\x00\x00\x00\x00\x00\x29\x00\x08\x08\xfc\x07\xc9\x07\xc3\x07\xbb\x07\xa7\x07\x88\x07\x30\x07\x64\x06\x50\x06\x31\x06\x1d\x06\xeb\x05\xa4\x05\x89\x05\x57\x05\x3c\x05\x0a\x05\xef\x04\xbd\x04\x00\x00\x55\x04\x23\x04\xf1\x03\xbf\x03\x8d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\x00\x00\x00\x00\x74\x07\x93\x00\x93\x02\x61\x02\x00\x00\x5c\x00\x6b\x07\x39\x07\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\xfa\x01\x79\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x02\x00\x00\xfd\x01\x00\x00\x00\x00\x00\x00\xcb\x01\x18\x00\x99\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyDefActions :: HappyAddr
+happyDefActions = HappyA# "\x7d\xff\xe7\xff\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\xff\x00\x00\xd5\xff\xe6\xff\x00\x00\xe7\xff\x7c\xff\xe3\xff\xe1\xff\xdf\xff\xe0\xff\xef\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xff\xd2\xff\xd1\xff\xd3\xff\xd4\xff\x00\x00\x77\xff\x77\xff\x77\xff\x77\xff\x77\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\xff\x8a\xff\x89\xff\x88\xff\x7f\xff\x8c\xff\x76\xff\x71\xff\xbd\xff\xbb\xff\xb9\xff\xb7\xff\xb5\xff\xac\xff\xaa\xff\xa7\xff\xa3\xff\xa0\xff\x9b\xff\x99\xff\x97\xff\x94\xff\x92\xff\x8f\xff\x8d\xff\x00\x00\x73\xff\xc6\xff\xbf\xff\x00\x00\x00\x00\x00\x00\x00\x00\xed\xff\x00\x00\x00\x00\x83\xff\x00\x00\x00\x00\x85\xff\x84\xff\x82\xff\x00\x00\x81\xff\x00\x00\xf9\xff\xf8\xff\xf7\xff\xf6\xff\xde\xff\x00\x00\x00\x00\xcf\xff\xcb\xff\xe5\xff\xca\xff\xcc\xff\xcd\xff\xce\xff\x00\x00\xc7\xff\xc9\xff\xc8\xff\xdc\xff\x00\x00\x9f\xff\x9e\xff\xa1\xff\xa2\xff\x00\x00\x7e\xff\x00\x00\x75\xff\x00\x00\x00\x00\x9c\xff\x00\x00\x9d\xff\xb6\xff\x00\x00\x00\x00\x7f\xff\xab\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\xff\xea\xff\xe8\xff\xeb\xff\xe9\xff\xc0\xff\xbe\xff\xbc\xff\xba\xff\xb8\xff\x00\x00\xae\xff\xb0\xff\xb3\xff\xb2\xff\xb1\xff\xb4\xff\xaf\xff\xa8\xff\xa9\xff\xa5\xff\xa6\xff\xa4\xff\x9a\xff\x98\xff\x95\xff\x96\xff\x93\xff\x91\xff\x90\xff\x8e\xff\x00\x00\x00\x00\x72\xff\x87\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xff\xcf\xff\x00\x00\x00\x00\x80\xff\x7b\xff\xf0\xff\xe2\xff\x79\xff\xe7\xff\x00\x00\xda\xff\xdb\xff\xd9\xff\x00\x00\xc4\xff\x74\xff\x86\xff\x00\x00\xc2\xff\x00\x00\xad\xff\xc3\xff\xc5\xff\x00\x00\xe5\xff\x00\x00\xd6\xff\xd7\xff\x7a\xff\x78\xff\xe4\xff\xd8\xff\xee\xff\xc1\xff"#
+
+happyCheck :: HappyAddr
+happyCheck = HappyA# "\xff\xff\x09\x00\x01\x00\x00\x00\x03\x00\x09\x00\x09\x00\x0b\x00\x07\x00\x2b\x00\x1d\x00\x1b\x00\x08\x00\x04\x00\x04\x00\x0e\x00\x05\x00\x35\x00\x09\x00\x15\x00\x24\x00\x0a\x00\x18\x00\x27\x00\x28\x00\x2c\x00\x2a\x00\x13\x00\x19\x00\x14\x00\x0b\x00\x23\x00\x04\x00\x1d\x00\x0f\x00\x01\x00\x07\x00\x03\x00\x48\x00\x26\x00\x10\x00\x07\x00\x29\x00\x33\x00\x12\x00\x04\x00\x1d\x00\x2e\x00\x0e\x00\x30\x00\x31\x00\x43\x00\x33\x00\x10\x00\x1a\x00\x36\x00\x37\x00\x38\x00\x04\x00\x31\x00\x3b\x00\x3c\x00\x3d\x00\x03\x00\x44\x00\x44\x00\x38\x00\x07\x00\x22\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x0e\x00\x29\x00\x04\x00\x31\x00\x16\x00\x3e\x00\x2e\x00\x36\x00\x30\x00\x31\x00\x38\x00\x33\x00\x1e\x00\x2e\x00\x36\x00\x37\x00\x38\x00\x32\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x37\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x0b\x00\x03\x00\x00\x00\x0e\x00\x36\x00\x07\x00\x0e\x00\x17\x00\x18\x00\x04\x00\x2e\x00\x3b\x00\x0e\x00\x3d\x00\x32\x00\x36\x00\x00\x00\x04\x00\x04\x00\x37\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x17\x00\x18\x00\x36\x00\x01\x00\x36\x00\x03\x00\x36\x00\x22\x00\x0d\x00\x07\x00\x14\x00\x15\x00\x0c\x00\x16\x00\x29\x00\x18\x00\x0e\x00\x40\x00\x04\x00\x2e\x00\x41\x00\x30\x00\x31\x00\x1d\x00\x33\x00\x1d\x00\x2e\x00\x36\x00\x37\x00\x38\x00\x32\x00\x12\x00\x3b\x00\x3c\x00\x3d\x00\x37\x00\x30\x00\x0c\x00\x0d\x00\x04\x00\x34\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x48\x00\x03\x00\x41\x00\x30\x00\x31\x00\x07\x00\x33\x00\x10\x00\x11\x00\x36\x00\x37\x00\x38\x00\x0e\x00\x12\x00\x3b\x00\x3c\x00\x3d\x00\x32\x00\x31\x00\x32\x00\x33\x00\x34\x00\x37\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x0c\x00\x0d\x00\x03\x00\x48\x00\x22\x00\x35\x00\x07\x00\x41\x00\x30\x00\x39\x00\x3a\x00\x29\x00\x34\x00\x0e\x00\x17\x00\x3f\x00\x2e\x00\x0f\x00\x30\x00\x31\x00\x44\x00\x33\x00\x06\x00\x42\x00\x36\x00\x37\x00\x38\x00\x3f\x00\x2f\x00\x3b\x00\x3c\x00\x3d\x00\x1a\x00\x48\x00\x41\x00\x15\x00\x18\x00\x48\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x48\x00\x03\x00\x1a\x00\x30\x00\x31\x00\x07\x00\x33\x00\x41\x00\x48\x00\x36\x00\x37\x00\x38\x00\x0e\x00\x40\x00\x3b\x00\x3c\x00\x3d\x00\x1e\x00\x13\x00\x25\x00\x12\x00\x15\x00\x0f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x17\x00\x1a\x00\x06\x00\x42\x00\x22\x00\x1d\x00\x3f\x00\x01\x00\x48\x00\x03\x00\x13\x00\x29\x00\x1f\x00\x07\x00\x24\x00\x4d\x00\x2e\x00\x48\x00\x30\x00\x31\x00\x0e\x00\x33\x00\x1b\x00\x4d\x00\x36\x00\x37\x00\x38\x00\x2a\x00\x44\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x26\x00\x03\x00\xff\xff\x29\x00\xff\xff\x07\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x0e\x00\x33\x00\xff\xff\x03\x00\x36\x00\x37\x00\x38\x00\x07\x00\xff\xff\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\x0e\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x03\x00\xff\xff\x29\x00\xff\xff\x07\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x0e\x00\x33\x00\xff\xff\xff\xff\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1b\x00\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x24\x00\x38\x00\x39\x00\x27\x00\x28\x00\xff\xff\x2a\x00\xff\xff\xff\xff\x2d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\xff\xff\x11\x00\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x4d\x00\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\xff\xff\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x02\x00\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x19\x00\x38\x00\xff\xff\x1c\x00\xff\xff\x1e\x00\xff\xff\x20\x00\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x1a\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x1a\x00\xff\xff\x31\x00\x32\x00\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\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\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\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\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\xff\xff\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\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\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\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\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x1a\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x38\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x38\x00\xff\xff\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x38\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\x38\x00\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x1a\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x1a\x00\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\x38\x00\x31\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x38\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x38\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x38\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x10\x00\x4a\x00\x68\x00\x4b\x00\x65\x00\x6b\x00\x66\x00\x4c\x00\x77\x00\x9b\x00\x09\x00\xbe\x00\x8a\x00\x30\x00\x4d\x00\x83\x00\xcc\x00\x8b\x00\x7e\xff\x0d\x00\x84\x00\x7e\xff\x19\x00\x10\x00\xdc\x00\x0b\x00\xc4\x00\x69\x00\x8c\x00\x0d\x00\x67\x00\x30\x00\x9b\x00\x0e\x00\x4a\x00\x4c\x00\x4b\x00\x5d\x00\x9c\x00\xe4\x00\x4c\x00\x4f\x00\x11\x00\x6b\x00\x72\x00\x9b\x00\x50\x00\x4d\x00\x51\x00\x52\x00\xe3\x00\x53\x00\xca\x00\x60\x00\x54\x00\x55\x00\x56\x00\x5d\x00\x46\x00\x57\x00\x58\x00\x59\x00\x4b\x00\x07\x00\x07\x00\xbc\x00\x4c\x00\x9d\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4d\x00\x4f\x00\x72\x00\x46\x00\xdf\x00\xc3\x00\x50\x00\x27\x00\x51\x00\x52\x00\x47\x00\x53\x00\xe0\x00\xba\x00\x54\x00\x55\x00\x56\x00\x74\x00\x61\x00\x57\x00\x58\x00\x59\x00\x75\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4a\x00\x8d\x00\x4b\x00\x61\x00\x8e\x00\x28\x00\x4c\x00\x07\x00\xd0\x00\x63\x00\x72\x00\xbe\x00\x57\x00\x4d\x00\x59\x00\x74\x00\x29\x00\x1a\x00\xc7\x00\x5f\x00\x75\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x62\x00\x63\x00\x2a\x00\x4a\x00\x2b\x00\x4b\x00\x21\x00\x9e\x00\x09\x00\x4c\x00\xdc\x00\xdd\x00\x0b\x00\x1b\x00\x4f\x00\x1c\x00\x4d\x00\xcc\x00\x72\x00\x50\x00\xce\x00\x51\x00\x52\x00\x9b\x00\x53\x00\x9b\x00\x73\x00\x54\x00\x55\x00\x56\x00\x74\x00\x82\x00\x57\x00\x58\x00\x59\x00\x75\x00\xc8\x00\x86\x00\x87\x00\xc7\x00\xe0\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4a\x00\x5d\x00\x4b\x00\xd6\x00\x51\x00\x52\x00\x4c\x00\x53\x00\xc6\x00\xc7\x00\x54\x00\x55\x00\x56\x00\x4d\x00\x82\x00\x57\x00\x58\x00\x59\x00\x74\x00\x24\x00\x25\x00\x26\x00\x27\x00\xd3\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x86\x00\x87\x00\x4b\x00\x5d\x00\x9f\x00\x1e\x00\x4c\x00\xd8\x00\xc8\x00\x1f\x00\x20\x00\x4f\x00\xc9\x00\x4d\x00\x88\x00\x21\x00\x50\x00\x85\x00\x51\x00\x52\x00\x07\x00\x53\x00\x97\x00\x99\x00\x54\x00\x55\x00\x56\x00\x98\x00\xa6\x00\x57\x00\x58\x00\x59\x00\x89\x00\x5d\x00\xbc\x00\xc0\x00\xc1\x00\x5d\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4a\x00\x5d\x00\x4b\x00\x89\x00\x51\x00\x52\x00\x4c\x00\x53\x00\xc2\x00\x5d\x00\x54\x00\x55\x00\x56\x00\x4d\x00\xcc\x00\x57\x00\x58\x00\x59\x00\x68\x00\x5f\x00\x7d\x00\x82\x00\x6d\x00\x85\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x88\x00\x89\x00\x97\x00\x99\x00\xa0\x00\x9b\x00\x98\x00\x4a\x00\x5d\x00\x4b\x00\x5f\x00\x4f\x00\x9a\x00\x4c\x00\x23\x00\xff\xff\x50\x00\x5d\x00\x51\x00\x52\x00\x4d\x00\x53\x00\x09\x00\xff\xff\x54\x00\x55\x00\x56\x00\x0b\x00\x07\x00\x57\x00\x58\x00\x59\x00\x10\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x4a\x00\x4e\x00\x4b\x00\x00\x00\x4f\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x50\x00\x00\x00\x51\x00\x52\x00\x4d\x00\x53\x00\x00\x00\x4b\x00\x54\x00\x55\x00\x56\x00\x4c\x00\x00\x00\x57\x00\x58\x00\x59\x00\x00\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x4f\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x50\x00\x00\x00\x51\x00\x52\x00\x4d\x00\x53\x00\x00\x00\x00\x00\x54\x00\x55\x00\x56\x00\x00\x00\x00\x00\x57\x00\x58\x00\x59\x00\x00\x00\x52\x00\x00\x00\x53\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x57\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xe3\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\x09\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x0d\x00\x47\x00\x48\x00\x19\x00\x10\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x1a\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0e\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x31\x00\xe5\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\xf1\xff\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0e\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xd9\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xda\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xd1\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xd2\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\xd6\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x71\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x78\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x45\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\xa1\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\xa2\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xa4\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\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x7a\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\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xd8\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xa7\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xa9\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xab\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x8f\x00\x00\x00\xac\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x7b\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x7d\x00\x90\x00\x47\x00\x00\x00\x91\x00\x00\x00\x92\x00\x00\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x7e\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x7f\x00\x31\x00\x00\x00\x46\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x00\x47\x00\xad\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\xaf\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\xb1\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x00\x00\x6f\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x00\x00\x00\x00\x6d\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x00\x00\x00\x00\x77\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x47\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\xce\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x47\x00\x00\x00\x46\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x47\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\xd4\x00\x41\x00\x42\x00\x43\x00\x44\x00\x31\x00\x47\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x41\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x31\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x42\x00\x43\x00\x44\x00\x31\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\xb5\x00\x42\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\xb6\x00\x43\x00\x44\x00\x00\x00\x00\x00\x47\x00\x46\x00\xb7\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x47\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x47\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\xc3\x00\x44\x00\x00\x00\x00\x00\x00\x00\x46\x00\x47\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x46\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyReduceArr = Happy_Data_Array.array (5, 142) [
+	(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)
+	]
+
+happy_n_terms = 78 :: Int
+happy_n_nonterms = 58 :: Int
+
+happyReduce_5 = happySpecReduce_1  0# happyReduction_5
+happyReduction_5 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn8
+		 (PosInteger (mkPosToken happy_var_1)
+	)}
+
+happyReduce_6 = happySpecReduce_1  1# happyReduction_6
+happyReduction_6 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn9
+		 (PosDouble (mkPosToken happy_var_1)
+	)}
+
+happyReduce_7 = happySpecReduce_1  2# happyReduction_7
+happyReduction_7 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn10
+		 (PosReal (mkPosToken happy_var_1)
+	)}
+
+happyReduce_8 = happySpecReduce_1  3# happyReduction_8
+happyReduction_8 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn11
+		 (PosString (mkPosToken happy_var_1)
+	)}
+
+happyReduce_9 = happySpecReduce_1  4# happyReduction_9
+happyReduction_9 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn12
+		 (PosIdent (mkPosToken happy_var_1)
+	)}
+
+happyReduce_10 = happySpecReduce_1  5# happyReduction_10
+happyReduction_10 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn13
+		 (PosLineComment (mkPosToken happy_var_1)
+	)}
+
+happyReduce_11 = happySpecReduce_1  6# happyReduction_11
+happyReduction_11 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn14
+		 (PosBlockComment (mkPosToken happy_var_1)
+	)}
+
+happyReduce_12 = happySpecReduce_1  7# happyReduction_12
+happyReduction_12 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn15
+		 (PosAlloy (mkPosToken happy_var_1)
+	)}
+
+happyReduce_13 = happySpecReduce_1  8# happyReduction_13
+happyReduction_13 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn16
+		 (PosChoco (mkPosToken happy_var_1)
+	)}
+
+happyReduce_14 = happySpecReduce_1  9# happyReduction_14
+happyReduction_14 happy_x_1
+	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
+	happyIn17
+		 (Language.Clafer.Front.AbsClafer.Module ((mkCatSpan happy_var_1)) (reverse happy_var_1)
+	)}
+
+happyReduce_15 = happyReduce 4# 10# happyReduction_15
+happyReduction_15 (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 happyOut12 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut60 happy_x_4 of { happy_var_4 -> 
+	happyIn18
+		 (Language.Clafer.Front.AbsClafer.EnumDecl ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_16 = happySpecReduce_1  10# happyReduction_16
+happyReduction_16 happy_x_1
+	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
+	happyIn18
+		 (Language.Clafer.Front.AbsClafer.ElementDecl ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_17 = happyReduce 8# 11# happyReduction_17
+happyReduction_17 (happy_x_8 `HappyStk`
+	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 happyOut23 happy_x_1 of { happy_var_1 -> 
+	case happyOut30 happy_x_2 of { happy_var_2 -> 
+	case happyOut12 happy_x_3 of { happy_var_3 -> 
+	case happyOut26 happy_x_4 of { happy_var_4 -> 
+	case happyOut27 happy_x_5 of { happy_var_5 -> 
+	case happyOut31 happy_x_6 of { happy_var_6 -> 
+	case happyOut28 happy_x_7 of { happy_var_7 -> 
+	case happyOut24 happy_x_8 of { happy_var_8 -> 
+	happyIn19
+		 (Language.Clafer.Front.AbsClafer.Clafer ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkCatSpan happy_var_5) >- (mkCatSpan happy_var_6) >- (mkCatSpan happy_var_7) >- (mkCatSpan happy_var_8)) happy_var_1 happy_var_2 happy_var_3 happy_var_4 happy_var_5 happy_var_6 happy_var_7 happy_var_8
+	) `HappyStk` happyRest}}}}}}}}
+
+happyReduce_18 = happySpecReduce_3  12# happyReduction_18
+happyReduction_18 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut62 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn20
+		 (Language.Clafer.Front.AbsClafer.Constraint ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
+	)}}}
+
+happyReduce_19 = happyReduce 4# 13# happyReduction_19
+happyReduction_19 (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 happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut62 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	happyIn21
+		 (Language.Clafer.Front.AbsClafer.Assertion ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_20 = happyReduce 4# 14# happyReduction_20
+happyReduction_20 (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 happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut62 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	happyIn22
+		 (Language.Clafer.Front.AbsClafer.GoalMinDeprecated ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_21 = happyReduce 4# 14# 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 happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut62 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	happyIn22
+		 (Language.Clafer.Front.AbsClafer.GoalMaxDeprecated ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_22 = happyReduce 4# 14# 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 happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut62 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	happyIn22
+		 (Language.Clafer.Front.AbsClafer.GoalMinimize ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_23 = happyReduce 4# 14# happyReduction_23
+happyReduction_23 (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 happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut62 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	happyIn22
+		 (Language.Clafer.Front.AbsClafer.GoalMaximize ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_24 = happySpecReduce_0  15# happyReduction_24
+happyReduction_24  =  happyIn23
+		 (Language.Clafer.Front.AbsClafer.AbstractEmpty noSpan
+	)
+
+happyReduce_25 = happySpecReduce_1  15# happyReduction_25
+happyReduction_25 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn23
+		 (Language.Clafer.Front.AbsClafer.Abstract ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_26 = happySpecReduce_0  16# happyReduction_26
+happyReduction_26  =  happyIn24
+		 (Language.Clafer.Front.AbsClafer.ElementsEmpty noSpan
+	)
+
+happyReduce_27 = happySpecReduce_3  16# happyReduction_27
+happyReduction_27 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn24
+		 (Language.Clafer.Front.AbsClafer.ElementsList ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
+	)}}}
+
+happyReduce_28 = happySpecReduce_1  17# happyReduction_28
+happyReduction_28 happy_x_1
+	 =  case happyOut19 happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (Language.Clafer.Front.AbsClafer.Subclafer ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_29 = happyReduce 4# 17# happyReduction_29
+happyReduction_29 (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 happyOut34 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	case happyOut24 happy_x_4 of { happy_var_4 -> 
+	happyIn25
+		 (Language.Clafer.Front.AbsClafer.ClaferUse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_3 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_30 = happySpecReduce_1  17# happyReduction_30
+happyReduction_30 happy_x_1
+	 =  case happyOut20 happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (Language.Clafer.Front.AbsClafer.Subconstraint ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_31 = happySpecReduce_1  17# happyReduction_31
+happyReduction_31 happy_x_1
+	 =  case happyOut22 happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (Language.Clafer.Front.AbsClafer.Subgoal ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_32 = happySpecReduce_1  17# happyReduction_32
+happyReduction_32 happy_x_1
+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (Language.Clafer.Front.AbsClafer.SubAssertion ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_33 = happySpecReduce_0  18# happyReduction_33
+happyReduction_33  =  happyIn26
+		 (Language.Clafer.Front.AbsClafer.SuperEmpty noSpan
+	)
+
+happyReduce_34 = happySpecReduce_2  18# happyReduction_34
+happyReduction_34 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut52 happy_x_2 of { happy_var_2 -> 
+	happyIn26
+		 (Language.Clafer.Front.AbsClafer.SuperSome ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_35 = happySpecReduce_0  19# happyReduction_35
+happyReduction_35  =  happyIn27
+		 (Language.Clafer.Front.AbsClafer.ReferenceEmpty noSpan
+	)
+
+happyReduce_36 = happySpecReduce_2  19# happyReduction_36
+happyReduction_36 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut49 happy_x_2 of { happy_var_2 -> 
+	happyIn27
+		 (Language.Clafer.Front.AbsClafer.ReferenceSet ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_37 = happySpecReduce_2  19# happyReduction_37
+happyReduction_37 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut49 happy_x_2 of { happy_var_2 -> 
+	happyIn27
+		 (Language.Clafer.Front.AbsClafer.ReferenceBag ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_38 = happySpecReduce_0  20# happyReduction_38
+happyReduction_38  =  happyIn28
+		 (Language.Clafer.Front.AbsClafer.InitEmpty noSpan
+	)
+
+happyReduce_39 = happySpecReduce_2  20# happyReduction_39
+happyReduction_39 happy_x_2
+	happy_x_1
+	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
+	case happyOut35 happy_x_2 of { happy_var_2 -> 
+	happyIn28
+		 (Language.Clafer.Front.AbsClafer.InitSome ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2
+	)}}
+
+happyReduce_40 = happySpecReduce_1  21# happyReduction_40
+happyReduction_40 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn29
+		 (Language.Clafer.Front.AbsClafer.InitConstant ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_41 = happySpecReduce_1  21# happyReduction_41
+happyReduction_41 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn29
+		 (Language.Clafer.Front.AbsClafer.InitDefault ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_42 = happySpecReduce_0  22# happyReduction_42
+happyReduction_42  =  happyIn30
+		 (Language.Clafer.Front.AbsClafer.GCardEmpty noSpan
+	)
+
+happyReduce_43 = happySpecReduce_1  22# happyReduction_43
+happyReduction_43 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn30
+		 (Language.Clafer.Front.AbsClafer.GCardXor ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_44 = happySpecReduce_1  22# happyReduction_44
+happyReduction_44 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn30
+		 (Language.Clafer.Front.AbsClafer.GCardOr ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_45 = happySpecReduce_1  22# happyReduction_45
+happyReduction_45 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn30
+		 (Language.Clafer.Front.AbsClafer.GCardMux ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_46 = happySpecReduce_1  22# happyReduction_46
+happyReduction_46 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn30
+		 (Language.Clafer.Front.AbsClafer.GCardOpt ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_47 = happySpecReduce_1  22# happyReduction_47
+happyReduction_47 happy_x_1
+	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
+	happyIn30
+		 (Language.Clafer.Front.AbsClafer.GCardInterval ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_48 = happySpecReduce_0  23# happyReduction_48
+happyReduction_48  =  happyIn31
+		 (Language.Clafer.Front.AbsClafer.CardEmpty noSpan
+	)
+
+happyReduce_49 = happySpecReduce_1  23# happyReduction_49
+happyReduction_49 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn31
+		 (Language.Clafer.Front.AbsClafer.CardLone ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_50 = happySpecReduce_1  23# happyReduction_50
+happyReduction_50 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn31
+		 (Language.Clafer.Front.AbsClafer.CardSome ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_51 = happySpecReduce_1  23# happyReduction_51
+happyReduction_51 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn31
+		 (Language.Clafer.Front.AbsClafer.CardAny ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_52 = happySpecReduce_1  23# happyReduction_52
+happyReduction_52 happy_x_1
+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
+	happyIn31
+		 (Language.Clafer.Front.AbsClafer.CardNum ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_53 = happySpecReduce_1  23# happyReduction_53
+happyReduction_53 happy_x_1
+	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
+	happyIn31
+		 (Language.Clafer.Front.AbsClafer.CardInterval ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_54 = happySpecReduce_3  24# happyReduction_54
+happyReduction_54 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut33 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (Language.Clafer.Front.AbsClafer.NCard ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_55 = happySpecReduce_1  25# happyReduction_55
+happyReduction_55 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn33
+		 (Language.Clafer.Front.AbsClafer.ExIntegerAst ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_56 = happySpecReduce_1  25# happyReduction_56
+happyReduction_56 happy_x_1
+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
+	happyIn33
+		 (Language.Clafer.Front.AbsClafer.ExIntegerNum ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_57 = happySpecReduce_1  26# happyReduction_57
+happyReduction_57 happy_x_1
+	 =  case happyOut64 happy_x_1 of { happy_var_1 -> 
+	happyIn34
+		 (Language.Clafer.Front.AbsClafer.Path ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_58 = happyReduce 5# 27# happyReduction_58
+happyReduction_58 (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 happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut54 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	case happyOut35 happy_x_5 of { happy_var_5 -> 
+	happyIn35
+		 (Language.Clafer.Front.AbsClafer.EDeclAllDisj ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_3 happy_var_5
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_59 = happyReduce 4# 27# happyReduction_59
+happyReduction_59 (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 happyOut54 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut35 happy_x_4 of { happy_var_4 -> 
+	happyIn35
+		 (Language.Clafer.Front.AbsClafer.EDeclAll ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_60 = happyReduce 5# 27# happyReduction_60
+happyReduction_60 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut55 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut54 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	case happyOut35 happy_x_5 of { happy_var_5 -> 
+	happyIn35
+		 (Language.Clafer.Front.AbsClafer.EDeclQuantDisj ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_1 happy_var_3 happy_var_5
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_61 = happyReduce 4# 27# happyReduction_61
+happyReduction_61 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut55 happy_x_1 of { happy_var_1 -> 
+	case happyOut54 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut35 happy_x_4 of { happy_var_4 -> 
+	happyIn35
+		 (Language.Clafer.Front.AbsClafer.EDeclQuant ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_62 = happyReduce 6# 27# happyReduction_62
+happyReduction_62 (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 happyOut35 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut35 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { happy_var_5 -> 
+	case happyOut35 happy_x_6 of { happy_var_6 -> 
+	happyIn35
+		 (Language.Clafer.Front.AbsClafer.EImpliesElse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkTokenSpan happy_var_5) >- (mkCatSpan happy_var_6)) happy_var_2 happy_var_4 happy_var_6
+	) `HappyStk` happyRest}}}}}}
+
+happyReduce_63 = happySpecReduce_3  27# happyReduction_63
+happyReduction_63 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut65 happy_x_3 of { happy_var_3 -> 
+	happyIn35
+		 (Language.Clafer.Front.AbsClafer.EIff ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_64 = happySpecReduce_1  27# happyReduction_64
+happyReduction_64 happy_x_1
+	 =  case happyOut65 happy_x_1 of { happy_var_1 -> 
+	happyIn35
+		 (happy_var_1
+	)}
+
+happyReduce_65 = happySpecReduce_3  28# happyReduction_65
+happyReduction_65 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut37 happy_x_3 of { happy_var_3 -> 
+	happyIn36
+		 (Language.Clafer.Front.AbsClafer.EImplies ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_66 = happySpecReduce_1  28# happyReduction_66
+happyReduction_66 happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	happyIn36
+		 (happy_var_1
+	)}
+
+happyReduce_67 = happySpecReduce_3  29# happyReduction_67
+happyReduction_67 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 (Language.Clafer.Front.AbsClafer.EOr ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_68 = happySpecReduce_1  29# happyReduction_68
+happyReduction_68 happy_x_1
+	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
+	happyIn37
+		 (happy_var_1
+	)}
+
+happyReduce_69 = happySpecReduce_3  30# happyReduction_69
+happyReduction_69 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut39 happy_x_3 of { happy_var_3 -> 
+	happyIn38
+		 (Language.Clafer.Front.AbsClafer.EXor ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_70 = happySpecReduce_1  30# happyReduction_70
+happyReduction_70 happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	happyIn38
+		 (happy_var_1
+	)}
+
+happyReduce_71 = happySpecReduce_3  31# happyReduction_71
+happyReduction_71 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut40 happy_x_3 of { happy_var_3 -> 
+	happyIn39
+		 (Language.Clafer.Front.AbsClafer.EAnd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_72 = happySpecReduce_1  31# happyReduction_72
+happyReduction_72 happy_x_1
+	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
+	happyIn39
+		 (happy_var_1
+	)}
+
+happyReduce_73 = happySpecReduce_2  32# happyReduction_73
+happyReduction_73 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut41 happy_x_2 of { happy_var_2 -> 
+	happyIn40
+		 (Language.Clafer.Front.AbsClafer.ENeg ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_74 = happySpecReduce_1  32# happyReduction_74
+happyReduction_74 happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	happyIn40
+		 (happy_var_1
+	)}
+
+happyReduce_75 = happySpecReduce_3  33# happyReduction_75
+happyReduction_75 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut42 happy_x_3 of { happy_var_3 -> 
+	happyIn41
+		 (Language.Clafer.Front.AbsClafer.ELt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_76 = happySpecReduce_3  33# happyReduction_76
+happyReduction_76 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut42 happy_x_3 of { happy_var_3 -> 
+	happyIn41
+		 (Language.Clafer.Front.AbsClafer.EGt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_77 = happySpecReduce_3  33# happyReduction_77
+happyReduction_77 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut42 happy_x_3 of { happy_var_3 -> 
+	happyIn41
+		 (Language.Clafer.Front.AbsClafer.EEq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_78 = happySpecReduce_3  33# happyReduction_78
+happyReduction_78 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut42 happy_x_3 of { happy_var_3 -> 
+	happyIn41
+		 (Language.Clafer.Front.AbsClafer.ELte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_79 = happySpecReduce_3  33# happyReduction_79
+happyReduction_79 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut42 happy_x_3 of { happy_var_3 -> 
+	happyIn41
+		 (Language.Clafer.Front.AbsClafer.EGte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_80 = happySpecReduce_3  33# happyReduction_80
+happyReduction_80 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut42 happy_x_3 of { happy_var_3 -> 
+	happyIn41
+		 (Language.Clafer.Front.AbsClafer.ENeq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_81 = happySpecReduce_3  33# happyReduction_81
+happyReduction_81 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut42 happy_x_3 of { happy_var_3 -> 
+	happyIn41
+		 (Language.Clafer.Front.AbsClafer.EIn ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_82 = happyReduce 4# 33# happyReduction_82
+happyReduction_82 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut42 happy_x_4 of { happy_var_4 -> 
+	happyIn41
+		 (Language.Clafer.Front.AbsClafer.ENin ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_83 = happySpecReduce_1  33# happyReduction_83
+happyReduction_83 happy_x_1
+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
+	happyIn41
+		 (happy_var_1
+	)}
+
+happyReduce_84 = happySpecReduce_2  34# happyReduction_84
+happyReduction_84 happy_x_2
+	happy_x_1
+	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
+	case happyOut46 happy_x_2 of { happy_var_2 -> 
+	happyIn42
+		 (Language.Clafer.Front.AbsClafer.EQuantExp ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2
+	)}}
+
+happyReduce_85 = happySpecReduce_1  34# happyReduction_85
+happyReduction_85 happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	happyIn42
+		 (happy_var_1
+	)}
+
+happyReduce_86 = happySpecReduce_3  35# happyReduction_86
+happyReduction_86 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn43
+		 (Language.Clafer.Front.AbsClafer.EAdd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_87 = happySpecReduce_3  35# happyReduction_87
+happyReduction_87 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn43
+		 (Language.Clafer.Front.AbsClafer.ESub ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_88 = happySpecReduce_1  35# happyReduction_88
+happyReduction_88 happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 (happy_var_1
+	)}
+
+happyReduce_89 = happySpecReduce_3  36# happyReduction_89
+happyReduction_89 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	happyIn44
+		 (Language.Clafer.Front.AbsClafer.EMul ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_90 = happySpecReduce_3  36# happyReduction_90
+happyReduction_90 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	happyIn44
+		 (Language.Clafer.Front.AbsClafer.EDiv ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_91 = happySpecReduce_3  36# happyReduction_91
+happyReduction_91 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	happyIn44
+		 (Language.Clafer.Front.AbsClafer.ERem ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_92 = happySpecReduce_1  36# happyReduction_92
+happyReduction_92 happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	happyIn44
+		 (happy_var_1
+	)}
+
+happyReduce_93 = happySpecReduce_2  37# happyReduction_93
+happyReduction_93 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut46 happy_x_2 of { happy_var_2 -> 
+	happyIn45
+		 (Language.Clafer.Front.AbsClafer.EGMax ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_94 = happySpecReduce_2  37# happyReduction_94
+happyReduction_94 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut46 happy_x_2 of { happy_var_2 -> 
+	happyIn45
+		 (Language.Clafer.Front.AbsClafer.EGMin ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_95 = happySpecReduce_1  37# happyReduction_95
+happyReduction_95 happy_x_1
+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
+	happyIn45
+		 (happy_var_1
+	)}
+
+happyReduce_96 = happySpecReduce_2  38# happyReduction_96
+happyReduction_96 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut47 happy_x_2 of { happy_var_2 -> 
+	happyIn46
+		 (Language.Clafer.Front.AbsClafer.ESum ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_97 = happySpecReduce_2  38# happyReduction_97
+happyReduction_97 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut47 happy_x_2 of { happy_var_2 -> 
+	happyIn46
+		 (Language.Clafer.Front.AbsClafer.EProd ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_98 = happySpecReduce_2  38# happyReduction_98
+happyReduction_98 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut47 happy_x_2 of { happy_var_2 -> 
+	happyIn46
+		 (Language.Clafer.Front.AbsClafer.ECard ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_99 = happySpecReduce_2  38# happyReduction_99
+happyReduction_99 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut47 happy_x_2 of { happy_var_2 -> 
+	happyIn46
+		 (Language.Clafer.Front.AbsClafer.EMinExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_100 = happySpecReduce_1  38# happyReduction_100
+happyReduction_100 happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	happyIn46
+		 (happy_var_1
+	)}
+
+happyReduce_101 = happySpecReduce_3  39# happyReduction_101
+happyReduction_101 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut48 happy_x_3 of { happy_var_3 -> 
+	happyIn47
+		 (Language.Clafer.Front.AbsClafer.EDomain ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_102 = happySpecReduce_1  39# happyReduction_102
+happyReduction_102 happy_x_1
+	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
+	happyIn47
+		 (happy_var_1
+	)}
+
+happyReduce_103 = happySpecReduce_3  40# happyReduction_103
+happyReduction_103 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut49 happy_x_3 of { happy_var_3 -> 
+	happyIn48
+		 (Language.Clafer.Front.AbsClafer.ERange ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_104 = happySpecReduce_1  40# happyReduction_104
+happyReduction_104 happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	happyIn48
+		 (happy_var_1
+	)}
+
+happyReduce_105 = happySpecReduce_3  41# happyReduction_105
+happyReduction_105 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut50 happy_x_3 of { happy_var_3 -> 
+	happyIn49
+		 (Language.Clafer.Front.AbsClafer.EUnion ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_106 = happySpecReduce_3  41# happyReduction_106
+happyReduction_106 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut50 happy_x_3 of { happy_var_3 -> 
+	happyIn49
+		 (Language.Clafer.Front.AbsClafer.EUnionCom ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_107 = happySpecReduce_1  41# happyReduction_107
+happyReduction_107 happy_x_1
+	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
+	happyIn49
+		 (happy_var_1
+	)}
+
+happyReduce_108 = happySpecReduce_3  42# happyReduction_108
+happyReduction_108 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut51 happy_x_3 of { happy_var_3 -> 
+	happyIn50
+		 (Language.Clafer.Front.AbsClafer.EDifference ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_109 = happySpecReduce_1  42# happyReduction_109
+happyReduction_109 happy_x_1
+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
+	happyIn50
+		 (happy_var_1
+	)}
+
+happyReduce_110 = happySpecReduce_3  43# happyReduction_110
+happyReduction_110 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut52 happy_x_3 of { happy_var_3 -> 
+	happyIn51
+		 (Language.Clafer.Front.AbsClafer.EIntersection ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_111 = happySpecReduce_3  43# happyReduction_111
+happyReduction_111 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut52 happy_x_3 of { happy_var_3 -> 
+	happyIn51
+		 (Language.Clafer.Front.AbsClafer.EIntersectionDeprecated ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_112 = happySpecReduce_1  43# happyReduction_112
+happyReduction_112 happy_x_1
+	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
+	happyIn51
+		 (happy_var_1
+	)}
+
+happyReduce_113 = happySpecReduce_3  44# happyReduction_113
+happyReduction_113 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut53 happy_x_3 of { happy_var_3 -> 
+	happyIn52
+		 (Language.Clafer.Front.AbsClafer.EJoin ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_114 = happySpecReduce_1  44# happyReduction_114
+happyReduction_114 happy_x_1
+	 =  case happyOut53 happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (happy_var_1
+	)}
+
+happyReduce_115 = happySpecReduce_1  45# happyReduction_115
+happyReduction_115 happy_x_1
+	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
+	happyIn53
+		 (Language.Clafer.Front.AbsClafer.ClaferId ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_116 = happySpecReduce_1  45# happyReduction_116
+happyReduction_116 happy_x_1
+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
+	happyIn53
+		 (Language.Clafer.Front.AbsClafer.EInt ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_117 = happySpecReduce_1  45# happyReduction_117
+happyReduction_117 happy_x_1
+	 =  case happyOut9 happy_x_1 of { happy_var_1 -> 
+	happyIn53
+		 (Language.Clafer.Front.AbsClafer.EDouble ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_118 = happySpecReduce_1  45# happyReduction_118
+happyReduction_118 happy_x_1
+	 =  case happyOut10 happy_x_1 of { happy_var_1 -> 
+	happyIn53
+		 (Language.Clafer.Front.AbsClafer.EReal ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_119 = happySpecReduce_1  45# happyReduction_119
+happyReduction_119 happy_x_1
+	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
+	happyIn53
+		 (Language.Clafer.Front.AbsClafer.EStr ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_120 = happySpecReduce_3  45# happyReduction_120
+happyReduction_120 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut35 happy_x_2 of { happy_var_2 -> 
+	happyIn53
+		 (happy_var_2
+	)}
+
+happyReduce_121 = happySpecReduce_3  46# happyReduction_121
+happyReduction_121 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut63 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut49 happy_x_3 of { happy_var_3 -> 
+	happyIn54
+		 (Language.Clafer.Front.AbsClafer.Decl ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_122 = happySpecReduce_1  47# happyReduction_122
+happyReduction_122 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 (Language.Clafer.Front.AbsClafer.QuantNo ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_123 = happySpecReduce_1  47# happyReduction_123
+happyReduction_123 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 (Language.Clafer.Front.AbsClafer.QuantNot ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_124 = happySpecReduce_1  47# happyReduction_124
+happyReduction_124 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 (Language.Clafer.Front.AbsClafer.QuantLone ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_125 = happySpecReduce_1  47# happyReduction_125
+happyReduction_125 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 (Language.Clafer.Front.AbsClafer.QuantOne ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_126 = happySpecReduce_1  47# happyReduction_126
+happyReduction_126 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 (Language.Clafer.Front.AbsClafer.QuantSome ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_127 = happySpecReduce_1  48# happyReduction_127
+happyReduction_127 happy_x_1
+	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
+	happyIn56
+		 (Language.Clafer.Front.AbsClafer.EnumIdIdent ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_128 = happySpecReduce_1  49# happyReduction_128
+happyReduction_128 happy_x_1
+	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
+	happyIn57
+		 (Language.Clafer.Front.AbsClafer.ModIdIdent ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_129 = happySpecReduce_1  50# happyReduction_129
+happyReduction_129 happy_x_1
+	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
+	happyIn58
+		 (Language.Clafer.Front.AbsClafer.LocIdIdent ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_130 = happySpecReduce_0  51# happyReduction_130
+happyReduction_130  =  happyIn59
+		 ([]
+	)
+
+happyReduce_131 = happySpecReduce_2  51# happyReduction_131
+happyReduction_131 happy_x_2
+	happy_x_1
+	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
+	case happyOut18 happy_x_2 of { happy_var_2 -> 
+	happyIn59
+		 (flip (:)  happy_var_1 happy_var_2
+	)}}
+
+happyReduce_132 = happySpecReduce_1  52# happyReduction_132
+happyReduction_132 happy_x_1
+	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
+	happyIn60
+		 ((:[])  happy_var_1
+	)}
+
+happyReduce_133 = happySpecReduce_3  52# happyReduction_133
+happyReduction_133 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
+	case happyOut60 happy_x_3 of { happy_var_3 -> 
+	happyIn60
+		 ((:)  happy_var_1 happy_var_3
+	)}}
+
+happyReduce_134 = happySpecReduce_0  53# happyReduction_134
+happyReduction_134  =  happyIn61
+		 ([]
+	)
+
+happyReduce_135 = happySpecReduce_2  53# happyReduction_135
+happyReduction_135 happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut25 happy_x_2 of { happy_var_2 -> 
+	happyIn61
+		 (flip (:)  happy_var_1 happy_var_2
+	)}}
+
+happyReduce_136 = happySpecReduce_0  54# happyReduction_136
+happyReduction_136  =  happyIn62
+		 ([]
+	)
+
+happyReduce_137 = happySpecReduce_2  54# happyReduction_137
+happyReduction_137 happy_x_2
+	happy_x_1
+	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
+	case happyOut35 happy_x_2 of { happy_var_2 -> 
+	happyIn62
+		 (flip (:)  happy_var_1 happy_var_2
+	)}}
+
+happyReduce_138 = happySpecReduce_1  55# happyReduction_138
+happyReduction_138 happy_x_1
+	 =  case happyOut58 happy_x_1 of { happy_var_1 -> 
+	happyIn63
+		 ((:[])  happy_var_1
+	)}
+
+happyReduce_139 = happySpecReduce_3  55# happyReduction_139
+happyReduction_139 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut58 happy_x_1 of { happy_var_1 -> 
+	case happyOut63 happy_x_3 of { happy_var_3 -> 
+	happyIn63
+		 ((:)  happy_var_1 happy_var_3
+	)}}
+
+happyReduce_140 = happySpecReduce_1  56# happyReduction_140
+happyReduction_140 happy_x_1
+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
+	happyIn64
+		 ((:[])  happy_var_1
+	)}
+
+happyReduce_141 = happySpecReduce_3  56# happyReduction_141
+happyReduction_141 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
+	case happyOut64 happy_x_3 of { happy_var_3 -> 
+	happyIn64
+		 ((:)  happy_var_1 happy_var_3
+	)}}
+
+happyReduce_142 = happySpecReduce_1  57# happyReduction_142
+happyReduction_142 happy_x_1
+	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
+	happyIn65
+		 (happy_var_1
+	)}
+
+happyNewToken action sts stk [] =
+	happyDoAction 77# notHappyAtAll action sts stk []
+
+happyNewToken action sts stk (tk:tks) =
+	let cont i = happyDoAction i tk action sts stk tks in
+	case tk of {
+	PT _ (TS _ 1) -> cont 1#;
+	PT _ (TS _ 2) -> cont 2#;
+	PT _ (TS _ 3) -> cont 3#;
+	PT _ (TS _ 4) -> cont 4#;
+	PT _ (TS _ 5) -> cont 5#;
+	PT _ (TS _ 6) -> cont 6#;
+	PT _ (TS _ 7) -> cont 7#;
+	PT _ (TS _ 8) -> cont 8#;
+	PT _ (TS _ 9) -> cont 9#;
+	PT _ (TS _ 10) -> cont 10#;
+	PT _ (TS _ 11) -> cont 11#;
+	PT _ (TS _ 12) -> cont 12#;
+	PT _ (TS _ 13) -> cont 13#;
+	PT _ (TS _ 14) -> cont 14#;
+	PT _ (TS _ 15) -> cont 15#;
+	PT _ (TS _ 16) -> cont 16#;
+	PT _ (TS _ 17) -> cont 17#;
+	PT _ (TS _ 18) -> cont 18#;
+	PT _ (TS _ 19) -> cont 19#;
+	PT _ (TS _ 20) -> cont 20#;
+	PT _ (TS _ 21) -> cont 21#;
+	PT _ (TS _ 22) -> cont 22#;
+	PT _ (TS _ 23) -> cont 23#;
+	PT _ (TS _ 24) -> cont 24#;
+	PT _ (TS _ 25) -> cont 25#;
+	PT _ (TS _ 26) -> cont 26#;
+	PT _ (TS _ 27) -> cont 27#;
+	PT _ (TS _ 28) -> cont 28#;
+	PT _ (TS _ 29) -> cont 29#;
+	PT _ (TS _ 30) -> cont 30#;
+	PT _ (TS _ 31) -> cont 31#;
+	PT _ (TS _ 32) -> cont 32#;
+	PT _ (TS _ 33) -> cont 33#;
+	PT _ (TS _ 34) -> cont 34#;
+	PT _ (TS _ 35) -> cont 35#;
+	PT _ (TS _ 36) -> cont 36#;
+	PT _ (TS _ 37) -> cont 37#;
+	PT _ (TS _ 38) -> cont 38#;
+	PT _ (TS _ 39) -> cont 39#;
+	PT _ (TS _ 40) -> cont 40#;
+	PT _ (TS _ 41) -> cont 41#;
+	PT _ (TS _ 42) -> cont 42#;
+	PT _ (TS _ 43) -> cont 43#;
+	PT _ (TS _ 44) -> cont 44#;
+	PT _ (TS _ 45) -> cont 45#;
+	PT _ (TS _ 46) -> cont 46#;
+	PT _ (TS _ 47) -> cont 47#;
+	PT _ (TS _ 48) -> cont 48#;
+	PT _ (TS _ 49) -> cont 49#;
+	PT _ (TS _ 50) -> cont 50#;
+	PT _ (TS _ 51) -> cont 51#;
+	PT _ (TS _ 52) -> cont 52#;
+	PT _ (TS _ 53) -> cont 53#;
+	PT _ (TS _ 54) -> cont 54#;
+	PT _ (TS _ 55) -> cont 55#;
+	PT _ (TS _ 56) -> cont 56#;
+	PT _ (TS _ 57) -> cont 57#;
+	PT _ (TS _ 58) -> cont 58#;
+	PT _ (TS _ 59) -> cont 59#;
+	PT _ (TS _ 60) -> cont 60#;
+	PT _ (TS _ 61) -> cont 61#;
+	PT _ (TS _ 62) -> cont 62#;
+	PT _ (TS _ 63) -> cont 63#;
+	PT _ (TS _ 64) -> cont 64#;
+	PT _ (TS _ 65) -> cont 65#;
+	PT _ (TS _ 66) -> cont 66#;
+	PT _ (TS _ 67) -> cont 67#;
+	PT _ (T_PosInteger _) -> cont 68#;
+	PT _ (T_PosDouble _) -> cont 69#;
+	PT _ (T_PosReal _) -> cont 70#;
+	PT _ (T_PosString _) -> cont 71#;
+	PT _ (T_PosIdent _) -> cont 72#;
+	PT _ (T_PosLineComment _) -> cont 73#;
+	PT _ (T_PosBlockComment _) -> cont 74#;
+	PT _ (T_PosAlloy _) -> cont 75#;
+	PT _ (T_PosChoco _) -> cont 76#;
+	_ -> happyError' (tk:tks)
+	}
+
+happyError_ 77# tk tks = happyError' tks
+happyError_ _ tk tks = happyError' (tk:tks)
+
+happyThen :: () => Err a -> (a -> Err b) -> Err b
+happyThen = (thenM)
+happyReturn :: () => a -> Err a
+happyReturn = (returnM)
+happyThen1 m k tks = (thenM) m (\a -> k a tks)
+happyReturn1 :: () => a -> b -> Err a
+happyReturn1 = \a tks -> (returnM) a
+happyError' :: () => [(Token)] -> Err a
+happyError' = happyError
+
+pModule tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut17 x))
+
+pClafer tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut19 x))
+
+pConstraint tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 2# tks) (\x -> happyReturn (happyOut20 x))
+
+pAssertion tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 3# tks) (\x -> happyReturn (happyOut21 x))
+
+pGoal tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 4# tks) (\x -> happyReturn (happyOut22 x))
+
+happySeq = happyDontSeq
+
+
+returnM :: a -> Err a
+returnM = return
+
+thenM :: Err a -> (a -> Err b) -> Err b
+thenM = (>>=)
+
+happyError :: [Token] -> Err a
+happyError ts =
+  Bad (pp ts) $ "syntax error at " ++ tokenPos ts ++ 
+  case ts of
+    [] -> []
+    [Err _] -> " due to lexer error"
+    _ -> " before " ++ unwords (map (id . prToken) (take 4 ts))
+
+myLexer = tokens
+
+gp x@(PT (Pn _ l c) _) = Span (Pos (toInteger l) (toInteger c)) (Pos (toInteger l) (toInteger c + toInteger (length $ prToken x)))
+pp (PT (Pn _ l c) _ :_) = Pos (toInteger l) (toInteger c)
+pp (Err (Pn _ l c) :_) = Pos (toInteger l) (toInteger c)
+pp _ = error "EOF"
+
+mkCatSpan :: (Spannable c) => c -> Span
+mkCatSpan = getSpan
+
+mkTokenSpan :: Token -> Span
+mkTokenSpan = gp
+{-# LINE 1 "templates\GenericTemplate.hs" #-}
+{-# LINE 1 "templates\\GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command-line>" #-}
+{-# LINE 12 "<command-line>" #-}
+{-# LINE 1 "C:\\Users\\mantkiew\\AppData\\Local\\Programs\\stack\\x86_64-windows\\ghc-7.10.3\\lib/include\\ghcversion.h" #-}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{-# LINE 12 "<command-line>" #-}
+{-# LINE 1 "templates\\GenericTemplate.hs" #-}
+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
+
+{-# LINE 13 "templates\\GenericTemplate.hs" #-}
+
+
+
+
+
+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
+#if __GLASGOW_HASKELL__ > 706
+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)
+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)
+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)
+#else
+#define LT(n,m) (n Happy_GHC_Exts.<# m)
+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)
+#define EQ(n,m) (n Happy_GHC_Exts.==# m)
+#endif
+{-# LINE 46 "templates\\GenericTemplate.hs" #-}
+
+
+data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
+
+
+
+
+
+{-# LINE 67 "templates\\GenericTemplate.hs" #-}
+
+{-# LINE 77 "templates\\GenericTemplate.hs" #-}
+
+{-# LINE 86 "templates\\GenericTemplate.hs" #-}
+
+infixr 9 `HappyStk`
+data HappyStk a = HappyStk a (HappyStk a)
+
+-----------------------------------------------------------------------------
+-- starting the parse
+
+happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
+
+-----------------------------------------------------------------------------
+-- Accepting the parse
+
+-- If the current token is 0#, it means we've just accepted a partial
+-- parse (a %partial parser).  We must ignore the saved token on the top of
+-- the stack in this case.
+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
+        happyReturn1 ans
+happyAccept j tk st sts (HappyStk ans _) = 
+        (happyTcHack j (happyTcHack st)) (happyReturn1 ans)
+
+-----------------------------------------------------------------------------
+-- Arrays only: do the next action
+
+
+
+happyDoAction i tk st
+        = {- nothing -}
+
+
+          case action of
+                0#           -> {- nothing -}
+                                     happyFail i tk st
+                -1#          -> {- nothing -}
+                                     happyAccept i tk st
+                n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
+
+                                                   (happyReduceArr Happy_Data_Array.! rule) i tk st
+                                                   where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
+                n                 -> {- nothing -}
+
+
+                                     happyShift new_state i tk st
+                                     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
+   where off    = indexShortOffAddr happyActOffsets st
+         off_i  = (off Happy_GHC_Exts.+# i)
+         check  = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))
+                  then EQ(indexShortOffAddr happyCheck off_i, i)
+                  else False
+         action
+          | check     = indexShortOffAddr happyTable off_i
+          | otherwise = indexShortOffAddr happyDefActions st
+
+
+indexShortOffAddr (HappyA# arr) off =
+        Happy_GHC_Exts.narrow16Int# i
+  where
+        i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
+        high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
+        low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))
+        off' = off Happy_GHC_Exts.*# 2#
+
+
+
+
+
+data HappyAddr = HappyA# Happy_GHC_Exts.Addr#
+
+
+
+
+-----------------------------------------------------------------------------
+-- HappyState data type (not arrays)
+
+{-# LINE 170 "templates\\GenericTemplate.hs" #-}
+
+-----------------------------------------------------------------------------
+-- Shifting a token
+
+happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
+     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
+--     trace "shifting the error token" $
+     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
+
+happyShift new_state i tk st sts stk =
+     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
+
+-- happyReduce is specialised for the common cases.
+
+happySpecReduce_0 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_0 nt fn j tk st@((action)) sts stk
+     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
+
+happySpecReduce_1 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
+     = let r = fn v1 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happySpecReduce_2 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
+     = let r = fn v1 v2 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happySpecReduce_3 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
+     = let r = fn v1 v2 v3 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happyReduce k i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyReduce k nt fn j tk st sts stk
+     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of
+         sts1@((HappyCons (st1@(action)) (_))) ->
+                let r = fn stk in  -- it doesn't hurt to always seq here...
+                happyDoSeq r (happyGoto nt j tk st1 sts1 r)
+
+happyMonadReduce k nt fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyMonadReduce k nt fn j tk st sts stk =
+      case happyDrop k (HappyCons (st) (sts)) of
+        sts1@((HappyCons (st1@(action)) (_))) ->
+          let drop_stk = happyDropStk k stk in
+          happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
+
+happyMonad2Reduce k nt fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyMonad2Reduce k nt fn j tk st sts stk =
+      case happyDrop k (HappyCons (st) (sts)) of
+        sts1@((HappyCons (st1@(action)) (_))) ->
+         let drop_stk = happyDropStk k stk
+
+             off = indexShortOffAddr happyGotoOffsets st1
+             off_i = (off Happy_GHC_Exts.+# nt)
+             new_state = indexShortOffAddr happyTable off_i
+
+
+
+          in
+          happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
+
+happyDrop 0# l = l
+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
+
+happyDropStk 0# l = l
+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs
+
+-----------------------------------------------------------------------------
+-- Moving to a new state after a reduction
+
+
+happyGoto nt j tk st = 
+   {- nothing -}
+   happyDoAction j tk new_state
+   where off = indexShortOffAddr happyGotoOffsets st
+         off_i = (off Happy_GHC_Exts.+# nt)
+         new_state = indexShortOffAddr happyTable off_i
+
+
+
+
+-----------------------------------------------------------------------------
+-- Error recovery (0# is the error token)
+
+-- parse error if we are in recovery and we fail again
+happyFail 0# tk old_st _ stk@(x `HappyStk` _) =
+     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
+--      trace "failing" $ 
+        happyError_ i tk
+
+{-  We don't need state discarding for our restricted implementation of
+    "error".  In fact, it can cause some bogus parses, so I've disabled it
+    for now --SDM
+
+-- discard a state
+happyFail  0# tk old_st (HappyCons ((action)) (sts)) 
+                                                (saved_tok `HappyStk` _ `HappyStk` stk) =
+--      trace ("discarding state, depth " ++ show (length stk))  $
+        happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
+-}
+
+-- Enter error recovery: generate an error token,
+--                       save the old token and carry on.
+happyFail  i tk (action) sts stk =
+--      trace "entering error recovery" $
+        happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
+
+-- Internal happy errors:
+
+notHappyAtAll :: a
+notHappyAtAll = error "Internal Happy error\n"
+
+-----------------------------------------------------------------------------
+-- Hack to get the typechecker to accept our action functions
+
+
+happyTcHack :: Happy_GHC_Exts.Int# -> a -> a
+happyTcHack x y = y
+{-# INLINE happyTcHack #-}
+
+
+-----------------------------------------------------------------------------
+-- Seq-ing.  If the --strict flag is given, then Happy emits 
+--      happySeq = happyDoSeq
+-- otherwise it emits
+--      happySeq = happyDontSeq
+
+happyDoSeq, happyDontSeq :: a -> b -> b
+happyDoSeq   a b = a `seq` b
+happyDontSeq a b = b
+
+-----------------------------------------------------------------------------
+-- Don't inline any functions from the template.  GHC has a nasty habit
+-- of deciding to inline happyGoto everywhere, which increases the size of
+-- the generated parser quite a bit.
+
+
+{-# NOINLINE happyDoAction #-}
+{-# NOINLINE happyTable #-}
+{-# NOINLINE happyCheck #-}
+{-# NOINLINE happyActOffsets #-}
+{-# NOINLINE happyGotoOffsets #-}
+{-# NOINLINE happyDefActions #-}
+
+{-# NOINLINE happyShift #-}
+{-# NOINLINE happySpecReduce_0 #-}
+{-# NOINLINE happySpecReduce_1 #-}
+{-# NOINLINE happySpecReduce_2 #-}
+{-# NOINLINE happySpecReduce_3 #-}
+{-# NOINLINE happyReduce #-}
+{-# NOINLINE happyMonadReduce #-}
+{-# NOINLINE happyGoto #-}
+{-# NOINLINE happyFail #-}
+
+-- end of Happy Template.
diff --git a/src/Language/Clafer/Front/PrintClafer.hs b/src/Language/Clafer/Front/PrintClafer.hs
--- a/src/Language/Clafer/Front/PrintClafer.hs
+++ b/src/Language/Clafer/Front/PrintClafer.hs
@@ -1,293 +1,293 @@
-{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
-module Language.Clafer.Front.PrintClafer where
-
--- pretty-printer generated by the BNF converter
-
-import Language.Clafer.Front.AbsClafer
-import Data.Char
-import Prelude hiding (exp, init)
-
--- the top-level printing method
-printTree :: Print a => a -> String
-printTree = render . prt 0
-
-type Doc = [ShowS] -> [ShowS]
-
-doc :: ShowS -> Doc
-doc = (:)
-
-render :: Doc -> String
-render d = rend 0 (map ($ "") $ d []) "" where
-  rend i ss = case ss of
-    "["      :ts -> showChar '[' . rend i ts
-    "("      :ts -> showChar '(' . rend i ts
-    "{"      :ts -> showChar '{' . new (i+1) . rend (i+1) ts
-    "}" : ";":ts -> new (i-1) . space "}" . showChar ';' . new (i-1) . rend (i-1) ts
-    "}"      :ts -> new (i-1) . showChar '}' . new (i-1) . rend (i-1) ts
-    ";"      :ts -> showChar ';' . new i . rend i ts
-    t  : "," :ts -> showString t . space "," . rend i ts
-    t  : ")" :ts -> showString t . showChar ')' . rend i ts
-    t  : "]" :ts -> showString t . showChar ']' . rend i ts
-    t        :ts -> space t . rend i ts
-    _            -> id
-  new i   = showChar '\n' . replicateS (2*i) (showChar ' ') . dropWhile isSpace
-  space t = showString t . (\s -> if null s then "" else (' ':s))
-
-parenth :: Doc -> Doc
-parenth ss = doc (showChar '(') . ss . doc (showChar ')')
-
-concatS :: [ShowS] -> ShowS
-concatS = foldr (.) id
-
-concatD :: [Doc] -> Doc
-concatD = foldr (.) id
-
-replicateS :: Int -> ShowS -> ShowS
-replicateS n f = concatS (replicate n f)
-
--- the printer class does the job
-class Print a where
-  prt :: Int -> a -> Doc
-  prtList :: Int -> [a] -> Doc
-  prtList i = concatD . map (prt i)
-
-instance Print a => Print [a] where
-  prt = prtList
-
-instance Print Char where
-  prt _ s = doc (showChar '\'' . mkEsc '\'' s . showChar '\'')
-  prtList _ s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"')
-
-mkEsc :: Char -> Char -> ShowS
-mkEsc q s = case s of
-  _ | s == q -> showChar '\\' . showChar s
-  '\\'-> showString "\\\\"
-  '\n' -> showString "\\n"
-  '\t' -> showString "\\t"
-  _ -> showChar s
-
-prPrec :: Int -> Int -> Doc -> Doc
-prPrec i j = if j<i then parenth else id
-
-
-instance Print Integer where
-  prt _ x = doc (shows x)
-
-
-instance Print Double where
-  prt _ x = doc (shows x)
-
-
-
-instance Print PosInteger where
-  prt _ (PosInteger (_,i)) = doc (showString ( i))
-
-
-instance Print PosDouble where
-  prt _ (PosDouble (_,i)) = doc (showString ( i))
-
-
-instance Print PosReal where
-  prt _ (PosReal (_,i)) = doc (showString ( i))
-
-
-instance Print PosString where
-  prt _ (PosString (_,i)) = doc (showString ( i))
-
-
-instance Print PosIdent where
-  prt _ (PosIdent (_,i)) = doc (showString ( i))
-
-
-instance Print PosLineComment where
-  prt _ (PosLineComment (_,i)) = doc (showString ( i))
-
-
-instance Print PosBlockComment where
-  prt _ (PosBlockComment (_,i)) = doc (showString ( i))
-
-
-instance Print PosAlloy where
-  prt _ (PosAlloy (_,i)) = doc (showString ( i))
-
-
-instance Print PosChoco where
-  prt _ (PosChoco (_,i)) = doc (showString ( i))
-
-
-
-instance Print Module where
-  prt i e = case e of
-    Module _ declarations -> prPrec i 0 (concatD [prt 0 declarations])
-
-instance Print Declaration where
-  prt i e = case e of
-    EnumDecl _ posident enumids -> prPrec i 0 (concatD [doc (showString "enum"), prt 0 posident, doc (showString "="), prt 0 enumids])
-    ElementDecl _ element -> prPrec i 0 (concatD [prt 0 element])
-  prtList _ [] = (concatD [])
-  prtList _ (x:xs) = (concatD [prt 0 x, prt 0 xs])
-instance Print Clafer where
-  prt i e = case e of
-    Clafer _ abstract gcard posident super reference card init elements -> prPrec i 0 (concatD [prt 0 abstract, prt 0 gcard, prt 0 posident, prt 0 super, prt 0 reference, prt 0 card, prt 0 init, prt 0 elements])
-
-instance Print Constraint where
-  prt i e = case e of
-    Constraint _ exps -> prPrec i 0 (concatD [doc (showString "["), prt 0 exps, doc (showString "]")])
-
-instance Print Assertion where
-  prt i e = case e of
-    Assertion _ exps -> prPrec i 0 (concatD [doc (showString "assert"), doc (showString "["), prt 0 exps, doc (showString "]")])
-
-instance Print Goal where
-  prt i e = case e of
-    GoalMinDeprecated _ exps -> prPrec i 0 (concatD [doc (showString "<<"), doc (showString "min"), prt 0 exps, doc (showString ">>")])
-    GoalMaxDeprecated _ exps -> prPrec i 0 (concatD [doc (showString "<<"), doc (showString "max"), prt 0 exps, doc (showString ">>")])
-    GoalMinimize _ exps -> prPrec i 0 (concatD [doc (showString "<<"), doc (showString "minimize"), prt 0 exps, doc (showString ">>")])
-    GoalMaximize _ exps -> prPrec i 0 (concatD [doc (showString "<<"), doc (showString "maximize"), prt 0 exps, doc (showString ">>")])
-
-instance Print Abstract where
-  prt i e = case e of
-    AbstractEmpty _ -> prPrec i 0 (concatD [])
-    Abstract _ -> prPrec i 0 (concatD [doc (showString "abstract")])
-
-instance Print Elements where
-  prt i e = case e of
-    ElementsEmpty _ -> prPrec i 0 (concatD [])
-    ElementsList _ elements -> prPrec i 0 (concatD [doc (showString "{"), prt 0 elements, doc (showString "}")])
-
-instance Print Element where
-  prt i e = case e of
-    Subclafer _ clafer -> prPrec i 0 (concatD [prt 0 clafer])
-    ClaferUse _ name card elements -> prPrec i 0 (concatD [doc (showString "`"), prt 0 name, prt 0 card, prt 0 elements])
-    Subconstraint _ constraint -> prPrec i 0 (concatD [prt 0 constraint])
-    Subgoal _ goal -> prPrec i 0 (concatD [prt 0 goal])
-    SubAssertion _ assertion -> prPrec i 0 (concatD [prt 0 assertion])
-  prtList _ [] = (concatD [])
-  prtList _ (x:xs) = (concatD [prt 0 x, prt 0 xs])
-instance Print Super where
-  prt i e = case e of
-    SuperEmpty _ -> prPrec i 0 (concatD [])
-    SuperSome _ exp -> prPrec i 0 (concatD [doc (showString ":"), prt 18 exp])
-
-instance Print Reference where
-  prt i e = case e of
-    ReferenceEmpty _ -> prPrec i 0 (concatD [])
-    ReferenceSet _ exp -> prPrec i 0 (concatD [doc (showString "->"), prt 15 exp])
-    ReferenceBag _ exp -> prPrec i 0 (concatD [doc (showString "->>"), prt 15 exp])
-
-instance Print Init where
-  prt i e = case e of
-    InitEmpty _ -> prPrec i 0 (concatD [])
-    InitSome _ inithow exp -> prPrec i 0 (concatD [prt 0 inithow, prt 0 exp])
-
-instance Print InitHow where
-  prt i e = case e of
-    InitConstant _ -> prPrec i 0 (concatD [doc (showString "=")])
-    InitDefault _ -> prPrec i 0 (concatD [doc (showString ":=")])
-
-instance Print GCard where
-  prt i e = case e of
-    GCardEmpty _ -> prPrec i 0 (concatD [])
-    GCardXor _ -> prPrec i 0 (concatD [doc (showString "xor")])
-    GCardOr _ -> prPrec i 0 (concatD [doc (showString "or")])
-    GCardMux _ -> prPrec i 0 (concatD [doc (showString "mux")])
-    GCardOpt _ -> prPrec i 0 (concatD [doc (showString "opt")])
-    GCardInterval _ ncard -> prPrec i 0 (concatD [prt 0 ncard])
-
-instance Print Card where
-  prt i e = case e of
-    CardEmpty _ -> prPrec i 0 (concatD [])
-    CardLone _ -> prPrec i 0 (concatD [doc (showString "?")])
-    CardSome _ -> prPrec i 0 (concatD [doc (showString "+")])
-    CardAny _ -> prPrec i 0 (concatD [doc (showString "*")])
-    CardNum _ posinteger -> prPrec i 0 (concatD [prt 0 posinteger])
-    CardInterval _ ncard -> prPrec i 0 (concatD [prt 0 ncard])
-
-instance Print NCard where
-  prt i e = case e of
-    NCard _ posinteger exinteger -> prPrec i 0 (concatD [prt 0 posinteger, doc (showString ".."), prt 0 exinteger])
-
-instance Print ExInteger where
-  prt i e = case e of
-    ExIntegerAst _ -> prPrec i 0 (concatD [doc (showString "*")])
-    ExIntegerNum _ posinteger -> prPrec i 0 (concatD [prt 0 posinteger])
-
-instance Print Name where
-  prt i e = case e of
-    Path _ modids -> prPrec i 0 (concatD [prt 0 modids])
-
-instance Print Exp where
-  prt i e = case e of
-    EDeclAllDisj _ decl exp -> prPrec i 0 (concatD [doc (showString "all"), doc (showString "disj"), prt 0 decl, doc (showString "|"), prt 0 exp])
-    EDeclAll _ decl exp -> prPrec i 0 (concatD [doc (showString "all"), prt 0 decl, doc (showString "|"), prt 0 exp])
-    EDeclQuantDisj _ quant decl exp -> prPrec i 0 (concatD [prt 0 quant, doc (showString "disj"), prt 0 decl, doc (showString "|"), prt 0 exp])
-    EDeclQuant _ quant decl exp -> prPrec i 0 (concatD [prt 0 quant, prt 0 decl, doc (showString "|"), prt 0 exp])
-    EImpliesElse _ exp1 exp2 exp3 -> prPrec i 0 (concatD [doc (showString "if"), prt 0 exp1, doc (showString "then"), prt 0 exp2, doc (showString "else"), prt 0 exp3])
-    EIff _ exp1 exp2 -> prPrec i 0 (concatD [prt 0 exp1, doc (showString "<=>"), prt 1 exp2])
-    EImplies _ exp1 exp2 -> prPrec i 2 (concatD [prt 2 exp1, doc (showString "=>"), prt 3 exp2])
-    EOr _ exp1 exp2 -> prPrec i 3 (concatD [prt 3 exp1, doc (showString "||"), prt 4 exp2])
-    EXor _ exp1 exp2 -> prPrec i 4 (concatD [prt 4 exp1, doc (showString "xor"), prt 5 exp2])
-    EAnd _ exp1 exp2 -> prPrec i 5 (concatD [prt 5 exp1, doc (showString "&&"), prt 6 exp2])
-    ENeg _ exp -> prPrec i 6 (concatD [doc (showString "!"), prt 7 exp])
-    ELt _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "<"), prt 8 exp2])
-    EGt _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString ">"), prt 8 exp2])
-    EEq _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "="), prt 8 exp2])
-    ELte _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "<="), prt 8 exp2])
-    EGte _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString ">="), prt 8 exp2])
-    ENeq _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "!="), prt 8 exp2])
-    EIn _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "in"), prt 8 exp2])
-    ENin _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "not"), doc (showString "in"), prt 8 exp2])
-    EQuantExp _ quant exp -> prPrec i 8 (concatD [prt 0 quant, prt 12 exp])
-    EAdd _ exp1 exp2 -> prPrec i 9 (concatD [prt 9 exp1, doc (showString "+"), prt 10 exp2])
-    ESub _ exp1 exp2 -> prPrec i 9 (concatD [prt 9 exp1, doc (showString "-"), prt 10 exp2])
-    EMul _ exp1 exp2 -> prPrec i 10 (concatD [prt 10 exp1, doc (showString "*"), prt 11 exp2])
-    EDiv _ exp1 exp2 -> prPrec i 10 (concatD [prt 10 exp1, doc (showString "/"), prt 11 exp2])
-    ERem _ exp1 exp2 -> prPrec i 10 (concatD [prt 10 exp1, doc (showString "%"), prt 11 exp2])
-    EGMax _ exp -> prPrec i 11 (concatD [doc (showString "max"), prt 12 exp])
-    EGMin _ exp -> prPrec i 11 (concatD [doc (showString "min"), prt 12 exp])
-    ESum _ exp -> prPrec i 12 (concatD [doc (showString "sum"), prt 13 exp])
-    EProd _ exp -> prPrec i 12 (concatD [doc (showString "product"), prt 13 exp])
-    ECard _ exp -> prPrec i 12 (concatD [doc (showString "#"), prt 13 exp])
-    EMinExp _ exp -> prPrec i 12 (concatD [doc (showString "-"), prt 13 exp])
-    EDomain _ exp1 exp2 -> prPrec i 13 (concatD [prt 13 exp1, doc (showString "<:"), prt 14 exp2])
-    ERange _ exp1 exp2 -> prPrec i 14 (concatD [prt 14 exp1, doc (showString ":>"), prt 15 exp2])
-    EUnion _ exp1 exp2 -> prPrec i 15 (concatD [prt 15 exp1, doc (showString "++"), prt 16 exp2])
-    EUnionCom _ exp1 exp2 -> prPrec i 15 (concatD [prt 15 exp1, doc (showString ","), prt 16 exp2])
-    EDifference _ exp1 exp2 -> prPrec i 16 (concatD [prt 16 exp1, doc (showString "--"), prt 17 exp2])
-    EIntersection _ exp1 exp2 -> prPrec i 17 (concatD [prt 17 exp1, doc (showString "**"), prt 18 exp2])
-    EIntersectionDeprecated _ exp1 exp2 -> prPrec i 17 (concatD [prt 17 exp1, doc (showString "&"), prt 18 exp2])
-    EJoin _ exp1 exp2 -> prPrec i 18 (concatD [prt 18 exp1, doc (showString "."), prt 19 exp2])
-    ClaferId _ name -> prPrec i 19 (concatD [prt 0 name])
-    EInt _ posinteger -> prPrec i 19 (concatD [prt 0 posinteger])
-    EDouble _ posdouble -> prPrec i 19 (concatD [prt 0 posdouble])
-    EReal _ posreal -> prPrec i 19 (concatD [prt 0 posreal])
-    EStr _ posstring -> prPrec i 19 (concatD [prt 0 posstring])
-  prtList _ [] = (concatD [])
-  prtList _ (x:xs) = (concatD [prt 0 x, prt 0 xs])
-instance Print Decl where
-  prt i e = case e of
-    Decl _ locids exp -> prPrec i 0 (concatD [prt 0 locids, doc (showString ":"), prt 15 exp])
-
-instance Print Quant where
-  prt i e = case e of
-    QuantNo _ -> prPrec i 0 (concatD [doc (showString "no")])
-    QuantNot _ -> prPrec i 0 (concatD [doc (showString "not")])
-    QuantLone _ -> prPrec i 0 (concatD [doc (showString "lone")])
-    QuantOne _ -> prPrec i 0 (concatD [doc (showString "one")])
-    QuantSome _ -> prPrec i 0 (concatD [doc (showString "some")])
-
-instance Print EnumId where
-  prt i e = case e of
-    EnumIdIdent _ posident -> prPrec i 0 (concatD [prt 0 posident])
-  prtList _ [x] = (concatD [prt 0 x])
-  prtList _ (x:xs) = (concatD [prt 0 x, doc (showString "|"), prt 0 xs])
-instance Print ModId where
-  prt i e = case e of
-    ModIdIdent _ posident -> prPrec i 0 (concatD [prt 0 posident])
-  prtList _ [x] = (concatD [prt 0 x])
-  prtList _ (x:xs) = (concatD [prt 0 x, doc (showString "\\"), prt 0 xs])
-instance Print LocId where
-  prt i e = case e of
-    LocIdIdent _ posident -> prPrec i 0 (concatD [prt 0 posident])
-  prtList _ [x] = (concatD [prt 0 x])
-  prtList _ (x:xs) = (concatD [prt 0 x, doc (showString ";"), prt 0 xs])
+{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
+module Language.Clafer.Front.PrintClafer where
+
+-- pretty-printer generated by the BNF converter
+
+import Language.Clafer.Front.AbsClafer
+import Data.Char
+import Prelude hiding (exp, init)
+
+-- the top-level printing method
+printTree :: Print a => a -> String
+printTree = render . prt 0
+
+type Doc = [ShowS] -> [ShowS]
+
+doc :: ShowS -> Doc
+doc = (:)
+
+render :: Doc -> String
+render d = rend 0 (map ($ "") $ d []) "" where
+  rend i ss = case ss of
+    "["      :ts -> showChar '[' . rend i ts
+    "("      :ts -> showChar '(' . rend i ts
+    "{"      :ts -> showChar '{' . new (i+1) . rend (i+1) ts
+    "}" : ";":ts -> new (i-1) . space "}" . showChar ';' . new (i-1) . rend (i-1) ts
+    "}"      :ts -> new (i-1) . showChar '}' . new (i-1) . rend (i-1) ts
+    ";"      :ts -> showChar ';' . new i . rend i ts
+    t  : "," :ts -> showString t . space "," . rend i ts
+    t  : ")" :ts -> showString t . showChar ')' . rend i ts
+    t  : "]" :ts -> showString t . showChar ']' . rend i ts
+    t        :ts -> space t . rend i ts
+    _            -> id
+  new i   = showChar '\n' . replicateS (2*i) (showChar ' ') . dropWhile isSpace
+  space t = showString t . (\s -> if null s then "" else (' ':s))
+
+parenth :: Doc -> Doc
+parenth ss = doc (showChar '(') . ss . doc (showChar ')')
+
+concatS :: [ShowS] -> ShowS
+concatS = foldr (.) id
+
+concatD :: [Doc] -> Doc
+concatD = foldr (.) id
+
+replicateS :: Int -> ShowS -> ShowS
+replicateS n f = concatS (replicate n f)
+
+-- the printer class does the job
+class Print a where
+  prt :: Int -> a -> Doc
+  prtList :: Int -> [a] -> Doc
+  prtList i = concatD . map (prt i)
+
+instance Print a => Print [a] where
+  prt = prtList
+
+instance Print Char where
+  prt _ s = doc (showChar '\'' . mkEsc '\'' s . showChar '\'')
+  prtList _ s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"')
+
+mkEsc :: Char -> Char -> ShowS
+mkEsc q s = case s of
+  _ | s == q -> showChar '\\' . showChar s
+  '\\'-> showString "\\\\"
+  '\n' -> showString "\\n"
+  '\t' -> showString "\\t"
+  _ -> showChar s
+
+prPrec :: Int -> Int -> Doc -> Doc
+prPrec i j = if j<i then parenth else id
+
+
+instance Print Integer where
+  prt _ x = doc (shows x)
+
+
+instance Print Double where
+  prt _ x = doc (shows x)
+
+
+
+instance Print PosInteger where
+  prt _ (PosInteger (_,i)) = doc (showString ( i))
+
+
+instance Print PosDouble where
+  prt _ (PosDouble (_,i)) = doc (showString ( i))
+
+
+instance Print PosReal where
+  prt _ (PosReal (_,i)) = doc (showString ( i))
+
+
+instance Print PosString where
+  prt _ (PosString (_,i)) = doc (showString ( i))
+
+
+instance Print PosIdent where
+  prt _ (PosIdent (_,i)) = doc (showString ( i))
+
+
+instance Print PosLineComment where
+  prt _ (PosLineComment (_,i)) = doc (showString ( i))
+
+
+instance Print PosBlockComment where
+  prt _ (PosBlockComment (_,i)) = doc (showString ( i))
+
+
+instance Print PosAlloy where
+  prt _ (PosAlloy (_,i)) = doc (showString ( i))
+
+
+instance Print PosChoco where
+  prt _ (PosChoco (_,i)) = doc (showString ( i))
+
+
+
+instance Print Module where
+  prt i e = case e of
+    Module _ declarations -> prPrec i 0 (concatD [prt 0 declarations])
+
+instance Print Declaration where
+  prt i e = case e of
+    EnumDecl _ posident enumids -> prPrec i 0 (concatD [doc (showString "enum"), prt 0 posident, doc (showString "="), prt 0 enumids])
+    ElementDecl _ element -> prPrec i 0 (concatD [prt 0 element])
+  prtList _ [] = (concatD [])
+  prtList _ (x:xs) = (concatD [prt 0 x, prt 0 xs])
+instance Print Clafer where
+  prt i e = case e of
+    Clafer _ abstract gcard posident super reference card init elements -> prPrec i 0 (concatD [prt 0 abstract, prt 0 gcard, prt 0 posident, prt 0 super, prt 0 reference, prt 0 card, prt 0 init, prt 0 elements])
+
+instance Print Constraint where
+  prt i e = case e of
+    Constraint _ exps -> prPrec i 0 (concatD [doc (showString "["), prt 0 exps, doc (showString "]")])
+
+instance Print Assertion where
+  prt i e = case e of
+    Assertion _ exps -> prPrec i 0 (concatD [doc (showString "assert"), doc (showString "["), prt 0 exps, doc (showString "]")])
+
+instance Print Goal where
+  prt i e = case e of
+    GoalMinDeprecated _ exps -> prPrec i 0 (concatD [doc (showString "<<"), doc (showString "min"), prt 0 exps, doc (showString ">>")])
+    GoalMaxDeprecated _ exps -> prPrec i 0 (concatD [doc (showString "<<"), doc (showString "max"), prt 0 exps, doc (showString ">>")])
+    GoalMinimize _ exps -> prPrec i 0 (concatD [doc (showString "<<"), doc (showString "minimize"), prt 0 exps, doc (showString ">>")])
+    GoalMaximize _ exps -> prPrec i 0 (concatD [doc (showString "<<"), doc (showString "maximize"), prt 0 exps, doc (showString ">>")])
+
+instance Print Abstract where
+  prt i e = case e of
+    AbstractEmpty _ -> prPrec i 0 (concatD [])
+    Abstract _ -> prPrec i 0 (concatD [doc (showString "abstract")])
+
+instance Print Elements where
+  prt i e = case e of
+    ElementsEmpty _ -> prPrec i 0 (concatD [])
+    ElementsList _ elements -> prPrec i 0 (concatD [doc (showString "{"), prt 0 elements, doc (showString "}")])
+
+instance Print Element where
+  prt i e = case e of
+    Subclafer _ clafer -> prPrec i 0 (concatD [prt 0 clafer])
+    ClaferUse _ name card elements -> prPrec i 0 (concatD [doc (showString "`"), prt 0 name, prt 0 card, prt 0 elements])
+    Subconstraint _ constraint -> prPrec i 0 (concatD [prt 0 constraint])
+    Subgoal _ goal -> prPrec i 0 (concatD [prt 0 goal])
+    SubAssertion _ assertion -> prPrec i 0 (concatD [prt 0 assertion])
+  prtList _ [] = (concatD [])
+  prtList _ (x:xs) = (concatD [prt 0 x, prt 0 xs])
+instance Print Super where
+  prt i e = case e of
+    SuperEmpty _ -> prPrec i 0 (concatD [])
+    SuperSome _ exp -> prPrec i 0 (concatD [doc (showString ":"), prt 18 exp])
+
+instance Print Reference where
+  prt i e = case e of
+    ReferenceEmpty _ -> prPrec i 0 (concatD [])
+    ReferenceSet _ exp -> prPrec i 0 (concatD [doc (showString "->"), prt 15 exp])
+    ReferenceBag _ exp -> prPrec i 0 (concatD [doc (showString "->>"), prt 15 exp])
+
+instance Print Init where
+  prt i e = case e of
+    InitEmpty _ -> prPrec i 0 (concatD [])
+    InitSome _ inithow exp -> prPrec i 0 (concatD [prt 0 inithow, prt 0 exp])
+
+instance Print InitHow where
+  prt i e = case e of
+    InitConstant _ -> prPrec i 0 (concatD [doc (showString "=")])
+    InitDefault _ -> prPrec i 0 (concatD [doc (showString ":=")])
+
+instance Print GCard where
+  prt i e = case e of
+    GCardEmpty _ -> prPrec i 0 (concatD [])
+    GCardXor _ -> prPrec i 0 (concatD [doc (showString "xor")])
+    GCardOr _ -> prPrec i 0 (concatD [doc (showString "or")])
+    GCardMux _ -> prPrec i 0 (concatD [doc (showString "mux")])
+    GCardOpt _ -> prPrec i 0 (concatD [doc (showString "opt")])
+    GCardInterval _ ncard -> prPrec i 0 (concatD [prt 0 ncard])
+
+instance Print Card where
+  prt i e = case e of
+    CardEmpty _ -> prPrec i 0 (concatD [])
+    CardLone _ -> prPrec i 0 (concatD [doc (showString "?")])
+    CardSome _ -> prPrec i 0 (concatD [doc (showString "+")])
+    CardAny _ -> prPrec i 0 (concatD [doc (showString "*")])
+    CardNum _ posinteger -> prPrec i 0 (concatD [prt 0 posinteger])
+    CardInterval _ ncard -> prPrec i 0 (concatD [prt 0 ncard])
+
+instance Print NCard where
+  prt i e = case e of
+    NCard _ posinteger exinteger -> prPrec i 0 (concatD [prt 0 posinteger, doc (showString ".."), prt 0 exinteger])
+
+instance Print ExInteger where
+  prt i e = case e of
+    ExIntegerAst _ -> prPrec i 0 (concatD [doc (showString "*")])
+    ExIntegerNum _ posinteger -> prPrec i 0 (concatD [prt 0 posinteger])
+
+instance Print Name where
+  prt i e = case e of
+    Path _ modids -> prPrec i 0 (concatD [prt 0 modids])
+
+instance Print Exp where
+  prt i e = case e of
+    EDeclAllDisj _ decl exp -> prPrec i 0 (concatD [doc (showString "all"), doc (showString "disj"), prt 0 decl, doc (showString "|"), prt 0 exp])
+    EDeclAll _ decl exp -> prPrec i 0 (concatD [doc (showString "all"), prt 0 decl, doc (showString "|"), prt 0 exp])
+    EDeclQuantDisj _ quant decl exp -> prPrec i 0 (concatD [prt 0 quant, doc (showString "disj"), prt 0 decl, doc (showString "|"), prt 0 exp])
+    EDeclQuant _ quant decl exp -> prPrec i 0 (concatD [prt 0 quant, prt 0 decl, doc (showString "|"), prt 0 exp])
+    EImpliesElse _ exp1 exp2 exp3 -> prPrec i 0 (concatD [doc (showString "if"), prt 0 exp1, doc (showString "then"), prt 0 exp2, doc (showString "else"), prt 0 exp3])
+    EIff _ exp1 exp2 -> prPrec i 0 (concatD [prt 0 exp1, doc (showString "<=>"), prt 1 exp2])
+    EImplies _ exp1 exp2 -> prPrec i 2 (concatD [prt 2 exp1, doc (showString "=>"), prt 3 exp2])
+    EOr _ exp1 exp2 -> prPrec i 3 (concatD [prt 3 exp1, doc (showString "||"), prt 4 exp2])
+    EXor _ exp1 exp2 -> prPrec i 4 (concatD [prt 4 exp1, doc (showString "xor"), prt 5 exp2])
+    EAnd _ exp1 exp2 -> prPrec i 5 (concatD [prt 5 exp1, doc (showString "&&"), prt 6 exp2])
+    ENeg _ exp -> prPrec i 6 (concatD [doc (showString "!"), prt 7 exp])
+    ELt _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "<"), prt 8 exp2])
+    EGt _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString ">"), prt 8 exp2])
+    EEq _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "="), prt 8 exp2])
+    ELte _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "<="), prt 8 exp2])
+    EGte _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString ">="), prt 8 exp2])
+    ENeq _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "!="), prt 8 exp2])
+    EIn _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "in"), prt 8 exp2])
+    ENin _ exp1 exp2 -> prPrec i 7 (concatD [prt 7 exp1, doc (showString "not"), doc (showString "in"), prt 8 exp2])
+    EQuantExp _ quant exp -> prPrec i 8 (concatD [prt 0 quant, prt 12 exp])
+    EAdd _ exp1 exp2 -> prPrec i 9 (concatD [prt 9 exp1, doc (showString "+"), prt 10 exp2])
+    ESub _ exp1 exp2 -> prPrec i 9 (concatD [prt 9 exp1, doc (showString "-"), prt 10 exp2])
+    EMul _ exp1 exp2 -> prPrec i 10 (concatD [prt 10 exp1, doc (showString "*"), prt 11 exp2])
+    EDiv _ exp1 exp2 -> prPrec i 10 (concatD [prt 10 exp1, doc (showString "/"), prt 11 exp2])
+    ERem _ exp1 exp2 -> prPrec i 10 (concatD [prt 10 exp1, doc (showString "%"), prt 11 exp2])
+    EGMax _ exp -> prPrec i 11 (concatD [doc (showString "max"), prt 12 exp])
+    EGMin _ exp -> prPrec i 11 (concatD [doc (showString "min"), prt 12 exp])
+    ESum _ exp -> prPrec i 12 (concatD [doc (showString "sum"), prt 13 exp])
+    EProd _ exp -> prPrec i 12 (concatD [doc (showString "product"), prt 13 exp])
+    ECard _ exp -> prPrec i 12 (concatD [doc (showString "#"), prt 13 exp])
+    EMinExp _ exp -> prPrec i 12 (concatD [doc (showString "-"), prt 13 exp])
+    EDomain _ exp1 exp2 -> prPrec i 13 (concatD [prt 13 exp1, doc (showString "<:"), prt 14 exp2])
+    ERange _ exp1 exp2 -> prPrec i 14 (concatD [prt 14 exp1, doc (showString ":>"), prt 15 exp2])
+    EUnion _ exp1 exp2 -> prPrec i 15 (concatD [prt 15 exp1, doc (showString "++"), prt 16 exp2])
+    EUnionCom _ exp1 exp2 -> prPrec i 15 (concatD [prt 15 exp1, doc (showString ","), prt 16 exp2])
+    EDifference _ exp1 exp2 -> prPrec i 16 (concatD [prt 16 exp1, doc (showString "--"), prt 17 exp2])
+    EIntersection _ exp1 exp2 -> prPrec i 17 (concatD [prt 17 exp1, doc (showString "**"), prt 18 exp2])
+    EIntersectionDeprecated _ exp1 exp2 -> prPrec i 17 (concatD [prt 17 exp1, doc (showString "&"), prt 18 exp2])
+    EJoin _ exp1 exp2 -> prPrec i 18 (concatD [prt 18 exp1, doc (showString "."), prt 19 exp2])
+    ClaferId _ name -> prPrec i 19 (concatD [prt 0 name])
+    EInt _ posinteger -> prPrec i 19 (concatD [prt 0 posinteger])
+    EDouble _ posdouble -> prPrec i 19 (concatD [prt 0 posdouble])
+    EReal _ posreal -> prPrec i 19 (concatD [prt 0 posreal])
+    EStr _ posstring -> prPrec i 19 (concatD [prt 0 posstring])
+  prtList _ [] = (concatD [])
+  prtList _ (x:xs) = (concatD [prt 0 x, prt 0 xs])
+instance Print Decl where
+  prt i e = case e of
+    Decl _ locids exp -> prPrec i 0 (concatD [prt 0 locids, doc (showString ":"), prt 15 exp])
+
+instance Print Quant where
+  prt i e = case e of
+    QuantNo _ -> prPrec i 0 (concatD [doc (showString "no")])
+    QuantNot _ -> prPrec i 0 (concatD [doc (showString "not")])
+    QuantLone _ -> prPrec i 0 (concatD [doc (showString "lone")])
+    QuantOne _ -> prPrec i 0 (concatD [doc (showString "one")])
+    QuantSome _ -> prPrec i 0 (concatD [doc (showString "some")])
+
+instance Print EnumId where
+  prt i e = case e of
+    EnumIdIdent _ posident -> prPrec i 0 (concatD [prt 0 posident])
+  prtList _ [x] = (concatD [prt 0 x])
+  prtList _ (x:xs) = (concatD [prt 0 x, doc (showString "|"), prt 0 xs])
+instance Print ModId where
+  prt i e = case e of
+    ModIdIdent _ posident -> prPrec i 0 (concatD [prt 0 posident])
+  prtList _ [x] = (concatD [prt 0 x])
+  prtList _ (x:xs) = (concatD [prt 0 x, doc (showString "\\"), prt 0 xs])
+instance Print LocId where
+  prt i e = case e of
+    LocIdIdent _ posident -> prPrec i 0 (concatD [prt 0 posident])
+  prtList _ [x] = (concatD [prt 0 x])
+  prtList _ (x:xs) = (concatD [prt 0 x, doc (showString ";"), prt 0 xs])
diff --git a/src/Language/Clafer/Generator/Alloy.hs b/src/Language/Clafer/Generator/Alloy.hs
--- a/src/Language/Clafer/Generator/Alloy.hs
+++ b/src/Language/Clafer/Generator/Alloy.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE RankNTypes, FlexibleContexts #-}
 {-
- Copyright (C) 2012-2015 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Rafael Olaechea <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Rafael Olaechea <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Generator/Choco.hs b/src/Language/Clafer/Generator/Choco.hs
--- a/src/Language/Clafer/Generator/Choco.hs
+++ b/src/Language/Clafer/Generator/Choco.hs
@@ -1,228 +1,245 @@
-{-# LANGUAGE NamedFieldPuns #-}
-
--- | Generates JS representation of IR for the <https://github.com/gsdlab/chocosolver Chocosolver>.
-module Language.Clafer.Generator.Choco (genCModule) where
-
-import Control.Applicative
-import Control.Lens.Plated hiding (rewrite)
-import Control.Monad
-import Data.Data.Lens
-import Data.List
-import Data.Maybe
-import Data.Ord
-import Prelude hiding (exp)
-import Language.Clafer.Common
-import Language.Clafer.Intermediate.Intclafer
-import Language.Clafer.Front.LexClafer
-
-
--- | Choco 3 code generation
-genCModule :: (IModule, GEnv) -> [(UID, Integer)] -> [Token]     -> Result
-genCModule (imodule@IModule{_mDecls}, genv') scopes  otherTokens' =
-    genScopes
-    ++ "\n"
-    ++ (genClafers =<< _mDecls)
-    ++ (genSuperRefConstraintAssertGoal "root" =<< _mDecls)
-    ++ genChocoEscapes
-    where
-    uidIClaferMap' = uidClaferMap genv'
-
-    genClafers :: IElement -> String
-    genClafers    (IEClafer (c@IClafer{_uid, _gcard, _elements}))
-        = _uid
-        ++ genClaferNesting c
-        ++ prop "withGroupCard" (genCard $ _interval <$> _gcard)
-        ++ ";\n"
-        ++ (genClafers =<< _elements)
-    genClafers    _ = ""
-
-    genClaferNesting (IClafer{_isAbstract=True, _uid, _parentUID="clafer"})
-        = " = Abstract(\"" ++ _uid ++ "\")"
-    genClaferNesting (IClafer{_isAbstract=True, _uid, _parentUID})
-        = " = " ++ _parentUID ++  ".addAbstractChild(\"" ++ _uid ++ "\")"
-    genClaferNesting (IClafer{_isAbstract=False, _uid, _card, _parentUID="root"})
-        = " = Clafer(\"" ++ _uid ++ "\")"
-        ++ prop "withCard" (genCard _card)
-    genClaferNesting (IClafer{_isAbstract=False, _uid, _card, _parentUID})
-        = " = "
-        ++ _parentUID
-        ++  ".addChild(\"" ++ _uid ++ "\")"
-        ++ prop "withCard" (genCard _card)
-
-    prop name value =
-        case value of
-                Just value' -> "." ++ name ++ "(" ++ value' ++ ")"
-                Nothing     -> ""
-
-    claferWithUid u = fromMaybe (error $ "claferWithUid: \"" ++ u ++ "\" is not a clafer") $ findIClafer uidIClaferMap' u
-
-    superOf u =
-        case _super $ claferWithUid u of
-            Just (PExp{_exp = IClaferId{_sident}})
-                | _sident == baseClafer -> Nothing
-                | isPrimitive _sident   -> Nothing
-                | otherwise             -> Just _sident
-            _ -> Nothing
-
-    genCard :: Maybe Interval -> Maybe String
-    genCard (Just (0, -1)) = Nothing
-    genCard (Just (low, -1)) = return $ show low
-    genCard (Just (low, high)) = return $ show low ++ ", " ++ show high
-    genCard _              = Nothing
-
-
-    genScopes :: Result
-    genScopes =
-        (if null scopeMap then "" else "scope({" ++ intercalate ", " scopeMap ++ "});\n")
-        ++ "defaultScope(1);\n"
-        ++ "intRange(-" ++ show largestPositiveInt ++ ", " ++ show (largestPositiveInt - 1) ++ ");\n"
-        ++ "stringLength(" ++ show longestString ++ ");\n"
-        where
-            largestPositiveInt :: Integer
-            largestPositiveInt = 2 ^ (bitwidth - 1)
-            scopeMap = [uid' ++ ":" ++ show scope | (uid', scope) <- scopes, uid' /= "int"]
-
-    genChocoEscapes :: String
-    genChocoEscapes = concatMap printChocoEscape otherTokens'
-        where
-            printChocoEscape (PT _ (T_PosChoco code)) =  let
-                code' = fromJust $ stripPrefix "[choco|" code
-              in
-                take (length code' - 2) code'
-            printChocoEscape _                        = ""
-
-    exprs :: [IExp]
-    exprs = universeOn biplate imodule
-
-    stringLength :: IExp -> Maybe Int
-    stringLength (IStr string) = Just $ length string
-    stringLength _ = Nothing
-
-    longestString :: Int
-    longestString = maximum $ 16 : mapMaybe stringLength exprs
-
-    genSuperRefConstraintAssertGoal :: String -> IElement -> Result
-    genSuperRefConstraintAssertGoal _ IEClafer{_iClafer=IClafer{_uid, _super=Nothing, _reference=Nothing, _elements}}
-        = genSuperRefConstraintAssertGoal _uid =<< _elements
-    genSuperRefConstraintAssertGoal _ (IEClafer c@IClafer{_uid, _card, _super, _reference, _elements})
-        = _uid
-        ++ prop "extending" (superOf _uid)
-        ++ (case (getReference c, _reference, _card) of
-             ([target], Just (IReference True _), Just (lb, ub))  -> if lb > 1 || ub > 1 || lb == -1 || ub == -1
-                then ".refToUnique(" ++ genTarget target ++ ")"
-                else ".refTo(" ++ genTarget target ++ ")"
-             ([target], Just (IReference _ _), _) -> ".refTo(" ++ genTarget target ++ ")"
-             _ -> "")
-        ++ ";\n"
-        ++ (genSuperRefConstraintAssertGoal _uid =<< _elements)
-        where
-            genTarget "integer" = "Int"
-            genTarget "int" = "Int"
-            genTarget target = target
-    genSuperRefConstraintAssertGoal "root" (IEConstraint True pexp) = "Constraint(" ++ genConstraintPExp pexp ++ ");\n"
-    genSuperRefConstraintAssertGoal pUID (IEConstraint True pexp) = pUID ++ ".addConstraint(" ++ genConstraintPExp pexp ++ ");\n"
-    genSuperRefConstraintAssertGoal _ (IEConstraint False pexp) = "assert(" ++ genConstraintPExp pexp ++ ");\n"
-    genSuperRefConstraintAssertGoal _ (IEGoal True PExp{_exp=IFunExp _ [pexp]})  = "max(" ++ genConstraintPExp pexp ++ ");\n"
-    genSuperRefConstraintAssertGoal _ (IEGoal False PExp{_exp=IFunExp _ [pexp]})  = "min(" ++ genConstraintPExp pexp ++ ");\n"
-    genSuperRefConstraintAssertGoal _ _ = ""
-
-
-    rewrite :: PExp -> PExp
-    -- Rearrange right joins to left joins.
-    rewrite p1@PExp{_iType = Just _, _exp = IFunExp "." [p2, p3@PExp{_exp = IFunExp "." _}]} =
-        p1{_exp = IFunExp "." [p3{_iType = _iType p4, _exp = IFunExp "." [p2, p4]}, p5]}
-        where
-            PExp{_exp = IFunExp "." [p4, p5]} = rewrite p3
-    rewrite p1@PExp{_exp = IFunExp{_op = "-", _exps = [PExp{_exp = IInt i}]}} =
-        -- This is so that the output looks cleaner, no other purpose since the Choco optimizer
-        -- in the backend will treat the pre-rewritten expression the same.
-        p1{_exp = IInt (-i)}
-    rewrite p = p
-
-    genConstraintPExp :: PExp -> String
-    genConstraintPExp = genConstraintExp . _exp . rewrite
-
-    genConstraintExp :: IExp -> String
-    genConstraintExp (IDeclPExp quant' [] body') =
-        mapQuant quant' ++ "(" ++ genConstraintPExp body' ++ ")"
-    genConstraintExp (IDeclPExp quant' decls' body') =
-        mapQuant quant' ++ "([" ++ intercalate ", " (map genDecl decls') ++ "], " ++ genConstraintPExp body' ++ ")"
-        where
-            genDecl (IDecl isDisj' locals body'') =
-                (if isDisj' then "disjDecl" else "decl") ++ "([" ++ intercalate ", " (map genLocal locals) ++ "], " ++ genConstraintPExp body'' ++ ")"
-            genLocal local =
-                local ++ " = local(\"" ++ local ++ "\")"
-
-    genConstraintExp (IFunExp "." [PExp{_exp = IClaferId{_sident = "root"}}, e2]) =
-        genConstraintPExp e2
-    genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident = "dref"}}]) =
-        "joinRef(" ++ genConstraintPExp e1 ++ ")"
-    genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident = "parent"}}]) =
-        "joinParent(" ++ genConstraintPExp e1 ++ ")"
-    genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident}}]) =
-        "join(" ++ genConstraintPExp e1 ++ ", " ++ _sident ++ ")"
-    genConstraintExp (IFunExp "." [_, _]) =
-        error "Did not rewrite all joins to left joins."
-    genConstraintExp (IFunExp "-" [arg]) =
-        "minus(" ++ genConstraintPExp arg ++ ")"
-    genConstraintExp (IFunExp "-" [arg1, arg2]) =
-        "sub(" ++ genConstraintPExp arg1 ++ ", " ++ genConstraintPExp arg2 ++ ")"
-    genConstraintExp (IFunExp "sum" args')
-        | [arg] <- args', PExp{_exp = IFunExp{_exps = [a, PExp{_exp = IClaferId{_sident = "dref"}}]}} <- rewrite arg =
-            "sum(" ++ genConstraintPExp a ++ ")"
-        | [arg] <- args' =
-            "sum(" ++ genConstraintPExp arg ++ ")"
-        | otherwise = error $ "[bug] Choco.genConstraintExp: Unexpected sum argument: " ++ show args'
-    genConstraintExp (IFunExp "product" args')
-        | [arg] <- args', PExp{_exp = IFunExp{_exps = [a, PExp{_exp = IClaferId{_sident = "dref"}}]}} <- rewrite arg =
-            "product(" ++ genConstraintPExp a ++ ")"
-        | otherwise = error "Choco: Unexpected product argument."
-    genConstraintExp (IFunExp "+" args') =
-        (if _iType (head args') == Just TString then "concat" else "add") ++
-            "(" ++ intercalate ", " (map genConstraintPExp args') ++ ")"
-    genConstraintExp (IFunExp op' args') =
-        mapFunc op' ++ "(" ++ intercalate ", " (map genConstraintPExp args') ++ ")"
-    -- this is a keyword in Javascript so use "$this" instead
-    genConstraintExp IClaferId{_sident = "this"} = "$this()"
-    genConstraintExp IClaferId{_sident}
-        | isJust $ findIClafer uidIClaferMap' _sident = "global(" ++ _sident ++ ")"
-        | otherwise                = _sident
-    genConstraintExp (IInt val) = "constant(" ++ show val ++ ")"
-    genConstraintExp (IStr val) = "constant(" ++ show val ++ ")"
-    genConstraintExp (IDouble val) = "constant(" ++ show val ++ ")"
-    genConstraintExp (IReal val) = "constant(" ++ show val ++ ")"
-
-    mapQuant INo = "none"
-    mapQuant ISome = "some"
-    mapQuant IAll = "all"
-    mapQuant IOne = "one"
-    mapQuant ILone = "lone"
-
-    mapFunc "!" = "not"
-    mapFunc "#" = "card"
-    mapFunc "min" = "minimum"
-    mapFunc "max" = "maximum"
-    mapFunc "<=>" = "ifOnlyIf"
-    mapFunc "=>" = "implies"
-    mapFunc "||" = "or"
-    mapFunc "xor" = "xor"
-    mapFunc "&&" = "and"
-    mapFunc "<" = "lessThan"
-    mapFunc ">" = "greaterThan"
-    mapFunc "=" = "equal"
-    mapFunc "<=" = "lessThanEqual"
-    mapFunc ">=" = "greaterThanEqual"
-    mapFunc "!=" = "notEqual"
-    mapFunc "in" = "$in"
-    mapFunc "not in" = "notIn"
-    mapFunc "+" = "add"
-    mapFunc "*" = "mul"
-    mapFunc "/" = "div"
-    mapFunc "%" = "mod"
-    mapFunc "++" = "union"
-    mapFunc "--" = "diff"
-    mapFunc "**" = "inter"
-    mapFunc "ifthenelse" = "ifThenElse"
-    mapFunc op' = error $ "Choco: Unknown op: " ++ op'
-
-    bitwidth = fromMaybe 4 $ lookup "int" scopes :: Integer
+{-# LANGUAGE NamedFieldPuns #-}
+{-
+ Copyright (C) 2012-2017 Jimmy Liang, Michal Antkiewicz, Rafael Olaechea <http://gsd.uwaterloo.ca>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+-}
+-- | Generates JS representation of IR for the <https://github.com/gsdlab/chocosolver Chocosolver>.
+module Language.Clafer.Generator.Choco (genCModule) where
+
+import Control.Applicative
+import Control.Lens.Plated hiding (rewrite)
+import Control.Monad
+import Data.Data.Lens
+import Data.List
+import Data.Maybe
+import Prelude hiding (exp)
+import Language.Clafer.Common
+import Language.Clafer.Intermediate.Intclafer
+import Language.Clafer.Front.LexClafer
+
+
+-- | Choco 3 code generation
+genCModule :: (IModule, GEnv) -> [(UID, Integer)] -> [Token]     -> Result
+genCModule (imodule@IModule{_mDecls}, genv') scopes  otherTokens' =
+    genScopes
+    ++ "\n"
+    ++ (genClafers =<< _mDecls)
+    ++ (genSuperRefConstraintAssertGoal "root" =<< _mDecls)
+    ++ genChocoEscapes
+    where
+    uidIClaferMap' = uidClaferMap genv'
+
+    genClafers :: IElement -> String
+    genClafers    (IEClafer (c@IClafer{_uid, _gcard, _elements}))
+        = _uid
+        ++ genClaferNesting c
+        ++ prop "withGroupCard" (genCard $ _interval <$> _gcard)
+        ++ ";\n"
+        ++ (genClafers =<< _elements)
+    genClafers    _ = ""
+
+    genClaferNesting (IClafer{_isAbstract=True, _uid, _parentUID="clafer"})
+        = " = Abstract(\"" ++ _uid ++ "\")"
+    genClaferNesting (IClafer{_isAbstract=True, _uid, _parentUID})
+        = " = " ++ _parentUID ++  ".addAbstractChild(\"" ++ _uid ++ "\")"
+    genClaferNesting (IClafer{_isAbstract=False, _uid, _card, _parentUID="root"})
+        = " = Clafer(\"" ++ _uid ++ "\")"
+        ++ prop "withCard" (genCard _card)
+    genClaferNesting (IClafer{_isAbstract=False, _uid, _card, _parentUID})
+        = " = "
+        ++ _parentUID
+        ++  ".addChild(\"" ++ _uid ++ "\")"
+        ++ prop "withCard" (genCard _card)
+
+    prop name value =
+        case value of
+                Just value' -> "." ++ name ++ "(" ++ value' ++ ")"
+                Nothing     -> ""
+
+    claferWithUid u = fromMaybe (error $ "claferWithUid: \"" ++ u ++ "\" is not a clafer") $ findIClafer uidIClaferMap' u
+
+    superOf u =
+        case _super $ claferWithUid u of
+            Just (PExp{_exp = IClaferId{_sident}})
+                | _sident == baseClafer -> Nothing
+                | isPrimitive _sident   -> Nothing
+                | otherwise             -> Just _sident
+            _ -> Nothing
+
+    genCard :: Maybe Interval -> Maybe String
+    genCard (Just (0, -1)) = Nothing
+    genCard (Just (low, -1)) = return $ show low
+    genCard (Just (low, high)) = return $ show low ++ ", " ++ show high
+    genCard _              = Nothing
+
+
+    genScopes :: Result
+    genScopes =
+        (if null scopeMap then "" else "scope({" ++ intercalate ", " scopeMap ++ "});\n")
+        ++ "defaultScope(1);\n"
+        ++ "intRange(-" ++ show largestPositiveInt ++ ", " ++ show (largestPositiveInt - 1) ++ ");\n"
+        ++ "stringLength(" ++ show longestString ++ ");\n"
+        where
+            largestPositiveInt :: Integer
+            largestPositiveInt = 2 ^ (bitwidth - 1)
+            scopeMap = [uid' ++ ":" ++ show scope | (uid', scope) <- scopes, uid' /= "int"]
+
+    genChocoEscapes :: String
+    genChocoEscapes = concatMap printChocoEscape otherTokens'
+        where
+            printChocoEscape (PT _ (T_PosChoco code)) =  let
+                code' = fromJust $ stripPrefix "[choco|" code
+              in
+                take (length code' - 2) code'
+            printChocoEscape _                        = ""
+
+    exprs :: [IExp]
+    exprs = universeOn biplate imodule
+
+    stringLength :: IExp -> Maybe Int
+    stringLength (IStr string) = Just $ length string
+    stringLength _ = Nothing
+
+    longestString :: Int
+    longestString = maximum $ 16 : mapMaybe stringLength exprs
+
+    genSuperRefConstraintAssertGoal :: String -> IElement -> Result
+    genSuperRefConstraintAssertGoal _ IEClafer{_iClafer=IClafer{_uid, _super=Nothing, _reference=Nothing, _elements}}
+        = genSuperRefConstraintAssertGoal _uid =<< _elements
+    genSuperRefConstraintAssertGoal _ (IEClafer c@IClafer{_uid, _card, _super, _reference, _elements})
+        = _uid
+        ++ prop "extending" (superOf _uid)
+        ++ (case (getReference c, _reference) of
+             ([target], Just (IReference True _))  -> ".refToUnique(" ++ genTarget target ++ ")"
+             ([target], Just (IReference False _)) -> ".refTo(" ++ genTarget target ++ ")"
+             _ -> "")
+        ++ ";\n"
+        ++ (genSuperRefConstraintAssertGoal _uid =<< _elements)
+        where
+            genTarget "integer" = "Int"
+            genTarget "int" = "Int"
+            genTarget target = target
+    genSuperRefConstraintAssertGoal "root" (IEConstraint True pexp) = "Constraint(" ++ genConstraintPExp pexp ++ ");\n"
+    genSuperRefConstraintAssertGoal pUID (IEConstraint True pexp) = pUID ++ ".addConstraint(" ++ genConstraintPExp pexp ++ ");\n"
+    genSuperRefConstraintAssertGoal _ (IEConstraint False pexp) = "assert(" ++ genConstraintPExp pexp ++ ");\n"
+    genSuperRefConstraintAssertGoal _ (IEGoal True PExp{_exp=IFunExp _ [pexp]})  = "max(" ++ genConstraintPExp pexp ++ ");\n"
+    genSuperRefConstraintAssertGoal _ (IEGoal False PExp{_exp=IFunExp _ [pexp]})  = "min(" ++ genConstraintPExp pexp ++ ");\n"
+    genSuperRefConstraintAssertGoal _ _ = ""
+
+
+    rewrite :: PExp -> PExp
+    -- Rearrange right joins to left joins.
+    rewrite p1@PExp{_iType = Just _, _exp = IFunExp "." [p2, p3@PExp{_exp = IFunExp "." _}]} =
+        p1{_exp = IFunExp "." [p3{_iType = _iType p4, _exp = IFunExp "." [p2, p4]}, p5]}
+        where
+            PExp{_exp = IFunExp "." [p4, p5]} = rewrite p3
+    rewrite p1@PExp{_exp = IFunExp{_op = "-", _exps = [PExp{_exp = IInt i}]}} =
+        -- This is so that the output looks cleaner, no other purpose since the Choco optimizer
+        -- in the backend will treat the pre-rewritten expression the same.
+        p1{_exp = IInt (-i)}
+    rewrite p = p
+
+    genConstraintPExp :: PExp -> String
+    genConstraintPExp = genConstraintExp . _exp . rewrite
+
+    genConstraintExp :: IExp -> String
+    genConstraintExp (IDeclPExp quant' [] body') =
+        mapQuant quant' ++ "(" ++ genConstraintPExp body' ++ ")"
+    genConstraintExp (IDeclPExp quant' decls' body') =
+        mapQuant quant' ++ "([" ++ intercalate ", " (map genDecl decls') ++ "], " ++ genConstraintPExp body' ++ ")"
+        where
+            genDecl (IDecl isDisj' locals body'') =
+                (if isDisj' then "disjDecl" else "decl") ++ "([" ++ intercalate ", " (map genLocal locals) ++ "], " ++ genConstraintPExp body'' ++ ")"
+            genLocal local =
+                local ++ " = local(\"" ++ local ++ "\")"
+
+    genConstraintExp (IFunExp "." [PExp{_exp = IClaferId{_sident = "root"}}, e2]) =
+        genConstraintPExp e2
+    genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident = "dref"}}]) =
+        "joinRef(" ++ genConstraintPExp e1 ++ ")"
+    genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident = "parent"}}]) =
+        "joinParent(" ++ genConstraintPExp e1 ++ ")"
+    genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident}}]) =
+        "join(" ++ genConstraintPExp e1 ++ ", " ++ _sident ++ ")"
+    genConstraintExp (IFunExp "." [_, _]) =
+        error "Did not rewrite all joins to left joins."
+    genConstraintExp (IFunExp "-" [arg]) =
+        "minus(" ++ genConstraintPExp arg ++ ")"
+    genConstraintExp (IFunExp "-" [arg1, arg2]) =
+        "sub(" ++ genConstraintPExp arg1 ++ ", " ++ genConstraintPExp arg2 ++ ")"
+    genConstraintExp (IFunExp "sum" args')
+        | [arg] <- args', PExp{_exp = IFunExp{_exps = [a, PExp{_exp = IClaferId{_sident = "dref"}}]}} <- rewrite arg =
+            "sum(" ++ genConstraintPExp a ++ ")"
+        | [arg] <- args' =
+            "sum(" ++ genConstraintPExp arg ++ ")"
+        | otherwise = error $ "[bug] Choco.genConstraintExp: Unexpected sum argument: " ++ show args'
+    genConstraintExp (IFunExp "product" args')
+        | [arg] <- args', PExp{_exp = IFunExp{_exps = [a, PExp{_exp = IClaferId{_sident = "dref"}}]}} <- rewrite arg =
+            "product(" ++ genConstraintPExp a ++ ")"
+        | otherwise = error "Choco: Unexpected product argument."
+    genConstraintExp (IFunExp "+" args') =
+        (if _iType (head args') == Just TString then "concat" else "add") ++
+            "(" ++ intercalate ", " (map genConstraintPExp args') ++ ")"
+    genConstraintExp (IFunExp op' args') =
+        mapFunc op' ++ "(" ++ intercalate ", " (map genConstraintPExp args') ++ ")"
+    -- this is a keyword in Javascript so use "$this" instead
+    genConstraintExp IClaferId{_sident = "this"} = "$this()"
+    genConstraintExp IClaferId{_sident}
+        | isJust $ findIClafer uidIClaferMap' _sident = "global(" ++ _sident ++ ")"
+        | otherwise                = _sident
+    genConstraintExp (IInt val) = "constant(" ++ show val ++ ")"
+    genConstraintExp (IStr val) = "constant(" ++ show val ++ ")"
+    genConstraintExp (IDouble val) = "constant(" ++ show val ++ ")"
+    genConstraintExp (IReal val) = "constant(" ++ show val ++ ")"
+
+    mapQuant INo = "none"
+    mapQuant ISome = "some"
+    mapQuant IAll = "all"
+    mapQuant IOne = "one"
+    mapQuant ILone = "lone"
+
+    mapFunc "!" = "not"
+    mapFunc "#" = "card"
+    mapFunc "min" = "minimum"
+    mapFunc "max" = "maximum"
+    mapFunc "<=>" = "ifOnlyIf"
+    mapFunc "=>" = "implies"
+    mapFunc "||" = "or"
+    mapFunc "xor" = "xor"
+    mapFunc "&&" = "and"
+    mapFunc "<" = "lessThan"
+    mapFunc ">" = "greaterThan"
+    mapFunc "=" = "equal"
+    mapFunc "<=" = "lessThanEqual"
+    mapFunc ">=" = "greaterThanEqual"
+    mapFunc "!=" = "notEqual"
+    mapFunc "in" = "$in"
+    mapFunc "not in" = "notIn"
+    mapFunc "+" = "add"
+    mapFunc "*" = "mul"
+    mapFunc "/" = "div"
+    mapFunc "%" = "mod"
+    mapFunc "++" = "union"
+    mapFunc "--" = "diff"
+    mapFunc "**" = "inter"
+    mapFunc "ifthenelse" = "ifThenElse"
+    mapFunc op' = error $ "Choco: Unknown op: " ++ op'
+
+    bitwidth = fromMaybe 4 $ lookup "int" scopes :: Integer
diff --git a/src/Language/Clafer/Generator/Concat.hs b/src/Language/Clafer/Generator/Concat.hs
--- a/src/Language/Clafer/Generator/Concat.hs
+++ b/src/Language/Clafer/Generator/Concat.hs
@@ -1,5 +1,5 @@
 {-
- Copyright (C) 2012-2015 Kacper Bak <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Generator/Stats.hs b/src/Language/Clafer/Generator/Stats.hs
--- a/src/Language/Clafer/Generator/Stats.hs
+++ b/src/Language/Clafer/Generator/Stats.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-
- Copyright (C) 2012 Kacper Bak, Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Intermediate/Desugarer.hs b/src/Language/Clafer/Intermediate/Desugarer.hs
--- a/src/Language/Clafer/Intermediate/Desugarer.hs
+++ b/src/Language/Clafer/Intermediate/Desugarer.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE RankNTypes #-}
 {-
- Copyright (C) 2012-2015 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Paulius Juodisius <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Paulius Juodisius <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Intermediate/Intclafer.hs b/src/Language/Clafer/Intermediate/Intclafer.hs
--- a/src/Language/Clafer/Intermediate/Intclafer.hs
+++ b/src/Language/Clafer/Intermediate/Intclafer.hs
@@ -1,421 +1,421 @@
-{-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-}
-{-
- Copyright (C) 2012-2015 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Luke Michael Brown <http://gsd.uwaterloo.ca>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
--}
--- | Intermediate representation (IR) of a Clafer model
-module Language.Clafer.Intermediate.Intclafer where
-
-import Language.Clafer.Front.AbsClafer
-
-import Control.Lens
-import Data.Aeson
-import Data.Aeson.TH
-import Data.Data
-import Data.Monoid
-import Data.Foldable
-import Prelude
-
--- | unique identifier of a clafer
-type UID = String
--- | clafer name as declared in the source model
-type CName = String
--- | file:// ftp:// or http:// prefixed URL
-type URL = String
-
--- | A "supertype" of all IR types
-data Ir
-  = IRIModule IModule
-  | IRIElement IElement
-  | IRIType IType
-  | IRClafer IClafer
-  | IRIExp IExp
-  | IRPExp PExp
-  | IRIReference (Maybe IReference)
-  | IRIQuant IQuant
-  | IRIDecl IDecl
-  | IRIGCard (Maybe IGCard)
-  deriving (Eq, Show)
-
-data IType
-  = TBoolean
-  | TString
-  | TInteger
-  | TDouble
-  | TReal
-  | TClafer
-    { _hi :: [UID]          -- ^ [UID] represents an inheritance hierarchy obtained using @Common.findHierarchy
-    }
-  | TMap                      --  Represents a map from the src class to the target class
-    { _so :: IType            -- ^ must only be a TClass
-    , _ta :: IType            -- ^ must only be a TClass
-    }
-  | TUnion
-    { _un :: [IType]          -- ^ [IType] is a list of basic types (not union types)
-    }
-
-  deriving (Eq,Ord,Show,Data,Typeable)
-
--- | each file contains exactly one mode. A module is a list of declarations
-data IModule
-  = IModule
-    { _mName :: String -- ^ always empty (no syntax for declaring modules)
-    , _mDecls :: [IElement] -- ^ List of top-level elements
-    }
-  deriving (Eq,Ord,Show,Data,Typeable)
-
--- | Clafer has a list of fields that specify its properties. Some fields, marked as (o) are for generating optimized code
-data IClafer
-  = IClafer
-    { _cinPos :: Span         -- ^ the position of the syntax in source code
-    , _isAbstract :: Bool     -- ^ whether abstract or not (i.e., concrete)
-    , _gcard :: Maybe IGCard  -- ^ group cardinality
-    , _ident :: CName         -- ^ name declared in the model
-    , _uid :: UID             -- ^ a unique identifier
-    , _parentUID :: UID       -- ^ "root" if top-level concrete, "clafer" if top-level abstract, "" if unresolved or for root clafer, otherwise UID of the parent clafer
-    , _super :: Maybe PExp    -- ^ superclafer - only allowed PExp is IClaferId. Nothing = default super "clafer"
-    , _reference :: Maybe IReference -- ^ reference type, bag or set
-    , _card :: Maybe Interval -- ^ clafer cardinality
-    , _glCard :: Interval     -- ^ (o) global cardinality
-    , _elements :: [IElement] -- ^ nested elements
-    }
-  deriving (Eq,Ord,Show,Data,Typeable)
-
--- | Clafer's subelement is either a clafer, a constraint, or a goal (objective)
---   This is a wrapper type needed to have polymorphic lists of elements
-data IElement
-  = IEClafer
-    { _iClafer :: IClafer  -- ^ the actual clafer
-    }
-  | IEConstraint
-    { _isHard :: Bool      -- ^ whether hard constraint or assertion
-    , _cpexp :: PExp       -- ^ the container of the actual expression
-    }
-  -- | Goal (optimization objective)
-  | IEGoal
-    { _isMaximize :: Bool     -- ^ whether maximize or minimize
-    , _cpexp :: PExp          -- ^ the expression
-    }
-  deriving (Eq,Ord,Show,Data,Typeable)
-
--- | A type of reference.
---   ->    values unique (set)
---   ->>   values non-unique (bag)
-data IReference
-  = IReference
-    { _isSet :: Bool -- ^ whether set or bag
-    , _ref :: PExp  -- ^ the only allowed reference expressions are IClafer and set expr. (++, **, --s)
-    }
-  deriving (Eq,Ord,Show,Data,Typeable)
-
--- | Group cardinality is specified as an interval. It may also be given by a keyword.
---   xor    1..1 isKeyword = True
---   1..1   1..1 isKeyword = False
-data IGCard
-  = IGCard
-    { _isKeyword :: Bool    -- ^ whether given by keyword: or, xor, mux
-    , _interval :: Interval
-    } deriving (Eq,Ord,Show,Data,Typeable)
-
--- | (Min, Max) integer interval. -1 denotes *
-type Interval = (Integer, Integer)
-
--- | This is expression container (parent).
---   It has meta information about an actual expression 'exp'
-data PExp
-  = PExp
-    { _iType :: Maybe IType   -- ^ the inferred type
-    , _pid :: String          -- ^ non-empty unique id for expressions with span, \"\" for noSpan
-    , _inPos :: Span          -- ^ position in the input Clafer file
-    , _exp :: IExp            -- ^ the actual expression
-    }
-  deriving (Eq,Ord,Show,Data,Typeable)
-
--- | Embedes reference to a resolved Clafer
-type ClaferBinding = Maybe UID
-
-data IExp
-    -- | quantified expression with declarations
-    --   e.g., [ all x1; x2 : X | x1.ref != x2.ref ]
-  = IDeclPExp
-    { _quant :: IQuant
-    , _oDecls :: [IDecl]
-    , _bpexp :: PExp
-    }
-    -- | expression with a
-    --   unary function, e.g., -1
-    --   binary function, e.g., 2 + 3
-    --   ternary function, e.g., if x then 4 else 5
-  | IFunExp
-    { _op :: String
-    , _exps :: [PExp]
-    }
-    -- | integer number
-  | IInt
-    { _iint :: Integer
-    }
-    -- | real number
-  | IReal
-    { _ireal :: Double
-    }
-    -- | double-precision floating point number
-  | IDouble
-    { _idouble :: Double
-    }
-    -- | string
-  | IStr
-    { _istr :: String
-    }
-    -- | a reference to a clafer name
-  | IClaferId
-    { _modName :: String         -- ^ module name - currently not used and empty since we have no module system
-    , _sident :: CName           -- ^ name of the clafer being referred to
-    , _isTop :: Bool             -- ^ identifier refers to a top-level definition
-    , _binding :: ClaferBinding  -- ^ the UID of the bound IClafer, if resolved
-    }
-  deriving (Eq,Ord,Show,Data,Typeable)
-
-{- |
-For IFunExp standard set of operators includes:
-1. Unary operators:
-        !          - not (logical)
-        #          - set counting operator
-        -          - negation (arithmetic)
-        max        - maximum (created for goals and maximum of a set)
-        min        - minimum (created for goals and minimum of a set)
-2. Binary operators:
-        \<=\>        - equivalence
-        =\>         - implication
-        ||         - disjunction
-        xor        - exclusive or
-        &&         - conjunction
-        \<          - less than
-        \>          - greater than
-        =          - equality
-        \<=         - less than or equal
-        \>=         - greater than or equal
-        !=         - inequality
-        in         - belonging to a set/being a subset
-        nin        - not belonging to a set/not being a subset
-        +          - addition/string concatenation
-        -          - substraction
-        *          - multiplication
-        /          - division
-        ++         - set union
-        \-\-         - set difference
-        **          - set intersection
-        \<:         - domain restriction
-        :\>         - range restriction
-        .          - relational join
-3. Ternary operators
-        ifthenelse -- if then else
--}
-
--- | Local declaration
---   disj x1; x2 : X ++ Y
---   y1 : Y
-data IDecl
-  = IDecl
-    { _isDisj :: Bool    -- ^ is disjunct
-    , _decls :: [CName]  -- ^ a list of local names
-    , _body :: PExp      -- ^ set to which local names refer to
-    }
-  deriving (Eq,Ord,Show,Data,Typeable)
-
--- | quantifier
-data IQuant
-  = INo    -- ^ does not exist
-  | ILone  -- ^ less than one
-  | IOne   -- ^ exactly one
-  | ISome  -- ^ at least one (i.e., exists)
-  | IAll   -- ^ for all
-  deriving (Eq,Ord,Show,Data,Typeable)
-
-type LineNo = Integer
-type ColNo  = Integer
-
-
-{-Ir Traverse Functions-}
--------------------------
-
--- | map over IR
-mapIR :: (Ir -> Ir) -> IModule -> IModule -- fmap/map for IModule
-mapIR f (IModule name decls') =
-  unWrapIModule $ f $ IRIModule $ IModule name $ map (unWrapIElement . iMap f . IRIElement) decls'
-
--- | foldMap over IR
-foldMapIR :: (Monoid m) => (Ir -> m) -> IModule -> m -- foldMap for IModule
-foldMapIR f i@(IModule _ decls') =
-  (f $ IRIModule i) `mappend` foldMap (iFoldMap f . IRIElement) decls'
-
--- | fold the IR
-foldIR :: (Ir -> a -> a) -> a -> IModule -> a -- a basic fold for IModule
-foldIR f e m = appEndo (foldMapIR (Endo . f) m) e
-
-{-
-Note: even though the above functions take an IModule,
-the functions they use take an Ir (wrapped version see top of module).
-Also the bellow functions are just helpers for the above, you may use
-them if you wish to start from somewhere other than IModule.
--}
-
-iMap :: (Ir -> Ir) -> Ir -> Ir
-iMap f (IRIElement (IEClafer c)) =
-  f $ IRIElement $ IEClafer $ unWrapIClafer $ iMap f $ IRClafer c
-iMap f (IRIElement (IEConstraint h pexp)) =
-  f $ IRIElement $ IEConstraint h $ unWrapPExp $ iMap f $ IRPExp pexp
-iMap f (IRIElement (IEGoal m pexp)) =
-  f $ IRIElement $ IEGoal m $ unWrapPExp $ iMap f $ IRPExp pexp
-iMap f (IRClafer (IClafer p a grc i u pu Nothing  r c goc elems)) =
-  f $ IRClafer $ IClafer p a (unWrapIGCard $ iMap f $ IRIGCard grc) i u pu Nothing                            (unWrapIReference $ iMap f $ IRIReference r) c goc $ map (unWrapIElement . iMap f . IRIElement) elems
-iMap f (IRClafer (IClafer p a grc i u pu (Just s) r c goc elems)) =
-  f $ IRClafer $ IClafer p a (unWrapIGCard $ iMap f $ IRIGCard grc) i u pu (Just $ unWrapPExp $ iMap f $ IRPExp s) (unWrapIReference $ iMap f $ IRIReference r) c goc $ map (unWrapIElement . iMap f . IRIElement) elems
-iMap f (IRIExp (IDeclPExp q decs p)) =
-  f $ IRIExp $ IDeclPExp (unWrapIQuant $ iMap f $ IRIQuant q) (map (unWrapIDecl . iMap f . IRIDecl) decs) $ unWrapPExp $ iMap f $ IRPExp p
-iMap f (IRIExp (IFunExp o pexps)) =
-  f $ IRIExp $ IFunExp o $ map (unWrapPExp . iMap f . IRPExp) pexps
-iMap f (IRPExp (PExp (Just iType') pID p iExp)) =
-  f $ IRPExp $ PExp (Just $ unWrapIType $ iMap f $ IRIType iType') pID p $ unWrapIExp $ iMap f $ IRIExp iExp
-iMap f (IRPExp (PExp Nothing pID p iExp)) =
-  f $ IRPExp $ PExp Nothing pID p $ unWrapIExp $ iMap f $ IRIExp iExp
-iMap _ x@(IRIReference Nothing) = x
-iMap f (IRIReference (Just (IReference is ref))) =
- f $ IRIReference $ Just $ IReference is $ (unWrapPExp . iMap f . IRPExp) ref
-iMap f (IRIDecl (IDecl i d body')) =
-  f $ IRIDecl $ IDecl i d $ unWrapPExp $ iMap f $ IRPExp body'
-iMap f i = f i
-
-iFoldMap :: (Monoid m) => (Ir -> m) -> Ir -> m
-iFoldMap f i@(IRIElement (IEConstraint _ pexp)) =
-  f i `mappend` (iFoldMap f $ IRPExp pexp)
-iFoldMap f i@(IRIElement (IEGoal _ pexp)) =
-  f i `mappend` (iFoldMap f $ IRPExp pexp)
-iFoldMap f i@(IRClafer (IClafer _ _ grc _ _ _ Nothing r _ _ elems)) =
-  f i `mappend` (iFoldMap f $ IRIReference r) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems
-iFoldMap f i@(IRClafer (IClafer _ _ grc _ _ _ (Just s) r _ _ elems)) =
-  f i `mappend` (iFoldMap f $ IRPExp s) `mappend` (iFoldMap f $ IRIReference r) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems
-iFoldMap f i@(IRIExp (IDeclPExp q decs p)) =
-  f i `mappend` (iFoldMap f $ IRIQuant q) `mappend` (iFoldMap f $ IRPExp p) `mappend` foldMap (iFoldMap f . IRIDecl) decs
-iFoldMap f i@(IRIExp (IFunExp _ pexps)) =
-  f i `mappend` foldMap (iFoldMap f . IRPExp) pexps
-iFoldMap f i@(IRPExp (PExp (Just iType') _ _ iExp)) =
-  f i `mappend` (iFoldMap f $ IRIType iType') `mappend` (iFoldMap f $ IRIExp iExp)
-iFoldMap f i@(IRPExp (PExp Nothing _ _ iExp)) =
-  f i `mappend` (iFoldMap f $ IRIExp iExp)
-iFoldMap f i@(IRIReference Nothing) = f i
-iFoldMap f i@(IRIReference (Just (IReference _ ref))) =
-  f i `mappend` (iFoldMap f . IRPExp) ref
-iFoldMap f i@(IRIDecl (IDecl _ _ body')) =
-  f i `mappend` (iFoldMap f $ IRPExp body')
-iFoldMap f (IRIElement (IEClafer c)) = iFoldMap f $ IRClafer c
-iFoldMap f i = f i
-
-iFold :: (Ir -> a -> a) -> a -> Ir -> a
-iFold f e m = appEndo (iFoldMap (Endo . f) m) e
-
-
-unWrapIModule :: Ir -> IModule
-unWrapIModule (IRIModule x) = x
-unWrapIModule x = error $ "Can't call unWarpIModule on " ++ show x
-unWrapIElement :: Ir -> IElement
-unWrapIElement (IRIElement x) = x
-unWrapIElement x = error $ "Can't call unWarpIElement on " ++ show x
-unWrapIType :: Ir -> IType
-unWrapIType (IRIType x) = x
-unWrapIType x = error $ "Can't call unWarpIType on " ++ show x
-unWrapIClafer :: Ir -> IClafer
-unWrapIClafer (IRClafer x) = x
-unWrapIClafer x = error $ "Can't call unWarpIClafer on " ++ show x
-unWrapIExp :: Ir -> IExp
-unWrapIExp (IRIExp x) = x
-unWrapIExp x = error $ "Can't call unWarpIExp on " ++ show x
-unWrapPExp :: Ir -> PExp
-unWrapPExp (IRPExp x) = x
-unWrapPExp x = error $ "Can't call unWarpPExp on " ++ show x
-unWrapIReference :: Ir -> Maybe IReference
-unWrapIReference (IRIReference x) = x
-unWrapIReference x = error $ "Can't call unWarpIReference on " ++ show x
-unWrapIQuant :: Ir -> IQuant
-unWrapIQuant (IRIQuant x) = x
-unWrapIQuant x = error $ "Can't call unWarpIQuant on " ++ show x
-unWrapIDecl :: Ir -> IDecl
-unWrapIDecl (IRIDecl x) = x
-unWrapIDecl x = error $ "Can't call unWarpIDecl on " ++ show x
-unWrapIGCard :: Ir -> Maybe IGCard
-unWrapIGCard (IRIGCard x) = x
-unWrapIGCard x = error $ "Can't call unWarpIGcard on " ++ show x
-
-instance Plated IModule
-instance Plated IClafer
-instance Plated PExp
-instance Plated IExp
-
-makeLenses ''IType
-
-makeLenses ''IModule
-
-makeLenses ''IClafer
-
-makeLenses ''IElement
-
-makeLenses ''IReference
-
-makeLenses ''IGCard
-
-makeLenses ''PExp
-
-makeLenses ''IExp
-
-makeLenses ''IDecl
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IType)
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IModule)
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IClafer)
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IElement)
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IReference)
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IGCard)
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''PExp)
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IExp)
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IDecl)
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IQuant)
-
-instance ToJSON Span where
-  toJSON _ = Null
-
-instance ToJSON Pos where
-  toJSON _ = Null
-
--- | Datatype used for JSON output. See Language.Clafer.gatherObjectivesAndAttributes
-data ObjectivesAndAttributes
-  = ObjectivesAndAttributes
-    { _qualities :: [String]
-    , _attributes :: [String]
-    }
-
-$(deriveToJSON defaultOptions{fieldLabelModifier = tail} ''ObjectivesAndAttributes)
+{-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-}
+{-
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Luke Michael Brown <http://gsd.uwaterloo.ca>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+-}
+-- | Intermediate representation (IR) of a Clafer model
+module Language.Clafer.Intermediate.Intclafer where
+
+import Language.Clafer.Front.AbsClafer
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.TH
+import Data.Data
+import Data.Monoid
+import Data.Foldable
+import Prelude
+
+-- | unique identifier of a clafer
+type UID = String
+-- | clafer name as declared in the source model
+type CName = String
+-- | file:// ftp:// or http:// prefixed URL
+type URL = String
+
+-- | A "supertype" of all IR types
+data Ir
+  = IRIModule IModule
+  | IRIElement IElement
+  | IRIType IType
+  | IRClafer IClafer
+  | IRIExp IExp
+  | IRPExp PExp
+  | IRIReference (Maybe IReference)
+  | IRIQuant IQuant
+  | IRIDecl IDecl
+  | IRIGCard (Maybe IGCard)
+  deriving (Eq, Show)
+
+data IType
+  = TBoolean
+  | TString
+  | TInteger
+  | TDouble
+  | TReal
+  | TClafer
+    { _hi :: [UID]          -- ^ [UID] represents an inheritance hierarchy obtained using @Common.findHierarchy
+    }
+  | TMap                      --  Represents a map from the src class to the target class
+    { _so :: IType            -- ^ must only be a TClass
+    , _ta :: IType            -- ^ must only be a TClass
+    }
+  | TUnion
+    { _un :: [IType]          -- ^ [IType] is a list of basic types (not union types)
+    }
+
+  deriving (Eq,Ord,Show,Data,Typeable)
+
+-- | each file contains exactly one mode. A module is a list of declarations
+data IModule
+  = IModule
+    { _mName :: String -- ^ always empty (no syntax for declaring modules)
+    , _mDecls :: [IElement] -- ^ List of top-level elements
+    }
+  deriving (Eq,Ord,Show,Data,Typeable)
+
+-- | Clafer has a list of fields that specify its properties. Some fields, marked as (o) are for generating optimized code
+data IClafer
+  = IClafer
+    { _cinPos :: Span         -- ^ the position of the syntax in source code
+    , _isAbstract :: Bool     -- ^ whether abstract or not (i.e., concrete)
+    , _gcard :: Maybe IGCard  -- ^ group cardinality
+    , _ident :: CName         -- ^ name declared in the model
+    , _uid :: UID             -- ^ a unique identifier
+    , _parentUID :: UID       -- ^ "root" if top-level concrete, "clafer" if top-level abstract, "" if unresolved or for root clafer, otherwise UID of the parent clafer
+    , _super :: Maybe PExp    -- ^ superclafer - only allowed PExp is IClaferId. Nothing = default super "clafer"
+    , _reference :: Maybe IReference -- ^ reference type, bag or set
+    , _card :: Maybe Interval -- ^ clafer cardinality
+    , _glCard :: Interval     -- ^ (o) global cardinality
+    , _elements :: [IElement] -- ^ nested elements
+    }
+  deriving (Eq,Ord,Show,Data,Typeable)
+
+-- | Clafer's subelement is either a clafer, a constraint, or a goal (objective)
+--   This is a wrapper type needed to have polymorphic lists of elements
+data IElement
+  = IEClafer
+    { _iClafer :: IClafer  -- ^ the actual clafer
+    }
+  | IEConstraint
+    { _isHard :: Bool      -- ^ whether hard constraint or assertion
+    , _cpexp :: PExp       -- ^ the container of the actual expression
+    }
+  -- | Goal (optimization objective)
+  | IEGoal
+    { _isMaximize :: Bool     -- ^ whether maximize or minimize
+    , _cpexp :: PExp          -- ^ the expression
+    }
+  deriving (Eq,Ord,Show,Data,Typeable)
+
+-- | A type of reference.
+--   ->    values unique (set)
+--   ->>   values non-unique (bag)
+data IReference
+  = IReference
+    { _isSet :: Bool -- ^ whether set or bag
+    , _ref :: PExp  -- ^ the only allowed reference expressions are IClafer and set expr. (++, **, --s)
+    }
+  deriving (Eq,Ord,Show,Data,Typeable)
+
+-- | Group cardinality is specified as an interval. It may also be given by a keyword.
+--   xor    1..1 isKeyword = True
+--   1..1   1..1 isKeyword = False
+data IGCard
+  = IGCard
+    { _isKeyword :: Bool    -- ^ whether given by keyword: or, xor, mux
+    , _interval :: Interval
+    } deriving (Eq,Ord,Show,Data,Typeable)
+
+-- | (Min, Max) integer interval. -1 denotes *
+type Interval = (Integer, Integer)
+
+-- | This is expression container (parent).
+--   It has meta information about an actual expression 'exp'
+data PExp
+  = PExp
+    { _iType :: Maybe IType   -- ^ the inferred type
+    , _pid :: String          -- ^ non-empty unique id for expressions with span, \"\" for noSpan
+    , _inPos :: Span          -- ^ position in the input Clafer file
+    , _exp :: IExp            -- ^ the actual expression
+    }
+  deriving (Eq,Ord,Show,Data,Typeable)
+
+-- | Embedes reference to a resolved Clafer
+type ClaferBinding = Maybe UID
+
+data IExp
+    -- | quantified expression with declarations
+    --   e.g., [ all x1; x2 : X | x1.ref != x2.ref ]
+  = IDeclPExp
+    { _quant :: IQuant
+    , _oDecls :: [IDecl]
+    , _bpexp :: PExp
+    }
+    -- | expression with a
+    --   unary function, e.g., -1
+    --   binary function, e.g., 2 + 3
+    --   ternary function, e.g., if x then 4 else 5
+  | IFunExp
+    { _op :: String
+    , _exps :: [PExp]
+    }
+    -- | integer number
+  | IInt
+    { _iint :: Integer
+    }
+    -- | real number
+  | IReal
+    { _ireal :: Double
+    }
+    -- | double-precision floating point number
+  | IDouble
+    { _idouble :: Double
+    }
+    -- | string
+  | IStr
+    { _istr :: String
+    }
+    -- | a reference to a clafer name
+  | IClaferId
+    { _modName :: String         -- ^ module name - currently not used and empty since we have no module system
+    , _sident :: CName           -- ^ name of the clafer being referred to
+    , _isTop :: Bool             -- ^ identifier refers to a top-level definition
+    , _binding :: ClaferBinding  -- ^ the UID of the bound IClafer, if resolved
+    }
+  deriving (Eq,Ord,Show,Data,Typeable)
+
+{- |
+For IFunExp standard set of operators includes:
+1. Unary operators:
+        !          - not (logical)
+        #          - set counting operator
+        -          - negation (arithmetic)
+        max        - maximum (created for goals and maximum of a set)
+        min        - minimum (created for goals and minimum of a set)
+2. Binary operators:
+        \<=\>        - equivalence
+        =\>         - implication
+        ||         - disjunction
+        xor        - exclusive or
+        &&         - conjunction
+        \<          - less than
+        \>          - greater than
+        =          - equality
+        \<=         - less than or equal
+        \>=         - greater than or equal
+        !=         - inequality
+        in         - belonging to a set/being a subset
+        nin        - not belonging to a set/not being a subset
+        +          - addition/string concatenation
+        -          - substraction
+        *          - multiplication
+        /          - division
+        ++         - set union
+        \-\-         - set difference
+        **          - set intersection
+        \<:         - domain restriction
+        :\>         - range restriction
+        .          - relational join
+3. Ternary operators
+        ifthenelse -- if then else
+-}
+
+-- | Local declaration
+--   disj x1; x2 : X ++ Y
+--   y1 : Y
+data IDecl
+  = IDecl
+    { _isDisj :: Bool    -- ^ is disjunct
+    , _decls :: [CName]  -- ^ a list of local names
+    , _body :: PExp      -- ^ set to which local names refer to
+    }
+  deriving (Eq,Ord,Show,Data,Typeable)
+
+-- | quantifier
+data IQuant
+  = INo    -- ^ does not exist
+  | ILone  -- ^ less than one
+  | IOne   -- ^ exactly one
+  | ISome  -- ^ at least one (i.e., exists)
+  | IAll   -- ^ for all
+  deriving (Eq,Ord,Show,Data,Typeable)
+
+type LineNo = Integer
+type ColNo  = Integer
+
+
+{-Ir Traverse Functions-}
+-------------------------
+
+-- | map over IR
+mapIR :: (Ir -> Ir) -> IModule -> IModule -- fmap/map for IModule
+mapIR f (IModule name decls') =
+  unWrapIModule $ f $ IRIModule $ IModule name $ map (unWrapIElement . iMap f . IRIElement) decls'
+
+-- | foldMap over IR
+foldMapIR :: (Monoid m) => (Ir -> m) -> IModule -> m -- foldMap for IModule
+foldMapIR f i@(IModule _ decls') =
+  (f $ IRIModule i) `mappend` foldMap (iFoldMap f . IRIElement) decls'
+
+-- | fold the IR
+foldIR :: (Ir -> a -> a) -> a -> IModule -> a -- a basic fold for IModule
+foldIR f e m = appEndo (foldMapIR (Endo . f) m) e
+
+{-
+Note: even though the above functions take an IModule,
+the functions they use take an Ir (wrapped version see top of module).
+Also the bellow functions are just helpers for the above, you may use
+them if you wish to start from somewhere other than IModule.
+-}
+
+iMap :: (Ir -> Ir) -> Ir -> Ir
+iMap f (IRIElement (IEClafer c)) =
+  f $ IRIElement $ IEClafer $ unWrapIClafer $ iMap f $ IRClafer c
+iMap f (IRIElement (IEConstraint h pexp)) =
+  f $ IRIElement $ IEConstraint h $ unWrapPExp $ iMap f $ IRPExp pexp
+iMap f (IRIElement (IEGoal m pexp)) =
+  f $ IRIElement $ IEGoal m $ unWrapPExp $ iMap f $ IRPExp pexp
+iMap f (IRClafer (IClafer p a grc i u pu Nothing  r c goc elems)) =
+  f $ IRClafer $ IClafer p a (unWrapIGCard $ iMap f $ IRIGCard grc) i u pu Nothing                            (unWrapIReference $ iMap f $ IRIReference r) c goc $ map (unWrapIElement . iMap f . IRIElement) elems
+iMap f (IRClafer (IClafer p a grc i u pu (Just s) r c goc elems)) =
+  f $ IRClafer $ IClafer p a (unWrapIGCard $ iMap f $ IRIGCard grc) i u pu (Just $ unWrapPExp $ iMap f $ IRPExp s) (unWrapIReference $ iMap f $ IRIReference r) c goc $ map (unWrapIElement . iMap f . IRIElement) elems
+iMap f (IRIExp (IDeclPExp q decs p)) =
+  f $ IRIExp $ IDeclPExp (unWrapIQuant $ iMap f $ IRIQuant q) (map (unWrapIDecl . iMap f . IRIDecl) decs) $ unWrapPExp $ iMap f $ IRPExp p
+iMap f (IRIExp (IFunExp o pexps)) =
+  f $ IRIExp $ IFunExp o $ map (unWrapPExp . iMap f . IRPExp) pexps
+iMap f (IRPExp (PExp (Just iType') pID p iExp)) =
+  f $ IRPExp $ PExp (Just $ unWrapIType $ iMap f $ IRIType iType') pID p $ unWrapIExp $ iMap f $ IRIExp iExp
+iMap f (IRPExp (PExp Nothing pID p iExp)) =
+  f $ IRPExp $ PExp Nothing pID p $ unWrapIExp $ iMap f $ IRIExp iExp
+iMap _ x@(IRIReference Nothing) = x
+iMap f (IRIReference (Just (IReference is ref))) =
+ f $ IRIReference $ Just $ IReference is $ (unWrapPExp . iMap f . IRPExp) ref
+iMap f (IRIDecl (IDecl i d body')) =
+  f $ IRIDecl $ IDecl i d $ unWrapPExp $ iMap f $ IRPExp body'
+iMap f i = f i
+
+iFoldMap :: (Monoid m) => (Ir -> m) -> Ir -> m
+iFoldMap f i@(IRIElement (IEConstraint _ pexp)) =
+  f i `mappend` (iFoldMap f $ IRPExp pexp)
+iFoldMap f i@(IRIElement (IEGoal _ pexp)) =
+  f i `mappend` (iFoldMap f $ IRPExp pexp)
+iFoldMap f i@(IRClafer (IClafer _ _ grc _ _ _ Nothing r _ _ elems)) =
+  f i `mappend` (iFoldMap f $ IRIReference r) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems
+iFoldMap f i@(IRClafer (IClafer _ _ grc _ _ _ (Just s) r _ _ elems)) =
+  f i `mappend` (iFoldMap f $ IRPExp s) `mappend` (iFoldMap f $ IRIReference r) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems
+iFoldMap f i@(IRIExp (IDeclPExp q decs p)) =
+  f i `mappend` (iFoldMap f $ IRIQuant q) `mappend` (iFoldMap f $ IRPExp p) `mappend` foldMap (iFoldMap f . IRIDecl) decs
+iFoldMap f i@(IRIExp (IFunExp _ pexps)) =
+  f i `mappend` foldMap (iFoldMap f . IRPExp) pexps
+iFoldMap f i@(IRPExp (PExp (Just iType') _ _ iExp)) =
+  f i `mappend` (iFoldMap f $ IRIType iType') `mappend` (iFoldMap f $ IRIExp iExp)
+iFoldMap f i@(IRPExp (PExp Nothing _ _ iExp)) =
+  f i `mappend` (iFoldMap f $ IRIExp iExp)
+iFoldMap f i@(IRIReference Nothing) = f i
+iFoldMap f i@(IRIReference (Just (IReference _ ref))) =
+  f i `mappend` (iFoldMap f . IRPExp) ref
+iFoldMap f i@(IRIDecl (IDecl _ _ body')) =
+  f i `mappend` (iFoldMap f $ IRPExp body')
+iFoldMap f (IRIElement (IEClafer c)) = iFoldMap f $ IRClafer c
+iFoldMap f i = f i
+
+iFold :: (Ir -> a -> a) -> a -> Ir -> a
+iFold f e m = appEndo (iFoldMap (Endo . f) m) e
+
+
+unWrapIModule :: Ir -> IModule
+unWrapIModule (IRIModule x) = x
+unWrapIModule x = error $ "Can't call unWarpIModule on " ++ show x
+unWrapIElement :: Ir -> IElement
+unWrapIElement (IRIElement x) = x
+unWrapIElement x = error $ "Can't call unWarpIElement on " ++ show x
+unWrapIType :: Ir -> IType
+unWrapIType (IRIType x) = x
+unWrapIType x = error $ "Can't call unWarpIType on " ++ show x
+unWrapIClafer :: Ir -> IClafer
+unWrapIClafer (IRClafer x) = x
+unWrapIClafer x = error $ "Can't call unWarpIClafer on " ++ show x
+unWrapIExp :: Ir -> IExp
+unWrapIExp (IRIExp x) = x
+unWrapIExp x = error $ "Can't call unWarpIExp on " ++ show x
+unWrapPExp :: Ir -> PExp
+unWrapPExp (IRPExp x) = x
+unWrapPExp x = error $ "Can't call unWarpPExp on " ++ show x
+unWrapIReference :: Ir -> Maybe IReference
+unWrapIReference (IRIReference x) = x
+unWrapIReference x = error $ "Can't call unWarpIReference on " ++ show x
+unWrapIQuant :: Ir -> IQuant
+unWrapIQuant (IRIQuant x) = x
+unWrapIQuant x = error $ "Can't call unWarpIQuant on " ++ show x
+unWrapIDecl :: Ir -> IDecl
+unWrapIDecl (IRIDecl x) = x
+unWrapIDecl x = error $ "Can't call unWarpIDecl on " ++ show x
+unWrapIGCard :: Ir -> Maybe IGCard
+unWrapIGCard (IRIGCard x) = x
+unWrapIGCard x = error $ "Can't call unWarpIGcard on " ++ show x
+
+instance Plated IModule
+instance Plated IClafer
+instance Plated PExp
+instance Plated IExp
+
+makeLenses ''IType
+
+makeLenses ''IModule
+
+makeLenses ''IClafer
+
+makeLenses ''IElement
+
+makeLenses ''IReference
+
+makeLenses ''IGCard
+
+makeLenses ''PExp
+
+makeLenses ''IExp
+
+makeLenses ''IDecl
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IType)
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IModule)
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IClafer)
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IElement)
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IReference)
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IGCard)
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''PExp)
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IExp)
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IDecl)
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail, omitNothingFields=True} ''IQuant)
+
+instance ToJSON Span where
+  toJSON _ = Null
+
+instance ToJSON Pos where
+  toJSON _ = Null
+
+-- | Datatype used for JSON output. See Language.Clafer.gatherObjectivesAndAttributes
+data ObjectivesAndAttributes
+  = ObjectivesAndAttributes
+    { _qualities :: [String]
+    , _attributes :: [String]
+    }
+
+$(deriveToJSON defaultOptions{fieldLabelModifier = tail} ''ObjectivesAndAttributes)
diff --git a/src/Language/Clafer/Intermediate/Resolver.hs b/src/Language/Clafer/Intermediate/Resolver.hs
--- a/src/Language/Clafer/Intermediate/Resolver.hs
+++ b/src/Language/Clafer/Intermediate/Resolver.hs
@@ -1,101 +1,101 @@
-{-# LANGUAGE FlexibleContexts #-}
-{-
- Copyright (C) 2012 Kacper Bak <http://gsd.uwaterloo.ca>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
--}
-module Language.Clafer.Intermediate.Resolver where
-
-import Control.Monad
-import Control.Monad.State
-import qualified Data.Map as Map
-import qualified Data.StringMap as SMap
-
-import Language.Clafer.Common
-import Language.Clafer.ClaferArgs
-import Language.Clafer.Intermediate.Intclafer
-import Language.Clafer.Intermediate.ResolverName
-import Language.Clafer.Intermediate.ResolverType
-import Language.Clafer.Intermediate.ResolverInheritance
-
--- | Run the various resolvers
-resolveModule :: ClaferArgs -> IModule -> Resolve (IModule, GEnv)
-resolveModule    args'         imodule =
-  do
-    r <- resolveNModule $ nameModule (skip_resolver args') imodule
-    resolveNamesModule args' =<< rom' (rem' r)
-  where
-  rem' = if flatten_inheritance args' then resolveEModule else id
-  rom' = if skip_resolver args' then return else resolveOModule
-
-
--- | Name resolver
-nameModule :: Bool -> IModule -> (IModule, GEnv)
-nameModule skipResolver imodule = (imodule', genv'')
-  where
-    (decls', genv') = runState (mapM (nameElement skipResolver "root") $ _mDecls imodule) $ GEnv Map.empty 0 Map.empty [] SMap.empty
-    imodule' = imodule{_mDecls = decls'}
-    genv'' = genv'{uidClaferMap = createUidIClaferMap imodule'}
-
-
-nameElement :: MonadState GEnv m => Bool -> UID -> IElement -> m IElement
-nameElement skipResolver puid x = case x of
-  IEClafer claf -> IEClafer <$> nameClafer skipResolver puid claf
-  IEConstraint isHard' pexp -> IEConstraint isHard' <$> namePExp pexp
-  IEGoal isMaximize' pexp -> IEGoal isMaximize' <$> namePExp pexp
-
-
-nameClafer :: MonadState GEnv m => Bool -> UID -> IClafer -> m IClafer
-nameClafer skipResolver puid claf = do
-  let puid' = if _isAbstract claf && puid == "root" then baseClafer else puid
-  claf' <- if skipResolver then return claf{_uid = _ident claf, _parentUID = puid'} else renameClafer True puid' claf
-  elements' <- mapM (nameElement skipResolver (_uid claf')) $ _elements claf
-  return $ claf' {_elements = elements'}
-
-
-namePExp :: MonadState GEnv m => PExp -> m PExp
-namePExp pexp@(PExp _ _ _ exp') = do
-  n <- gets expCount
-  modify (\e -> e {expCount = 1 + n})
-  exp'' <- nameIExp exp'
-  return $ pexp {_pid = concat [ "e", show n, "_"], _exp = exp''}
-
-nameIExp :: MonadState GEnv m => IExp -> m IExp
-nameIExp x = case x of
-  IDeclPExp quant' decls' pexp -> do
-    decls'' <- mapM nameIDecl decls'
-    pexp'  <- namePExp pexp
-    return $ IDeclPExp quant' decls'' pexp'
-  IFunExp op' pexps -> IFunExp op' `liftM` mapM namePExp pexps
-  _ -> return x
-
-nameIDecl :: MonadState GEnv m => IDecl -> m IDecl
-nameIDecl (IDecl isDisj' dels body') = IDecl isDisj' dels `liftM` (namePExp body')
-
--- -----------------------------------------------------------------------------
-resolveNamesModule :: ClaferArgs -> (IModule, GEnv) -> Resolve (IModule, GEnv)
-resolveNamesModule args' (imodule, genv') =
-  do
-    imodule' <- foldM (flip ($)) imodule $ map (\f -> flip (curry f) genv') funs
-    return (imodule', genv'{uidClaferMap = createUidIClaferMap imodule'})
-  where
-  funs :: [(IModule, GEnv) -> Resolve IModule]
-  funs
-    | skip_resolver args' = [return . analyzeModule, resolveRedefinition, resolveTModule]
-    | otherwise = [ return . analyzeModule, resolveModuleNames, resolveRedefinition, resolveTModule]
+{-# LANGUAGE FlexibleContexts #-}
+{-
+ Copyright (C) 2012-2017 Kacper Bak <http://gsd.uwaterloo.ca>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+-}
+module Language.Clafer.Intermediate.Resolver where
+
+import Control.Monad
+import Control.Monad.State
+import qualified Data.Map as Map
+import qualified Data.StringMap as SMap
+
+import Language.Clafer.Common
+import Language.Clafer.ClaferArgs
+import Language.Clafer.Intermediate.Intclafer
+import Language.Clafer.Intermediate.ResolverName
+import Language.Clafer.Intermediate.ResolverType
+import Language.Clafer.Intermediate.ResolverInheritance
+
+-- | Run the various resolvers
+resolveModule :: ClaferArgs -> IModule -> Resolve (IModule, GEnv)
+resolveModule    args'         imodule =
+  do
+    r <- resolveNModule $ nameModule (skip_resolver args') imodule
+    resolveNamesModule args' =<< rom' (rem' r)
+  where
+  rem' = if flatten_inheritance args' then resolveEModule else id
+  rom' = if skip_resolver args' then return else resolveOModule
+
+
+-- | Name resolver
+nameModule :: Bool -> IModule -> (IModule, GEnv)
+nameModule skipResolver imodule = (imodule', genv'')
+  where
+    (decls', genv') = runState (mapM (nameElement skipResolver "root") $ _mDecls imodule) $ GEnv Map.empty 0 Map.empty [] SMap.empty
+    imodule' = imodule{_mDecls = decls'}
+    genv'' = genv'{uidClaferMap = createUidIClaferMap imodule'}
+
+
+nameElement :: MonadState GEnv m => Bool -> UID -> IElement -> m IElement
+nameElement skipResolver puid x = case x of
+  IEClafer claf -> IEClafer <$> nameClafer skipResolver puid claf
+  IEConstraint isHard' pexp -> IEConstraint isHard' <$> namePExp pexp
+  IEGoal isMaximize' pexp -> IEGoal isMaximize' <$> namePExp pexp
+
+
+nameClafer :: MonadState GEnv m => Bool -> UID -> IClafer -> m IClafer
+nameClafer skipResolver puid claf = do
+  let puid' = if _isAbstract claf && puid == "root" then baseClafer else puid
+  claf' <- if skipResolver then return claf{_uid = _ident claf, _parentUID = puid'} else renameClafer True puid' claf
+  elements' <- mapM (nameElement skipResolver (_uid claf')) $ _elements claf
+  return $ claf' {_elements = elements'}
+
+
+namePExp :: MonadState GEnv m => PExp -> m PExp
+namePExp pexp@(PExp _ _ _ exp') = do
+  n <- gets expCount
+  modify (\e -> e {expCount = 1 + n})
+  exp'' <- nameIExp exp'
+  return $ pexp {_pid = concat [ "e", show n, "_"], _exp = exp''}
+
+nameIExp :: MonadState GEnv m => IExp -> m IExp
+nameIExp x = case x of
+  IDeclPExp quant' decls' pexp -> do
+    decls'' <- mapM nameIDecl decls'
+    pexp'  <- namePExp pexp
+    return $ IDeclPExp quant' decls'' pexp'
+  IFunExp op' pexps -> IFunExp op' `liftM` mapM namePExp pexps
+  _ -> return x
+
+nameIDecl :: MonadState GEnv m => IDecl -> m IDecl
+nameIDecl (IDecl isDisj' dels body') = IDecl isDisj' dels `liftM` (namePExp body')
+
+-- -----------------------------------------------------------------------------
+resolveNamesModule :: ClaferArgs -> (IModule, GEnv) -> Resolve (IModule, GEnv)
+resolveNamesModule args' (imodule, genv') =
+  do
+    imodule' <- foldM (flip ($)) imodule $ map (\f -> flip (curry f) genv') funs
+    return (imodule', genv'{uidClaferMap = createUidIClaferMap imodule'})
+  where
+  funs :: [(IModule, GEnv) -> Resolve IModule]
+  funs
+    | skip_resolver args' = [return . analyzeModule, resolveRedefinition, resolveTModule]
+    | otherwise = [ return . analyzeModule, resolveModuleNames, resolveRedefinition, resolveTModule]
diff --git a/src/Language/Clafer/Intermediate/ResolverInheritance.hs b/src/Language/Clafer/Intermediate/ResolverInheritance.hs
--- a/src/Language/Clafer/Intermediate/ResolverInheritance.hs
+++ b/src/Language/Clafer/Intermediate/ResolverInheritance.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE NamedFieldPuns #-}
 {-
- Copyright (C) 2012-2015 Kacper Bak, Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Intermediate/ResolverName.hs b/src/Language/Clafer/Intermediate/ResolverName.hs
--- a/src/Language/Clafer/Intermediate/ResolverName.hs
+++ b/src/Language/Clafer/Intermediate/ResolverName.hs
@@ -1,397 +1,397 @@
-{-# LANGUAGE FlexibleContexts #-}
-
-{-
- Copyright (C) 2012 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
--}
-module Language.Clafer.Intermediate.ResolverName where
-
-import Control.Applicative
-import Control.Monad
-import Control.Monad.Except
-import Control.Monad.Trans.Maybe
-import Control.Monad.State
-import Data.Maybe
-import Data.Function
-import Data.List
-import Prelude
-
-import Language.ClaferT
-import Language.Clafer.Common
-import Language.Clafer.Intermediate.Intclafer
-
--- | this environment is created for each clafer
-data SEnv
-  = SEnv
-  { clafers :: [IClafer]                 -- (constant) top level clafers
-  , context :: Maybe IClafer             -- context of a constraint
-  , subClafers :: [(IClafer, [IClafer])] -- descendans (BFS)
-  , ancClafers :: [(IClafer, [IClafer])] -- ancesors (BFS)
-  , bindings :: [([String], [IClafer])]  -- local names
-  , resPath :: [IClafer]                 -- path to the current clafer
-  , genv :: GEnv                         -- (constant)
-  , aClafers :: [(IClafer, [IClafer])]   -- (constant) abstract clafers (BFS)
-  , cClafers :: [(IClafer, [IClafer])]   -- (constant) all concrete clafers (BFS)
-  } deriving Show
-
--- | How a given name was resolved
-data HowResolved
-  = Special     -- ^ "this", "parent", "dref", "root", "clafer", and "children"
-  | TypeSpecial -- ^ primitive type: "integer", "string"
-  | Binding     -- ^ local variable (in constraints)
-  | Subclafers  -- ^ clafer's descendant
-  | Reference   -- ^ resolved by a reference
-  | Ancestor    -- ^ clafer's ancestor
-  | AbsClafer   -- ^ abstract clafer
-  | TopClafer   -- ^ non-abstract top-level clafer
-  deriving (Eq, Show)
-
-type Resolve = Either ClaferSErr
-
--- initialize the cache (env)
-defSEnv :: GEnv -> [IElement] -> SEnv
-defSEnv genv' declarations = env {aClafers = rCl aClafers',
-                                 cClafers = rCl cClafers'}
-  where
-  env = SEnv (toClafers declarations) Nothing [] [] [] [] genv' [] []
-  rCl cs = bfs toNodeDeep $ map (\c -> env{context = Just c, resPath = [c]}) cs
-  (aClafers', cClafers') = partition _isAbstract $ clafers env
-
-checkDuplicateSiblings :: IModule -> Resolve [IElement]
-checkDuplicateSiblings tree = let duplicate = checkDuplicateSiblings' $ _mDecls tree
-                              in if (isJust duplicate) then let Just(name,pos') = duplicate in throwError $ SemanticErr pos' $ ("Duplicate name: " ++ name) --error
-                                 else return $ _mDecls tree
-
-checkDuplicateSiblings' :: [IElement] -> Maybe (String,Span)
-checkDuplicateSiblings' tree =if (isJust check) then check
-                              else checkForJust $ map checkDuplicateSiblings' elementsList
-  where
-    check = checkListDuplicates $ map (\c -> (_ident c, _cinPos c)) $ map (\(IEClafer eclafer) -> eclafer) $ filter isIEClafer tree
-    elementsList = map (\c -> _elements c) $ map (\(IEClafer eclafer) -> eclafer) $ filter isIEClafer tree
-
-
-checkForJust :: [Maybe (String,Span)] -> Maybe (String,Span)
-checkForJust [] = Nothing
-checkForJust (h:rest) = if (isJust h) then
-                          h
-                        else
-                          checkForJust rest
-
-checkListDuplicates :: [(String, Span)] -> Maybe (String,Span)
-checkListDuplicates list = checkListDuplicates' $ sortBy (compare `on` fst) list
-
-checkListDuplicates' :: [(String,Span)] -> Maybe (String,Span)
-checkListDuplicates' [] = Nothing
-checkListDuplicates' (_:[]) = Nothing
-checkListDuplicates' ((a,b):(c,d):rest) = if a == c then
-                                    Just (a,b)
-                                  else
-                                    checkListDuplicates' ((c,d):rest)
-
-isIEClafer :: IElement -> Bool
-isIEClafer (IEClafer _) = True
-isIEClafer _            = False
-
-resolveModuleNames :: (IModule, GEnv) -> Resolve IModule
-resolveModuleNames    (imodule, genv') =
-  do
-    decls' <- checkDuplicateSiblings imodule
-    let defaultSEnv = defSEnv genv' decls'
-    mDecls' <- mapM (resolveElement defaultSEnv) decls'
-    return $ imodule{_mDecls = mDecls'}
-
-resolveClafer :: SEnv -> IClafer -> Resolve IClafer
-resolveClafer env clafer =
-  do
-    elements' <- mapM (resolveElement env'{subClafers = subClafers',
-                                              ancClafers = ancClafers'}) $
-                          _elements clafer
-    return $ clafer {_elements = elements'}
-  where
-  env' = env {context = Just clafer, resPath = clafer : resPath env}
-  subClafers' = tail $ bfs toNodeDeep [env'{resPath = [clafer]}]
-  ancClafers' = init (tails $ resPath env) >>= (mkAncestorList env)
-
-mkAncestorList :: SEnv -> [IClafer] -> [(IClafer, [IClafer])]
-mkAncestorList env rp =
-  bfs toNodeDeep [env{context = Just $ head rp, resPath = rp}]
-
-resolveElement :: SEnv -> IElement -> Resolve IElement
-resolveElement env x = case x of
-  IEClafer clafer  -> IEClafer <$> resolveClafer env clafer
-  IEConstraint isHard' pexp  -> IEConstraint isHard' <$> resolvePExp env pexp
-  IEGoal isMaximize' pexp  -> IEGoal isMaximize' <$> resolvePExp env pexp
-
-resolvePExp :: SEnv -> PExp                          -> Resolve PExp
-resolvePExp    env     pexp@PExp{_exp=x} = case x of
-  -- only local declarations change the environment
-  IDeclPExp quant' decls' pexp2 -> do
-    let (decls'', env') = runState (runExceptT $ (mapM (ExceptT . processDecl) decls')) env
-    exp' <- IDeclPExp quant' <$> decls'' <*> resolvePExp env' pexp2
-    return pexp{_exp=exp'}
-
-  IFunExp "." _ -> fst <$> resolveNav env pexp True
-  IFunExp op' exps' -> do
-                         exp' <- IFunExp op' <$> mapM (resolvePExp env) exps'
-                         return $ pexp {_exp = exp'}
-  IInt _ -> return pexp
-  IDouble _ -> return pexp
-  IReal _ -> return pexp
-  IStr _ -> return pexp
-  IClaferId{} -> fst <$> resolveNav env pexp True
-
-liftError :: Monad m => Either e a -> ExceptT e m a
-liftError = ExceptT . return
-
-processDecl :: MonadState SEnv m => IDecl -> m (Resolve IDecl)
-processDecl decl = runExceptT $ do
-  env <- lift get
-  (body', path) <- liftError $ resolveNav env (_body decl) True
-  lift $ modify (\e -> e { bindings = (_decls decl, path) : bindings e })
-  return $ decl {_body = body'}
-
-resolveNav :: SEnv -> PExp                         -> Bool   -> Resolve (PExp, [IClafer])
-resolveNav    env     pexp0@PExp{_inPos=pos', _exp=x} isFirst =
-  case x of
-    IFunExp "." [pexp1,pexp2] -> do
-      (pexp1', path1) <- resolveNav env                                               pexp1 True
-      (pexp2', path2) <- resolveNav env{context = listToMaybe path1, resPath = path1} pexp2 False
-      -- if `dref` was added to the RHS we need to left rotate the tree
-      case pexp2' of
-        PExp{_exp=IFunExp "." [pexp2'l, pexp2'r]} -> case pexp2'l of
-          PExp{_exp=IClaferId{_sident="dref"}} ->
-            let -- move the `dref` to the LHS
-              pexp0' = pexp0{_exp=IFunExp iJoin [pexp1', pexp2'l]}
-            in -- keep the RHS as is
-              return (pexp2{_exp=IFunExp iJoin [pexp0', pexp2'r]}, path2)
-          _ -> return (pexp0{_exp=IFunExp iJoin [pexp1', pexp2']}, path2)
-        _ -> return (pexp0{_exp=IFunExp iJoin [pexp1', pexp2']}, path2)
-    IClaferId _ "root" _ _ -> return (pexp0, [])
-    IClaferId modName' id' _ _ -> if isFirst
-      then do
-             (exp', path') <- mkPath pos' env <$> resolveName pos' env id'
-             return (pexp0{_exp=exp'}, path')
-      else do
-             (exp', path') <- case resPath env of
-               [] -> mkPath' pos' modName' <$> resolveTopLevelName pos' env id'
-               _  -> mkPath' pos' modName' <$> resolveImmName pos' env id'
-             return (pexp0{_exp=exp'}, path')
-    y -> throwError $ SemanticErr pos' $ "Cannot resolve nav of " ++ show y
-
--- | Depending on how resolved construct a navigation path from 'context env'
-mkPath :: Span -> SEnv -> (HowResolved, String, [IClafer]) -> (IExp, [IClafer])
-mkPath    pos'    env     (howResolved, id',    path)       = case howResolved of
-  Binding -> (IClaferId "" id' True Nothing, path)
-  Special -> (specIExp id', path)
-  TypeSpecial -> (IClaferId "" id' True (Just id'), path)
-  Subclafers -> (toNav $ tail $ reverse $ map toTuple path, path)
-  Ancestor -> (toNav' pos' $ adjustAncestor (fromJust $ context env)
-                                       (reverse $ map toTuple $ resPath env)
-                                       (reverse $ map toTuple path), path)
-  Reference -> (toNav' pos' $ reverse $ map toTuple path, path)
-  AbsClafer -> (toNav' pos' $ reverse $ map toTuple path, path)
-  TopClafer -> (toNav' pos' $ reverse $ map toTuple path, path)
-  where
-  toNav tuplePath = foldl'
-          (\exp' (id'', cbind) -> IFunExp iJoin [pExpDefPid pos' exp', mkPLClaferId pos' id'' (fromMaybe False $ isTopLevel <$> cbind) $ _uid <$> cbind])
-          (IClaferId "" thisIdent True (_uid <$> context env))
-          tuplePath
-  specIExp "this"     = IClaferId "" thisIdent True (_uid <$> context env)
-  specIExp "parent"   = toNav [("parent", Just $ head path)]
-  specIExp "dref"     = toNav [("dref", Just $ head path)]
-  specIExp "root"     = IClaferId "" rootIdent True (Just rootIdent)
-  specIExp "children" = toNav [(id', Just $ head path)]
-  specIExp i          = error $ "[BUG] ResolverName.specIExp: Unknown special id: " ++ i
-
-toTuple :: IClafer->(String, Maybe IClafer)
-toTuple c = (_uid c, Just c)
-
-toNav' :: Span -> [(String, Maybe IClafer)] -> IExp
-toNav'    pos'    tuplePath                  =
-  (mkIFunExp pos' iJoin $ map (\(id', cbind) -> IClaferId "" id' (fromMaybe False $ isTopLevel <$> cbind) (_uid <$> cbind)) tuplePath) :: IExp
-
-adjustAncestor :: IClafer -> [(String, Maybe IClafer)] -> [(String, Maybe IClafer)] -> [(String, Maybe IClafer)]
-adjustAncestor ctx cPath rPath = (thisIdent, Just ctx) : parents ++ (fromJust $ stripPrefix prefix rPath)
-  where
-  parents = replicate (length $ fromJust $ stripPrefix prefix cPath) (parentIdent, Nothing)
-  prefix = fst $ unzip $ takeWhile (uncurry eqIds) $ zip cPath rPath
-  eqIds a b = (fst a) == (fst b)
-
-
-mkPath' :: Span -> String -> (HowResolved, String, [IClafer]) -> (IExp, [IClafer])
-mkPath'    pos' modName'  (howResolved, id', path)          = case howResolved of
-  Reference -> (toNav' pos' (zip ["dref", id'] (map Just path)), path)
-  _ -> (IClaferId modName' id' False (_uid <$> bind), path)
-  where
-    bind = case path of
-      [] -> Nothing
-      c:_ -> Just c
-
--- -----------------------------------------------------------------------------
-
-resolveTopLevelName :: Span -> SEnv -> String -> Resolve (HowResolved, String, [IClafer])
-resolveTopLevelName pos' env id' = resolve env id'
-  [resolveTopLevelOnly pos', resolveNone pos']
-
-resolveName :: Span -> SEnv -> String -> Resolve (HowResolved, String, [IClafer])
-resolveName pos' env id' = resolve env id'
-  [resolveSpecial, resolveBind, resolveDescendants, resolveAncestor pos', resolveTopLevel pos', resolveNone pos']
-
-
-resolveImmName :: Span -> SEnv -> String -> Resolve (HowResolved, String, [IClafer])
-resolveImmName pos' env id' = resolve env id'
-  [resolveSpecial, resolveChildren pos', resolveReference pos', resolveNone pos']
-
-
--- when one strategy fails, we want to move to the next one
-resolve :: Monad f => SEnv -> String -> [SEnv -> String -> f (Maybe b)] -> f b
-resolve env id' fs = fromJust <$> (runMaybeT $ msum $ map (\x -> MaybeT $ x env id') fs)
-
-
--- reports error if clafer not found
-resolveNone :: Span -> SEnv -> String -> Resolve t
-resolveNone pos' env id' =
-  throwError $ SemanticErr pos' $ concat
-    [ "Name resolver: '"
-    , id'
-    , "' not found within paths:"
-    , showPath $ map _uid $ resPath env
-    , "in context of '"
-    , show $ fromMaybe "none" (_uid <$> context env)
-    , "'" ]
-
-
--- checks if ident is one of special identifiers
-resolveSpecial :: SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
-resolveSpecial env id'
-  | id' == parentIdent = return $ Just (Special, id', safeTail $ resPath env)
-  | isSpecial id'      = return $ Just (Special, id', resPath env)
-  | isPrimitive id'    = return $ Just (TypeSpecial, id', [])
-  | otherwise          = return Nothing
-
-
--- checks if ident is bound locally
-resolveBind :: SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
-resolveBind env id' = return $ find (\bs -> id' `elem` fst bs) (bindings env) >>=
-  (\x -> Just (Binding, id', snd x))
-
-
--- searches for a name in all subclafers (BFS)
-resolveDescendants :: SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
-resolveDescendants env id' = return $
-  (context env) >> (findFirst id' $ subClafers env) >>= (toMTriple Subclafers)
-
--- searches for a name in immediate subclafers (BFS)
-resolveChildren :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
-resolveChildren pos' env id' = resolveChildren' pos' env id' allInhChildren Subclafers
-
--- searches for a name by dereferencing clafer
-resolveReference :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
-resolveReference pos' env id' = resolveChildren' pos' env id' allChildren Reference
-
-resolveChildren' :: Span -> SEnv -> String -> (SEnv -> [IClafer]) -> HowResolved -> Either ClaferSErr (Maybe (HowResolved, String, [IClafer]))
-resolveChildren' pos' env id' getChildrenF label =
-  runMaybeT $ do
-    _ <- liftMaybe $ context env
-    u <- MaybeT $ findUnique pos' id' $ map (\x -> (x, [x,fromJust $ context env])) $ getChildrenF env
-    liftMaybe $ toMTriple label u
-
-liftMaybe :: Maybe a -> MaybeT (Either ClaferSErr) a
-liftMaybe = MaybeT . return
-
-resolveAncestor :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
-resolveAncestor pos' env id' =
-  runMaybeT $ do
-    _ <- liftMaybe $ context env
-    u <- MaybeT $ findUnique pos' id' $ ancClafers env
-    liftMaybe $ toMTriple Ancestor u
-
-
--- searches for a feature starting from local root (BFS) and then continues with
--- other declarations
-resolveTopLevel :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
-resolveTopLevel pos' env id' = runMaybeT $ foldr1 mplus $ map
-  (\(cs, hr) -> MaybeT (findUnique pos' id' cs) >>= (liftMaybe . toMTriple hr))
-  [(aClafers env, AbsClafer), (cClafers env, TopClafer)]
-
--- searches for a name in all subclafers (BFS)
-resolveTopLevelOnly :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
-resolveTopLevelOnly _ env id' = return result
-  where
-    found = filter (\c -> _ident c == id') $ clafers env
-    result = case found of
-      [c]  -> Just (TopClafer, _uid c, found)
-      _    -> Nothing
-
-
-toNodeDeep :: SEnv -> ((IClafer, [IClafer]), [SEnv])
-              -- ((curr. clafer, resolution path), remaining children to traverse)
-toNodeDeep env
-  | length (clafer `elemIndices` resPath env) > 1 = (result, [])  -- cut bfs recusion in case clafer repeats
-  | otherwise = (result, map (\c -> env {context = Just c,
-                                         resPath = c : resPath env}) $
-                 allInhChildren env)
-  where
-  result = (clafer, resPath env)
-  clafer = fromJust $ context env
-
-
--- return children and inherited children but no children of reference targets
-allInhChildren :: SEnv -> [IClafer]
-allInhChildren = selectChildren getSuper
-
--- return all children including inherited children children of reference targets
-allChildren :: SEnv -> [IClafer]
-allChildren = selectChildren getSuperAndReference
-
-selectChildren :: (IClafer -> [String]) -> SEnv -> [IClafer]
-selectChildren f env = getSubclafers $ concat $
-                       mapHierarchy _elements f (uidClaferMap $ genv env)
-                       (fromJust $ context env)
-
-findUnique :: Span -> String -> [(IClafer, [IClafer])] -> Resolve (Maybe (String, [IClafer]))
-findUnique pos' x xs =
-  case filterPaths x $ nub xs of
-    []     -> return Nothing
-    [elem'] -> return $ Just (_uid $ fst elem', snd elem')
-    xs'    -> throwError $ SemanticErr pos' $ "clafer " ++ show x ++ " " ++ errMsg
-      where
-      xs''   = map ((map _uid).snd) xs'
-      errMsg = (if isNamespaceConflict xs''
-               then "cannot be defined because the name should be unique in the same namespace.\n"
-               else "is not unique. ") ++
-               "Available paths:\n" ++ (xs'' >>= showPath)
-
-findFirst :: String -> [(IClafer, [IClafer])] -> Maybe (String, [IClafer])
-findFirst x xs =
-  case filterPaths x $ nub xs of
-    []       -> Nothing
-    (ele:_) -> Just $ (_uid $ fst ele, snd ele)
-
-showPath :: [String] -> String
-showPath xs = (intercalate "." $ reverse xs) ++ "\n"
-
-isNamespaceConflict :: [[String]] -> Bool
-isNamespaceConflict (xs:ys:_) = tail xs == tail ys
-isNamespaceConflict x         = error $ "isNamespaceConflict must be given a list"
-                                         ++ " of at least two elements, but was given " ++ show x
-
-filterPaths :: String -> [(IClafer, [IClafer])] -> [(IClafer, [IClafer])]
-filterPaths x xs = filter (((==) x)._ident.fst) xs
+{-# LANGUAGE FlexibleContexts #-}
+
+{-
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+-}
+module Language.Clafer.Intermediate.ResolverName where
+
+import Control.Applicative
+import Control.Monad
+import Control.Monad.Except
+import Control.Monad.Trans.Maybe
+import Control.Monad.State
+import Data.Maybe
+import Data.Function
+import Data.List
+import Prelude
+
+import Language.ClaferT
+import Language.Clafer.Common
+import Language.Clafer.Intermediate.Intclafer
+
+-- | this environment is created for each clafer
+data SEnv
+  = SEnv
+  { clafers :: [IClafer]                 -- (constant) top level clafers
+  , context :: Maybe IClafer             -- context of a constraint
+  , subClafers :: [(IClafer, [IClafer])] -- descendans (BFS)
+  , ancClafers :: [(IClafer, [IClafer])] -- ancesors (BFS)
+  , bindings :: [([String], [IClafer])]  -- local names
+  , resPath :: [IClafer]                 -- path to the current clafer
+  , genv :: GEnv                         -- (constant)
+  , aClafers :: [(IClafer, [IClafer])]   -- (constant) abstract clafers (BFS)
+  , cClafers :: [(IClafer, [IClafer])]   -- (constant) all concrete clafers (BFS)
+  } deriving Show
+
+-- | How a given name was resolved
+data HowResolved
+  = Special     -- ^ "this", "parent", "dref", "root", "clafer", and "children"
+  | TypeSpecial -- ^ primitive type: "integer", "string"
+  | Binding     -- ^ local variable (in constraints)
+  | Subclafers  -- ^ clafer's descendant
+  | Reference   -- ^ resolved by a reference
+  | Ancestor    -- ^ clafer's ancestor
+  | AbsClafer   -- ^ abstract clafer
+  | TopClafer   -- ^ non-abstract top-level clafer
+  deriving (Eq, Show)
+
+type Resolve = Either ClaferSErr
+
+-- initialize the cache (env)
+defSEnv :: GEnv -> [IElement] -> SEnv
+defSEnv genv' declarations = env {aClafers = rCl aClafers',
+                                 cClafers = rCl cClafers'}
+  where
+  env = SEnv (toClafers declarations) Nothing [] [] [] [] genv' [] []
+  rCl cs = bfs toNodeDeep $ map (\c -> env{context = Just c, resPath = [c]}) cs
+  (aClafers', cClafers') = partition _isAbstract $ clafers env
+
+checkDuplicateSiblings :: IModule -> Resolve [IElement]
+checkDuplicateSiblings tree = let duplicate = checkDuplicateSiblings' $ _mDecls tree
+                              in if (isJust duplicate) then let Just(name,pos') = duplicate in throwError $ SemanticErr pos' $ ("Duplicate name: " ++ name) --error
+                                 else return $ _mDecls tree
+
+checkDuplicateSiblings' :: [IElement] -> Maybe (String,Span)
+checkDuplicateSiblings' tree =if (isJust check) then check
+                              else checkForJust $ map checkDuplicateSiblings' elementsList
+  where
+    check = checkListDuplicates $ map (\c -> (_ident c, _cinPos c)) $ map (\(IEClafer eclafer) -> eclafer) $ filter isIEClafer tree
+    elementsList = map (\c -> _elements c) $ map (\(IEClafer eclafer) -> eclafer) $ filter isIEClafer tree
+
+
+checkForJust :: [Maybe (String,Span)] -> Maybe (String,Span)
+checkForJust [] = Nothing
+checkForJust (h:rest) = if (isJust h) then
+                          h
+                        else
+                          checkForJust rest
+
+checkListDuplicates :: [(String, Span)] -> Maybe (String,Span)
+checkListDuplicates list = checkListDuplicates' $ sortBy (compare `on` fst) list
+
+checkListDuplicates' :: [(String,Span)] -> Maybe (String,Span)
+checkListDuplicates' [] = Nothing
+checkListDuplicates' (_:[]) = Nothing
+checkListDuplicates' ((a,b):(c,d):rest) = if a == c then
+                                    Just (a,b)
+                                  else
+                                    checkListDuplicates' ((c,d):rest)
+
+isIEClafer :: IElement -> Bool
+isIEClafer (IEClafer _) = True
+isIEClafer _            = False
+
+resolveModuleNames :: (IModule, GEnv) -> Resolve IModule
+resolveModuleNames    (imodule, genv') =
+  do
+    decls' <- checkDuplicateSiblings imodule
+    let defaultSEnv = defSEnv genv' decls'
+    mDecls' <- mapM (resolveElement defaultSEnv) decls'
+    return $ imodule{_mDecls = mDecls'}
+
+resolveClafer :: SEnv -> IClafer -> Resolve IClafer
+resolveClafer env clafer =
+  do
+    elements' <- mapM (resolveElement env'{subClafers = subClafers',
+                                              ancClafers = ancClafers'}) $
+                          _elements clafer
+    return $ clafer {_elements = elements'}
+  where
+  env' = env {context = Just clafer, resPath = clafer : resPath env}
+  subClafers' = tail $ bfs toNodeDeep [env'{resPath = [clafer]}]
+  ancClafers' = init (tails $ resPath env) >>= (mkAncestorList env)
+
+mkAncestorList :: SEnv -> [IClafer] -> [(IClafer, [IClafer])]
+mkAncestorList env rp =
+  bfs toNodeDeep [env{context = Just $ head rp, resPath = rp}]
+
+resolveElement :: SEnv -> IElement -> Resolve IElement
+resolveElement env x = case x of
+  IEClafer clafer  -> IEClafer <$> resolveClafer env clafer
+  IEConstraint isHard' pexp  -> IEConstraint isHard' <$> resolvePExp env pexp
+  IEGoal isMaximize' pexp  -> IEGoal isMaximize' <$> resolvePExp env pexp
+
+resolvePExp :: SEnv -> PExp                          -> Resolve PExp
+resolvePExp    env     pexp@PExp{_exp=x} = case x of
+  -- only local declarations change the environment
+  IDeclPExp quant' decls' pexp2 -> do
+    let (decls'', env') = runState (runExceptT $ (mapM (ExceptT . processDecl) decls')) env
+    exp' <- IDeclPExp quant' <$> decls'' <*> resolvePExp env' pexp2
+    return pexp{_exp=exp'}
+
+  IFunExp "." _ -> fst <$> resolveNav env pexp True
+  IFunExp op' exps' -> do
+                         exp' <- IFunExp op' <$> mapM (resolvePExp env) exps'
+                         return $ pexp {_exp = exp'}
+  IInt _ -> return pexp
+  IDouble _ -> return pexp
+  IReal _ -> return pexp
+  IStr _ -> return pexp
+  IClaferId{} -> fst <$> resolveNav env pexp True
+
+liftError :: Monad m => Either e a -> ExceptT e m a
+liftError = ExceptT . return
+
+processDecl :: MonadState SEnv m => IDecl -> m (Resolve IDecl)
+processDecl decl = runExceptT $ do
+  env <- lift get
+  (body', path) <- liftError $ resolveNav env (_body decl) True
+  lift $ modify (\e -> e { bindings = (_decls decl, path) : bindings e })
+  return $ decl {_body = body'}
+
+resolveNav :: SEnv -> PExp                         -> Bool   -> Resolve (PExp, [IClafer])
+resolveNav    env     pexp0@PExp{_inPos=pos', _exp=x} isFirst =
+  case x of
+    IFunExp "." [pexp1,pexp2] -> do
+      (pexp1', path1) <- resolveNav env                                               pexp1 True
+      (pexp2', path2) <- resolveNav env{context = listToMaybe path1, resPath = path1} pexp2 False
+      -- if `dref` was added to the RHS we need to left rotate the tree
+      case pexp2' of
+        PExp{_exp=IFunExp "." [pexp2'l, pexp2'r]} -> case pexp2'l of
+          PExp{_exp=IClaferId{_sident="dref"}} ->
+            let -- move the `dref` to the LHS
+              pexp0' = pexp0{_exp=IFunExp iJoin [pexp1', pexp2'l]}
+            in -- keep the RHS as is
+              return (pexp2{_exp=IFunExp iJoin [pexp0', pexp2'r]}, path2)
+          _ -> return (pexp0{_exp=IFunExp iJoin [pexp1', pexp2']}, path2)
+        _ -> return (pexp0{_exp=IFunExp iJoin [pexp1', pexp2']}, path2)
+    IClaferId _ "root" _ _ -> return (pexp0, [])
+    IClaferId modName' id' _ _ -> if isFirst
+      then do
+             (exp', path') <- mkPath pos' env <$> resolveName pos' env id'
+             return (pexp0{_exp=exp'}, path')
+      else do
+             (exp', path') <- case resPath env of
+               [] -> mkPath' pos' modName' <$> resolveTopLevelName pos' env id'
+               _  -> mkPath' pos' modName' <$> resolveImmName pos' env id'
+             return (pexp0{_exp=exp'}, path')
+    y -> throwError $ SemanticErr pos' $ "Cannot resolve nav of " ++ show y
+
+-- | Depending on how resolved construct a navigation path from 'context env'
+mkPath :: Span -> SEnv -> (HowResolved, String, [IClafer]) -> (IExp, [IClafer])
+mkPath    pos'    env     (howResolved, id',    path)       = case howResolved of
+  Binding -> (IClaferId "" id' True Nothing, path)
+  Special -> (specIExp id', path)
+  TypeSpecial -> (IClaferId "" id' True (Just id'), path)
+  Subclafers -> (toNav $ tail $ reverse $ map toTuple path, path)
+  Ancestor -> (toNav' pos' $ adjustAncestor (fromJust $ context env)
+                                       (reverse $ map toTuple $ resPath env)
+                                       (reverse $ map toTuple path), path)
+  Reference -> (toNav' pos' $ reverse $ map toTuple path, path)
+  AbsClafer -> (toNav' pos' $ reverse $ map toTuple path, path)
+  TopClafer -> (toNav' pos' $ reverse $ map toTuple path, path)
+  where
+  toNav tuplePath = foldl'
+          (\exp' (id'', cbind) -> IFunExp iJoin [pExpDefPid pos' exp', mkPLClaferId pos' id'' (fromMaybe False $ isTopLevel <$> cbind) $ _uid <$> cbind])
+          (IClaferId "" thisIdent True (_uid <$> context env))
+          tuplePath
+  specIExp "this"     = IClaferId "" thisIdent True (_uid <$> context env)
+  specIExp "parent"   = toNav [("parent", Just $ head path)]
+  specIExp "dref"     = toNav [("dref", Just $ head path)]
+  specIExp "root"     = IClaferId "" rootIdent True (Just rootIdent)
+  specIExp "children" = toNav [(id', Just $ head path)]
+  specIExp i          = error $ "[BUG] ResolverName.specIExp: Unknown special id: " ++ i
+
+toTuple :: IClafer->(String, Maybe IClafer)
+toTuple c = (_uid c, Just c)
+
+toNav' :: Span -> [(String, Maybe IClafer)] -> IExp
+toNav'    pos'    tuplePath                  =
+  (mkIFunExp pos' iJoin $ map (\(id', cbind) -> IClaferId "" id' (fromMaybe False $ isTopLevel <$> cbind) (_uid <$> cbind)) tuplePath) :: IExp
+
+adjustAncestor :: IClafer -> [(String, Maybe IClafer)] -> [(String, Maybe IClafer)] -> [(String, Maybe IClafer)]
+adjustAncestor ctx cPath rPath = (thisIdent, Just ctx) : parents ++ (fromJust $ stripPrefix prefix rPath)
+  where
+  parents = replicate (length $ fromJust $ stripPrefix prefix cPath) (parentIdent, Nothing)
+  prefix = fst $ unzip $ takeWhile (uncurry eqIds) $ zip cPath rPath
+  eqIds a b = (fst a) == (fst b)
+
+
+mkPath' :: Span -> String -> (HowResolved, String, [IClafer]) -> (IExp, [IClafer])
+mkPath'    pos' modName'  (howResolved, id', path)          = case howResolved of
+  Reference -> (toNav' pos' (zip ["dref", id'] (map Just path)), path)
+  _ -> (IClaferId modName' id' False (_uid <$> bind), path)
+  where
+    bind = case path of
+      [] -> Nothing
+      c:_ -> Just c
+
+-- -----------------------------------------------------------------------------
+
+resolveTopLevelName :: Span -> SEnv -> String -> Resolve (HowResolved, String, [IClafer])
+resolveTopLevelName pos' env id' = resolve env id'
+  [resolveTopLevelOnly pos', resolveNone pos']
+
+resolveName :: Span -> SEnv -> String -> Resolve (HowResolved, String, [IClafer])
+resolveName pos' env id' = resolve env id'
+  [resolveSpecial, resolveBind, resolveDescendants, resolveAncestor pos', resolveTopLevel pos', resolveNone pos']
+
+
+resolveImmName :: Span -> SEnv -> String -> Resolve (HowResolved, String, [IClafer])
+resolveImmName pos' env id' = resolve env id'
+  [resolveSpecial, resolveChildren pos', resolveReference pos', resolveNone pos']
+
+
+-- when one strategy fails, we want to move to the next one
+resolve :: Monad f => SEnv -> String -> [SEnv -> String -> f (Maybe b)] -> f b
+resolve env id' fs = fromJust <$> (runMaybeT $ msum $ map (\x -> MaybeT $ x env id') fs)
+
+
+-- reports error if clafer not found
+resolveNone :: Span -> SEnv -> String -> Resolve t
+resolveNone pos' env id' =
+  throwError $ SemanticErr pos' $ concat
+    [ "Name resolver: '"
+    , id'
+    , "' not found within paths:"
+    , showPath $ map _uid $ resPath env
+    , "in context of '"
+    , show $ fromMaybe "none" (_uid <$> context env)
+    , "'" ]
+
+
+-- checks if ident is one of special identifiers
+resolveSpecial :: SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
+resolveSpecial env id'
+  | id' == parentIdent = return $ Just (Special, id', safeTail $ resPath env)
+  | isSpecial id'      = return $ Just (Special, id', resPath env)
+  | isPrimitive id'    = return $ Just (TypeSpecial, id', [])
+  | otherwise          = return Nothing
+
+
+-- checks if ident is bound locally
+resolveBind :: SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
+resolveBind env id' = return $ find (\bs -> id' `elem` fst bs) (bindings env) >>=
+  (\x -> Just (Binding, id', snd x))
+
+
+-- searches for a name in all subclafers (BFS)
+resolveDescendants :: SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
+resolveDescendants env id' = return $
+  (context env) >> (findFirst id' $ subClafers env) >>= (toMTriple Subclafers)
+
+-- searches for a name in immediate subclafers (BFS)
+resolveChildren :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
+resolveChildren pos' env id' = resolveChildren' pos' env id' allInhChildren Subclafers
+
+-- searches for a name by dereferencing clafer
+resolveReference :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
+resolveReference pos' env id' = resolveChildren' pos' env id' allChildren Reference
+
+resolveChildren' :: Span -> SEnv -> String -> (SEnv -> [IClafer]) -> HowResolved -> Either ClaferSErr (Maybe (HowResolved, String, [IClafer]))
+resolveChildren' pos' env id' getChildrenF label =
+  runMaybeT $ do
+    _ <- liftMaybe $ context env
+    u <- MaybeT $ findUnique pos' id' $ map (\x -> (x, [x,fromJust $ context env])) $ getChildrenF env
+    liftMaybe $ toMTriple label u
+
+liftMaybe :: Maybe a -> MaybeT (Either ClaferSErr) a
+liftMaybe = MaybeT . return
+
+resolveAncestor :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
+resolveAncestor pos' env id' =
+  runMaybeT $ do
+    _ <- liftMaybe $ context env
+    u <- MaybeT $ findUnique pos' id' $ ancClafers env
+    liftMaybe $ toMTriple Ancestor u
+
+
+-- searches for a feature starting from local root (BFS) and then continues with
+-- other declarations
+resolveTopLevel :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
+resolveTopLevel pos' env id' = runMaybeT $ foldr1 mplus $ map
+  (\(cs, hr) -> MaybeT (findUnique pos' id' cs) >>= (liftMaybe . toMTriple hr))
+  [(aClafers env, AbsClafer), (cClafers env, TopClafer)]
+
+-- searches for a name in all subclafers (BFS)
+resolveTopLevelOnly :: Span -> SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
+resolveTopLevelOnly _ env id' = return result
+  where
+    found = filter (\c -> _ident c == id') $ clafers env
+    result = case found of
+      [c]  -> Just (TopClafer, _uid c, found)
+      _    -> Nothing
+
+
+toNodeDeep :: SEnv -> ((IClafer, [IClafer]), [SEnv])
+              -- ((curr. clafer, resolution path), remaining children to traverse)
+toNodeDeep env
+  | length (clafer `elemIndices` resPath env) > 1 = (result, [])  -- cut bfs recusion in case clafer repeats
+  | otherwise = (result, map (\c -> env {context = Just c,
+                                         resPath = c : resPath env}) $
+                 allInhChildren env)
+  where
+  result = (clafer, resPath env)
+  clafer = fromJust $ context env
+
+
+-- return children and inherited children but no children of reference targets
+allInhChildren :: SEnv -> [IClafer]
+allInhChildren = selectChildren getSuper
+
+-- return all children including inherited children children of reference targets
+allChildren :: SEnv -> [IClafer]
+allChildren = selectChildren getSuperAndReference
+
+selectChildren :: (IClafer -> [String]) -> SEnv -> [IClafer]
+selectChildren f env = getSubclafers $ concat $
+                       mapHierarchy _elements f (uidClaferMap $ genv env)
+                       (fromJust $ context env)
+
+findUnique :: Span -> String -> [(IClafer, [IClafer])] -> Resolve (Maybe (String, [IClafer]))
+findUnique pos' x xs =
+  case filterPaths x $ nub xs of
+    []     -> return Nothing
+    [elem'] -> return $ Just (_uid $ fst elem', snd elem')
+    xs'    -> throwError $ SemanticErr pos' $ "clafer " ++ show x ++ " " ++ errMsg
+      where
+      xs''   = map ((map _uid).snd) xs'
+      errMsg = (if isNamespaceConflict xs''
+               then "cannot be defined because the name should be unique in the same namespace.\n"
+               else "is not unique. ") ++
+               "Available paths:\n" ++ (xs'' >>= showPath)
+
+findFirst :: String -> [(IClafer, [IClafer])] -> Maybe (String, [IClafer])
+findFirst x xs =
+  case filterPaths x $ nub xs of
+    []       -> Nothing
+    (ele:_) -> Just $ (_uid $ fst ele, snd ele)
+
+showPath :: [String] -> String
+showPath xs = (intercalate "." $ reverse xs) ++ "\n"
+
+isNamespaceConflict :: [[String]] -> Bool
+isNamespaceConflict (xs:ys:_) = tail xs == tail ys
+isNamespaceConflict x         = error $ "isNamespaceConflict must be given a list"
+                                         ++ " of at least two elements, but was given " ++ show x
+
+filterPaths :: String -> [(IClafer, [IClafer])] -> [(IClafer, [IClafer])]
+filterPaths x xs = filter (((==) x)._ident.fst) xs
diff --git a/src/Language/Clafer/Intermediate/ResolverType.hs b/src/Language/Clafer/Intermediate/ResolverType.hs
--- a/src/Language/Clafer/Intermediate/ResolverType.hs
+++ b/src/Language/Clafer/Intermediate/ResolverType.hs
@@ -1,479 +1,479 @@
-{-# LANGUAGE NamedFieldPuns, FlexibleInstances, FlexibleContexts, GeneralizedNewtypeDeriving #-}
-{-
- Copyright (C) 2012-2015 Jimmy Liang, Kacper Bak, Michal Antkiewicz <http://gsd.uwaterloo.ca>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
--}
-module Language.Clafer.Intermediate.ResolverType (resolveTModule)  where
-
-import Language.ClaferT
-import Language.Clafer.Common
-import Language.Clafer.Intermediate.Intclafer hiding (uid)
-import Language.Clafer.Intermediate.Desugarer
-import Language.Clafer.Intermediate.TypeSystem
-import Language.Clafer.Front.PrintClafer
-
-import Control.Applicative
-import Control.Exception (assert)
-import Control.Lens ((&), (%~), traversed)
-import Control.Monad.Except
-import Control.Monad.List
-import Control.Monad.Reader
-import Data.Either
-import Data.List
-import Data.Maybe
-import Prelude hiding (exp)
-
-type TypeDecls = [(String, IType)]
-data TypeInfo = TypeInfo {iTypeDecls::TypeDecls, iUIDIClaferMap::UIDIClaferMap, iCurThis::IClafer, iCurPath::Maybe IType}
-
-newtype TypeAnalysis a = TypeAnalysis (ReaderT TypeInfo (Either ClaferSErr) a)
-  deriving (MonadError ClaferSErr, Monad, Functor, MonadReader TypeInfo, Applicative)
-
--- return the type of a UID but give preference to local declarations in quantified expressions, which shadow global names
-typeOfUid :: MonadTypeAnalysis m => UID -> m IType
-typeOfUid uid = (fromMaybe (TClafer [uid]) . lookup uid) <$> typeDecls
-
-class (Functor m, Monad m) => MonadTypeAnalysis m where
-  -- What "this" refers to
-  curThis :: m IClafer
-  localCurThis :: IClafer -> m a -> m a
-
-  -- The next path is a child of curPath (or Nothing)
-  curPath :: m (Maybe IType)
-  localCurPath :: IType -> m a -> m a
-
-  -- Extra declarations
-  typeDecls :: m TypeDecls
-  localDecls :: TypeDecls -> m a -> m a
-
-instance MonadTypeAnalysis TypeAnalysis where
-  curThis = TypeAnalysis $ asks iCurThis
-  localCurThis newThis (TypeAnalysis d) =
-    TypeAnalysis $ local setCurThis d
-    where
-    setCurThis t = t{iCurThis = newThis}
-
-  curPath = TypeAnalysis $ asks iCurPath
-  localCurPath newPath (TypeAnalysis d) =
-    TypeAnalysis $ local setCurPath d
-    where
-    setCurPath t = t{iCurPath = Just newPath}
-
-  typeDecls = TypeAnalysis $ asks iTypeDecls
-  localDecls extra (TypeAnalysis d) =
-    TypeAnalysis $ local addTypeDecls d
-    where
-    addTypeDecls t@TypeInfo{iTypeDecls = c} = t{iTypeDecls = extra ++ c}
-
-instance MonadTypeAnalysis m => MonadTypeAnalysis (ListT m) where
-  curThis = lift curThis
-  localCurThis = mapListT . localCurThis
-  curPath = lift curPath
-  localCurPath = mapListT . localCurPath
-  typeDecls = lift typeDecls
-  localDecls = mapListT . localDecls
-
-instance MonadTypeAnalysis m => MonadTypeAnalysis (ExceptT ClaferSErr m) where
-  curThis = lift curThis
-  localCurThis = mapExceptT . localCurThis
-  curPath = lift curPath
-  localCurPath = mapExceptT . localCurPath
-  typeDecls = lift typeDecls
-  localDecls = mapExceptT . localDecls
-
--- | Type inference and checking
-runTypeAnalysis :: TypeAnalysis a -> IModule -> Either ClaferSErr a
-runTypeAnalysis (TypeAnalysis tc) imodule = runReaderT tc $ TypeInfo [] (createUidIClaferMap imodule) undefined Nothing
-
-claferWithUid :: (Monad m) => UIDIClaferMap -> String -> m IClafer
-claferWithUid uidIClaferMap' u = case findIClafer uidIClaferMap' u of
-  Just c -> return c
-  Nothing -> fail $ "ResolverType.claferWithUid: " ++ u ++ " not found!"
-
-parentOf :: (Monad m) => UIDIClaferMap -> UID -> m UID
-parentOf uidIClaferMap' c = case _parentUID <$> findIClafer uidIClaferMap' c of
-  Just u -> return u
-  Nothing -> fail $ "ResolverType.parentOf: " ++ c ++ " not found!"
-
-{-
- - C is an direct child of B.
- -
- -  abstract A
- -    C      // C - child
- -  B : A    // B - parent
- -}
-isIndirectChild :: (Monad m) => UIDIClaferMap -> UID -> UID -> m Bool
-isIndirectChild uidIClaferMap' child parent = do
-  (_:allSupers) <- hierarchy uidIClaferMap' parent
-  childOfSupers <- mapM ((isChild uidIClaferMap' child)._uid) allSupers
-  return $ or childOfSupers
-
-isChild :: (Monad m) => UIDIClaferMap -> UID -> UID -> m Bool
-isChild uidIClaferMap' child parent =
-    case findIClafer uidIClaferMap' child of
-        Nothing -> return False
-        Just childIClafer -> do
-            let directChild = (parent == _parentUID childIClafer)
-            indirectChild <- isIndirectChild uidIClaferMap' child parent
-            return $ directChild || indirectChild
-
-
-str :: IType -> String
-str t =
-  case unionType t of
-    [t'] -> t'
-    ts   -> "[" ++ intercalate "," ts ++ "]"
-
-showType :: PExp                   -> String
-showType    PExp{ _iType=Nothing }  = "unknown type"
-showType    PExp{ _iType=(Just t) } = show t
-
-data TAMode
-  = TAReferences    -- ^ Phase one: only process references
-  | TAExpressions   -- ^ Phase two: only process constraints and goals
-
-resolveTModule :: (IModule, GEnv) -> Either ClaferSErr IModule
-resolveTModule (imodule, _) =
-  case runTypeAnalysis (analysisReferences $ _mDecls imodule) imodule of
-    Right mDecls' -> case runTypeAnalysis (analysisExpressions $ mDecls') imodule{_mDecls = mDecls'} of
-      Right mDecls'' -> return imodule{_mDecls = mDecls''}
-      Left err      -> throwError err
-    Left err      -> throwError err
-  where
-  analysisReferences = mapM (resolveTElement TAReferences rootIdent)
-  analysisExpressions = mapM (resolveTElement TAExpressions rootIdent)
-
--- Phase one: only process references
-resolveTElement :: TAMode     -> String -> IElement          -> TypeAnalysis IElement
-resolveTElement    TAReferences  _         (IEClafer iclafer) =
-  do
-    uidIClaferMap' <- asks iUIDIClaferMap
-    reference' <- case _reference iclafer of
-      Nothing -> return Nothing
-      Just originalReference -> do
-        refs' <- resolveTPExp $ _ref originalReference
-        case refs' of
-          []     -> return Nothing
-          [ref'] -> return $ refWithNewType uidIClaferMap' originalReference ref'
-          (ref':_) -> return $ refWithNewType uidIClaferMap' originalReference ref'
-    elements' <- mapM (resolveTElement TAReferences (_uid iclafer)) (_elements iclafer)
-    return $ IEClafer iclafer{_elements = elements', _reference=reference'}
-  where
-    refWithNewType uMap oRef r = let
-        r' = r & iType.traversed %~ (addHierarchy uMap)
-      in case _iType r' of
-        Nothing -> Nothing
-        Just t -> if isTBoolean t
-                  then Nothing
-                  else Just $ oRef{_ref=r'}
-resolveTElement    TAReferences  _         iec@IEConstraint{} = return iec
-resolveTElement    TAReferences  _         ieg@IEGoal{} = return ieg
-
--- Phase two: only process constraints and goals
-resolveTElement    TAExpressions  _         (IEClafer iclafer) =
-  do
-    elements' <- mapM (resolveTElement TAExpressions (_uid iclafer)) (_elements iclafer)
-    return $ IEClafer iclafer{_elements = elements'}
-resolveTElement    TAExpressions parent'   (IEConstraint _isHard _pexp) =
-  IEConstraint _isHard <$> (testBoolean =<< resolveTConstraint parent' _pexp)
-  where
-  testBoolean pexp' =
-    do
-      unless (isTBoolean $ typeOf pexp') $
-        throwError $ SemanticErr (_inPos pexp') ("A constraint requires an expression of type 'TBoolean' but got '" ++ showType pexp' ++ "'")
-      return pexp'
-resolveTElement    TAExpressions parent' (IEGoal isMaximize' pexp') =
-  IEGoal isMaximize' <$> resolveTConstraint parent' pexp'
-
-resolveTConstraint :: String -> PExp -> TypeAnalysis PExp
-resolveTConstraint curThis' constraint =
-  do
-    uidIClaferMap' <- asks iUIDIClaferMap
-    curThis'' <- claferWithUid uidIClaferMap' curThis'
-    head <$> localCurThis curThis'' (resolveTPExp constraint :: TypeAnalysis [PExp])
-
-
-resolveTPExp :: PExp -> TypeAnalysis [PExp]
-resolveTPExp p =
-  do
-    x <- resolveTPExp' p
-    case partitionEithers x of
-      (f:_, []) -> throwError f                       -- Case 1: Only fails. Complain about the first one.
-      ([], [])  -> throwError $ SemanticErr (_inPos p) ("No results but no errors for " ++ show p) -- Case 2: No success and no error message. Bug.
-      (_,   xs) -> return xs                          -- Case 3: At least one success.
-
-resolveTPExp' :: PExp -> TypeAnalysis [Either ClaferSErr PExp]
-resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident = "dref"}} = do
-  uidIClaferMap' <- asks iUIDIClaferMap
-  runListT $ runExceptT $ do
-    curPath' <- curPath
-    case curPath' of
-      Just curPath'' -> do
-        case concatMap (getTMaps uidIClaferMap') $ getTClafers uidIClaferMap' curPath'' of
-          [t'] -> return $ p `withType` t'
-          (t':_) -> return $ p `withType` t'
-          [] -> throwError $ SemanticErr _inPos ("Cannot deref from type '" ++ str curPath'' ++ "'")
-      Nothing -> throwError $ SemanticErr _inPos ("Cannot deref at the start of a path")
-resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident = "parent"}} = do
-  uidIClaferMap' <- asks iUIDIClaferMap
-  runListT $ runExceptT $ do
-    curPath' <- curPath
-    case curPath' of
-      Just curPath'' -> do
-        parent' <- fromUnionType <$> runListT (parentOf uidIClaferMap' =<< liftList (unionType curPath''))
-        when (isNothing parent') $
-          throwError $ SemanticErr _inPos "Cannot parent from root"
-        let result = p `withType` fromJust parent'
-        return result
-      Nothing -> throwError $ SemanticErr _inPos "Cannot parent at the start of a path"
-resolveTPExp' p@PExp{_exp = IClaferId{_sident = "integer"}} = runListT $ runExceptT $ return $ p `withType` TInteger
-resolveTPExp' p@PExp{_exp = IClaferId{_sident = "int"}} = runListT $ runExceptT $ return $ p `withType` TInteger
-resolveTPExp' p@PExp{_exp = IClaferId{_sident = "string"}} = runListT $ runExceptT $ return $ p `withType` TString
-resolveTPExp' p@PExp{_exp = IClaferId{_sident = "double"}} = runListT $ runExceptT $ return $ p `withType` TDouble
-resolveTPExp' p@PExp{_exp = IClaferId{_sident = "real"}} = runListT $ runExceptT $ return $ p `withType` TReal
-resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident="this"}} =
-  runListT $ runExceptT $ do
-    sident' <- _uid <$> curThis
-    result <- (p `withType`) <$> typeOfUid sident'
-    return result
-      <++>
-      addDref result -- Case 2: Dereference the sident 1..* times
-resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident, _isTop}} = do
-  uidIClaferMap' <- asks iUIDIClaferMap
-  runListT $ runExceptT $ do
-    curPath' <- curPath
-    sident' <- if _sident == "this" then _uid <$> curThis else return _sident
-    when (isJust curPath') $ do
-      c <- mapM (isChild uidIClaferMap' sident') $ unionType $ fromJust curPath'
-      let parentId' = str (fromJust curPath')
-      unless (or c || parentId' == "root") $ throwError $ SemanticErr _inPos ("'" ++ sident' ++ "' is not a child of type '" ++ parentId' ++ "'")
-    result <- (p `withType`) <$> typeOfUid sident'
-    if _isTop
-    then return result -- Case 1: Use the sident
-          <++>
-          addDref result -- Case 2: Dereference the sident 1..* times
-          <++>
-          addSome result
-    else return result -- all not top-level identifiers must be in a path
-
-
-resolveTPExp' p@PExp{_inPos, _exp} =
-  runListT $ runExceptT $ (case _exp of
-    e@IFunExp {_op = ".", _exps = [arg1, arg2]} -> do
-        (iType', exp') <-  do
-            arg1' <- lift $ ListT $ resolveTPExp arg1
-            localCurPath (typeOf arg1') $ do
-                arg2' <- liftError $ lift $ ListT $ resolveTPExp arg2
-                (case _iType arg2' of
-                    Just (t'@TClafer{}) -> return (t', e{_exps = [arg1', arg2']})
-                    Just (TMap{_ta=t'}) -> return (t', e{_exps = [arg1', arg2']})
-                    _ -> fail $ "Function '.' cannot be performed on " ++ showType arg1' ++ "\n.\n " ++ showType arg2')
-        let result = p{_iType = Just iType', _exp = exp'}
-        return result -- Case 1: Use the sident
-          <++>
-          addDref result -- Case 2: Dereference the sident 1..* times
-          <++>
-          addSome result
-    _ -> do
-      (iType', exp') <- ExceptT $ ListT $ resolveTExp _exp
-      return p{_iType = Just iType', _exp = exp'})
-  where
-  resolveTExp :: IExp -> TypeAnalysis [Either ClaferSErr (IType, IExp)]
-  resolveTExp e@(IInt _)    = runListT $ runExceptT $ return (TInteger, e)
-  resolveTExp e@(IDouble _) = runListT $ runExceptT $ return (TDouble, e)
-  resolveTExp e@(IReal _) = runListT $ runExceptT $ return (TReal, e)
-  resolveTExp e@(IStr _)    = runListT $ runExceptT $ return (TString, e)
-
-  resolveTExp e@IFunExp {_op, _exps = [arg]} =
-    runListT $ runExceptT $ do
-      arg' <- lift $ ListT $ resolveTPExp arg
-      let t = typeOf arg'
-      let
-          test c =
-            unless c $
-              throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' cannot be performed on " ++ _op ++ " '" ++ showType arg' ++ "'")
-      let result
-            | _op == iNot = test (isTBoolean t) >> return TBoolean
-            | _op == iCSet = return TInteger
-            | _op == iSumSet = test (isTInteger t) >> return TInteger
-            | _op == iProdSet = test (isTInteger t) >> return TInteger
-            | _op `elem` [iMin, iMinimum, iMaximum, iMinimize, iMaximize] = test (numeric t) >> return t
-            | otherwise = assert False $ error $ "Unknown op '" ++ _op ++ "'"
-      result' <- result
-      return (result', e{_exps = [arg']})
-
-  resolveTExp e@IFunExp {_op = "++", _exps = [arg1, arg2]} = do
-      -- arg1s' <- resolveTPExp arg1
-      -- arg2s' <- resolveTPExp arg2
-      -- let union' a b = typeOf a +++ typeOf b
-      -- return [ return (union' arg1' arg2', e{_exps = [arg1', arg2']})
-      --        | (arg1', arg2') <- sortBy (comparing $ length . unionType . uncurry union') $ liftM2 (,) arg1s' arg2s'
-      --        , not (isTBoolean $ typeOf arg1') && not (isTBoolean $ typeOf arg2') ]
-      runListT $ runExceptT $ do
-        arg1' <- lift $ ListT $ resolveTPExp arg1
-        arg2' <- lift $ ListT $ resolveTPExp arg2
-        let t1 = typeOf arg1'
-        let t2 = typeOf arg2'
-        return (t1 +++ t2, e{_exps = [arg1', arg2']})
-
-
-  resolveTExp e@IFunExp {_op, _exps = [arg1, arg2]} = do
-    uidIClaferMap' <- asks iUIDIClaferMap
-    runListT $ runExceptT $ do
-      arg1' <- lift $ ListT $ resolveTPExp arg1
-      arg2' <- lift $ ListT $ resolveTPExp arg2
-      let t1 = typeOf arg1'
-      let t2 = typeOf arg2'
-      let testIntersect e1 e2 =
-            do
-              it <- intersection uidIClaferMap' e1 e2
-              case it of
-                Just it' -> if isTBoolean it'
-                            then throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' cannot be performed on\n" ++ showType arg1' ++ "\n" ++ _op ++ "\n" ++ showType arg2')
-                            else return it'
-                Nothing  -> throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' cannot be performed on\n" ++ showType arg1' ++ "\n" ++ _op ++ "\n" ++ showType arg2')
-      let testNotSame e1 e2 =
-            when (e1 `sameAs` e2) $
-              throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' is redundant because the two subexpressions are always equivalent")
-      let test c =
-            unless c $
-              throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' cannot be performed on\n" ++ showType arg1' ++ "\n" ++ _op ++ "\n" ++ showType arg2')
-      let result
-            | _op `elem` logBinOps = test (isTBoolean t1 && isTBoolean t2) >> return TBoolean
-            | _op `elem` [iLt, iGt, iLte, iGte] = test (numeric t1 && numeric t2) >> return TBoolean
-            | _op `elem` [iEq, iNeq] = testNotSame arg1' arg2' >> testIntersect t1 t2 >> return TBoolean
-            | _op == iDifference = testNotSame arg1' arg2' >> testIntersect t1 t2 >> return t1
-            | _op == iIntersection = testNotSame arg1' arg2' >> testIntersect t1 t2
-            | _op `elem` [iDomain, iRange] = testIntersect t1 t2
-            | _op `elem` relSetBinOps = testIntersect t1 t2 >> return TBoolean
-            | _op `elem` [iSub, iMul, iDiv, iRem] = test (numeric t1 && numeric t2) >> return (coerce t1 t2)
-            | _op == iPlus =
-                (test (isTString t1 && isTString t2) >> return TString) -- Case 1: String concatenation
-                `catchError`
-                const (test (numeric t1 && numeric t2) >> return (coerce t1 t2)) -- Case 2: Addition
-            | otherwise = error $ "ResolverType: Unknown op: " ++ show e
-      result' <- result
-      return (result', e{_exps = [arg1', arg2']})
-
-  resolveTExp e@(IFunExp "ifthenelse" [arg1, arg2, arg3]) = do
-    uidIClaferMap' <- asks iUIDIClaferMap
-    runListT $ runExceptT $ do
-      arg1' <- lift $ ListT $ resolveTPExp arg1
-      arg2' <- lift $ ListT $ resolveTPExp arg2
-      arg3' <- lift $ ListT $ resolveTPExp arg3
-      let t1 = typeOf arg1'
-      let t2 = typeOf arg2'
-      let t3 = typeOf arg3'
-
-      unless (isTBoolean t1) $
-        throwError $ SemanticErr _inPos ("The type of condition in 'if/then/else' must be 'TBoolean', insted it is " ++ showType arg1')
-
-      it <- getIfThenElseType uidIClaferMap' t2 t3
-      t <- case it of
-        Just it' -> return it'
-        Nothing  -> throwError $ SemanticErr _inPos ("Function 'if/then/else' cannot be performed on \nif\n" ++ showType arg1' ++ "\nthen\n" ++ showType arg2' ++ "\nelse\n" ++ showType arg3')
-
-      return (t, e{_exps = [arg1', arg2', arg3']})
-  -- some P, no P, one P
-  -- P must not be TBoolean
-  resolveTExp e@IDeclPExp{_oDecls=[], _bpexp} =
-    runListT $ runExceptT $ do
-      bpexp' <- liftError $ lift $ ListT $ resolveTPExp _bpexp
-      case _iType bpexp' of
-          Nothing -> fail $ "resolveTExp@IDeclPExp: No type computed for body\n" ++ show bpexp'
-          Just t' -> if  isTBoolean t'
-                     then throwError $ SemanticErr _inPos "The type of body of a quantified expression without local declarations must not be 'TBoolean'"
-                     else return $ (TBoolean, e{_bpexp = bpexp'})
-  -- some x : X | P, no x : X | P, one x : X | P
-  -- X must not be TBoolean, P must be TBoolean
-  resolveTExp e@IDeclPExp{_oDecls, _bpexp} =
-    runListT $ runExceptT $ do
-      oDecls' <- mapM resolveTDecl _oDecls
-      let extraDecls = [(decl, typeOf $ _body oDecl) | oDecl <- oDecls', decl <- _decls oDecl]
-      localDecls extraDecls $ do
-        bpexp' <- liftError $ lift $ ListT $ resolveTPExp _bpexp
-        case _iType bpexp' of
-            Nothing -> fail $ "resolveTExp@IDeclPExp: No type computed for body\n" ++ show bpexp'
-            Just t' -> if  isTBoolean t'
-                       then return $ (TBoolean, e{_oDecls = oDecls', _bpexp = bpexp'})
-                       else throwError $ SemanticErr _inPos $ "The type of body of a quantified expression with local declarations must be 'TBoolean', instead it is\n" ++ showType bpexp'
-    where
-    resolveTDecl d@IDecl{_body} =
-      do
-        body' <- lift $ ListT $ resolveTPExp _body
-        case _iType body' of
-            Nothing -> fail $ "resolveTExp@IDeclPExp: No type computed for local declaration\n" ++ show body'
-            Just t' -> if  isTBoolean t'
-                       then throwError $ SemanticErr _inPos "The type of declaration of a quantified expression must not be 'TBoolean'"
-                       else return $ d{_body = body'}
-  resolveTExp e = error $ "Unknown iexp: " ++ show e
-
--- Adds "dref"s at the end, effectively dereferencing Clafers when needed.
-addDref :: PExp -> ExceptT ClaferSErr (ListT TypeAnalysis) PExp
-addDref pexp =
-  do
-    localCurPath (typeOf pexp) $ do
-      deref <- (ExceptT $ ListT $ resolveTPExp' $ newPExp $ IClaferId "" "dref" False Nothing) `catchError` const (lift mzero)
-      let result = (newPExp $ IFunExp "." [pexp, deref]) `withType` typeOf deref
-      return result <++> addDref result
-  where
-  newPExp = PExp Nothing "" $ _inPos pexp
-
--- Adds a quantifier "some" at the beginning, effectively turning an identifier into a TBoolean expression
-addSome :: PExp -> ExceptT ClaferSErr (ListT TypeAnalysis) PExp
-addSome pexp =
-  do
-    localCurPath (typeOf pexp) $ return $ (newPExp $ IDeclPExp ISome [] pexp) `withType` TBoolean
-  where
-  newPExp = PExp Nothing "" $ _inPos pexp
-
-typeOf :: PExp -> IType
-typeOf pexp = fromMaybe (error "No type") $ _iType pexp
-
-withType :: PExp -> IType -> PExp
-withType p t = p{_iType = Just t}
-
-(<++>) :: MonadPlus m => ExceptT e m a -> ExceptT e m a -> ExceptT e m a
-(ExceptT a) <++> (ExceptT b) = ExceptT $ a `mplus` b
-
-liftError :: MonadError e m => ExceptT e m a -> ExceptT e m a
-liftError e =
-  liftCatch catchError e throwError
-  where
-  liftCatch catchError' m h = ExceptT $ runExceptT m `catchError'` (runExceptT . h)
-
-{-
- -
- - Utility functions
- -
- -}
-
-liftList :: Monad m => [a] -> ListT m a
-liftList = ListT . return
-
-comparing :: Ord b => (a -> b) -> a -> a -> Ordering
-comparing f a b = f a `compare` f b
-
-syntaxOf :: PExp -> String
-syntaxOf = printTree . sugarExp
-
--- Returns true iff the left and right expressions are syntactically identical
-sameAs :: PExp -> PExp -> Bool
-sameAs e1 e2 = syntaxOf e1 == syntaxOf e2 -- Not very efficient but hopefully correct
+{-# LANGUAGE NamedFieldPuns, FlexibleInstances, FlexibleContexts, GeneralizedNewtypeDeriving #-}
+{-
+ Copyright (C) 2012-2017 Jimmy Liang, Kacper Bak, Michal Antkiewicz <http://gsd.uwaterloo.ca>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+-}
+module Language.Clafer.Intermediate.ResolverType (resolveTModule)  where
+
+import Language.ClaferT
+import Language.Clafer.Common
+import Language.Clafer.Intermediate.Intclafer hiding (uid)
+import Language.Clafer.Intermediate.Desugarer
+import Language.Clafer.Intermediate.TypeSystem
+import Language.Clafer.Front.PrintClafer
+
+import Control.Applicative
+import Control.Exception (assert)
+import Control.Lens ((&), (%~), traversed)
+import Control.Monad.Except
+import Control.Monad.List
+import Control.Monad.Reader
+import Data.Either
+import Data.List
+import Data.Maybe
+import Prelude hiding (exp)
+
+type TypeDecls = [(String, IType)]
+data TypeInfo = TypeInfo {iTypeDecls::TypeDecls, iUIDIClaferMap::UIDIClaferMap, iCurThis::IClafer, iCurPath::Maybe IType}
+
+newtype TypeAnalysis a = TypeAnalysis (ReaderT TypeInfo (Either ClaferSErr) a)
+  deriving (MonadError ClaferSErr, Monad, Functor, MonadReader TypeInfo, Applicative)
+
+-- return the type of a UID but give preference to local declarations in quantified expressions, which shadow global names
+typeOfUid :: MonadTypeAnalysis m => UID -> m IType
+typeOfUid uid = (fromMaybe (TClafer [uid]) . lookup uid) <$> typeDecls
+
+class (Functor m, Monad m) => MonadTypeAnalysis m where
+  -- What "this" refers to
+  curThis :: m IClafer
+  localCurThis :: IClafer -> m a -> m a
+
+  -- The next path is a child of curPath (or Nothing)
+  curPath :: m (Maybe IType)
+  localCurPath :: IType -> m a -> m a
+
+  -- Extra declarations
+  typeDecls :: m TypeDecls
+  localDecls :: TypeDecls -> m a -> m a
+
+instance MonadTypeAnalysis TypeAnalysis where
+  curThis = TypeAnalysis $ asks iCurThis
+  localCurThis newThis (TypeAnalysis d) =
+    TypeAnalysis $ local setCurThis d
+    where
+    setCurThis t = t{iCurThis = newThis}
+
+  curPath = TypeAnalysis $ asks iCurPath
+  localCurPath newPath (TypeAnalysis d) =
+    TypeAnalysis $ local setCurPath d
+    where
+    setCurPath t = t{iCurPath = Just newPath}
+
+  typeDecls = TypeAnalysis $ asks iTypeDecls
+  localDecls extra (TypeAnalysis d) =
+    TypeAnalysis $ local addTypeDecls d
+    where
+    addTypeDecls t@TypeInfo{iTypeDecls = c} = t{iTypeDecls = extra ++ c}
+
+instance MonadTypeAnalysis m => MonadTypeAnalysis (ListT m) where
+  curThis = lift curThis
+  localCurThis = mapListT . localCurThis
+  curPath = lift curPath
+  localCurPath = mapListT . localCurPath
+  typeDecls = lift typeDecls
+  localDecls = mapListT . localDecls
+
+instance MonadTypeAnalysis m => MonadTypeAnalysis (ExceptT ClaferSErr m) where
+  curThis = lift curThis
+  localCurThis = mapExceptT . localCurThis
+  curPath = lift curPath
+  localCurPath = mapExceptT . localCurPath
+  typeDecls = lift typeDecls
+  localDecls = mapExceptT . localDecls
+
+-- | Type inference and checking
+runTypeAnalysis :: TypeAnalysis a -> IModule -> Either ClaferSErr a
+runTypeAnalysis (TypeAnalysis tc) imodule = runReaderT tc $ TypeInfo [] (createUidIClaferMap imodule) undefined Nothing
+
+claferWithUid :: (Monad m) => UIDIClaferMap -> String -> m IClafer
+claferWithUid uidIClaferMap' u = case findIClafer uidIClaferMap' u of
+  Just c -> return c
+  Nothing -> fail $ "ResolverType.claferWithUid: " ++ u ++ " not found!"
+
+parentOf :: (Monad m) => UIDIClaferMap -> UID -> m UID
+parentOf uidIClaferMap' c = case _parentUID <$> findIClafer uidIClaferMap' c of
+  Just u -> return u
+  Nothing -> fail $ "ResolverType.parentOf: " ++ c ++ " not found!"
+
+{-
+ - C is an direct child of B.
+ -
+ -  abstract A
+ -    C      // C - child
+ -  B : A    // B - parent
+ -}
+isIndirectChild :: (Monad m) => UIDIClaferMap -> UID -> UID -> m Bool
+isIndirectChild uidIClaferMap' child parent = do
+  (_:allSupers) <- hierarchy uidIClaferMap' parent
+  childOfSupers <- mapM ((isChild uidIClaferMap' child)._uid) allSupers
+  return $ or childOfSupers
+
+isChild :: (Monad m) => UIDIClaferMap -> UID -> UID -> m Bool
+isChild uidIClaferMap' child parent =
+    case findIClafer uidIClaferMap' child of
+        Nothing -> return False
+        Just childIClafer -> do
+            let directChild = (parent == _parentUID childIClafer)
+            indirectChild <- isIndirectChild uidIClaferMap' child parent
+            return $ directChild || indirectChild
+
+
+str :: IType -> String
+str t =
+  case unionType t of
+    [t'] -> t'
+    ts   -> "[" ++ intercalate "," ts ++ "]"
+
+showType :: PExp                   -> String
+showType    PExp{ _iType=Nothing }  = "unknown type"
+showType    PExp{ _iType=(Just t) } = show t
+
+data TAMode
+  = TAReferences    -- ^ Phase one: only process references
+  | TAExpressions   -- ^ Phase two: only process constraints and goals
+
+resolveTModule :: (IModule, GEnv) -> Either ClaferSErr IModule
+resolveTModule (imodule, _) =
+  case runTypeAnalysis (analysisReferences $ _mDecls imodule) imodule of
+    Right mDecls' -> case runTypeAnalysis (analysisExpressions $ mDecls') imodule{_mDecls = mDecls'} of
+      Right mDecls'' -> return imodule{_mDecls = mDecls''}
+      Left err      -> throwError err
+    Left err      -> throwError err
+  where
+  analysisReferences = mapM (resolveTElement TAReferences rootIdent)
+  analysisExpressions = mapM (resolveTElement TAExpressions rootIdent)
+
+-- Phase one: only process references
+resolveTElement :: TAMode     -> String -> IElement          -> TypeAnalysis IElement
+resolveTElement    TAReferences  _         (IEClafer iclafer) =
+  do
+    uidIClaferMap' <- asks iUIDIClaferMap
+    reference' <- case _reference iclafer of
+      Nothing -> return Nothing
+      Just originalReference -> do
+        refs' <- resolveTPExp $ _ref originalReference
+        case refs' of
+          []     -> return Nothing
+          [ref'] -> return $ refWithNewType uidIClaferMap' originalReference ref'
+          (ref':_) -> return $ refWithNewType uidIClaferMap' originalReference ref'
+    elements' <- mapM (resolveTElement TAReferences (_uid iclafer)) (_elements iclafer)
+    return $ IEClafer iclafer{_elements = elements', _reference=reference'}
+  where
+    refWithNewType uMap oRef r = let
+        r' = r & iType.traversed %~ (addHierarchy uMap)
+      in case _iType r' of
+        Nothing -> Nothing
+        Just t -> if isTBoolean t
+                  then Nothing
+                  else Just $ oRef{_ref=r'}
+resolveTElement    TAReferences  _         iec@IEConstraint{} = return iec
+resolveTElement    TAReferences  _         ieg@IEGoal{} = return ieg
+
+-- Phase two: only process constraints and goals
+resolveTElement    TAExpressions  _         (IEClafer iclafer) =
+  do
+    elements' <- mapM (resolveTElement TAExpressions (_uid iclafer)) (_elements iclafer)
+    return $ IEClafer iclafer{_elements = elements'}
+resolveTElement    TAExpressions parent'   (IEConstraint _isHard _pexp) =
+  IEConstraint _isHard <$> (testBoolean =<< resolveTConstraint parent' _pexp)
+  where
+  testBoolean pexp' =
+    do
+      unless (isTBoolean $ typeOf pexp') $
+        throwError $ SemanticErr (_inPos pexp') ("A constraint requires an expression of type 'TBoolean' but got '" ++ showType pexp' ++ "'")
+      return pexp'
+resolveTElement    TAExpressions parent' (IEGoal isMaximize' pexp') =
+  IEGoal isMaximize' <$> resolveTConstraint parent' pexp'
+
+resolveTConstraint :: String -> PExp -> TypeAnalysis PExp
+resolveTConstraint curThis' constraint =
+  do
+    uidIClaferMap' <- asks iUIDIClaferMap
+    curThis'' <- claferWithUid uidIClaferMap' curThis'
+    head <$> localCurThis curThis'' (resolveTPExp constraint :: TypeAnalysis [PExp])
+
+
+resolveTPExp :: PExp -> TypeAnalysis [PExp]
+resolveTPExp p =
+  do
+    x <- resolveTPExp' p
+    case partitionEithers x of
+      (f:_, []) -> throwError f                       -- Case 1: Only fails. Complain about the first one.
+      ([], [])  -> throwError $ SemanticErr (_inPos p) ("No results but no errors for " ++ show p) -- Case 2: No success and no error message. Bug.
+      (_,   xs) -> return xs                          -- Case 3: At least one success.
+
+resolveTPExp' :: PExp -> TypeAnalysis [Either ClaferSErr PExp]
+resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident = "dref"}} = do
+  uidIClaferMap' <- asks iUIDIClaferMap
+  runListT $ runExceptT $ do
+    curPath' <- curPath
+    case curPath' of
+      Just curPath'' -> do
+        case concatMap (getTMaps uidIClaferMap') $ getTClafers uidIClaferMap' curPath'' of
+          [t'] -> return $ p `withType` t'
+          (t':_) -> return $ p `withType` t'
+          [] -> throwError $ SemanticErr _inPos ("Cannot deref from type '" ++ str curPath'' ++ "'")
+      Nothing -> throwError $ SemanticErr _inPos ("Cannot deref at the start of a path")
+resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident = "parent"}} = do
+  uidIClaferMap' <- asks iUIDIClaferMap
+  runListT $ runExceptT $ do
+    curPath' <- curPath
+    case curPath' of
+      Just curPath'' -> do
+        parent' <- fromUnionType <$> runListT (parentOf uidIClaferMap' =<< liftList (unionType curPath''))
+        when (isNothing parent') $
+          throwError $ SemanticErr _inPos "Cannot parent from root"
+        let result = p `withType` fromJust parent'
+        return result
+      Nothing -> throwError $ SemanticErr _inPos "Cannot parent at the start of a path"
+resolveTPExp' p@PExp{_exp = IClaferId{_sident = "integer"}} = runListT $ runExceptT $ return $ p `withType` TInteger
+resolveTPExp' p@PExp{_exp = IClaferId{_sident = "int"}} = runListT $ runExceptT $ return $ p `withType` TInteger
+resolveTPExp' p@PExp{_exp = IClaferId{_sident = "string"}} = runListT $ runExceptT $ return $ p `withType` TString
+resolveTPExp' p@PExp{_exp = IClaferId{_sident = "double"}} = runListT $ runExceptT $ return $ p `withType` TDouble
+resolveTPExp' p@PExp{_exp = IClaferId{_sident = "real"}} = runListT $ runExceptT $ return $ p `withType` TReal
+resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident="this"}} =
+  runListT $ runExceptT $ do
+    sident' <- _uid <$> curThis
+    result <- (p `withType`) <$> typeOfUid sident'
+    return result
+      <++>
+      addDref result -- Case 2: Dereference the sident 1..* times
+resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident, _isTop}} = do
+  uidIClaferMap' <- asks iUIDIClaferMap
+  runListT $ runExceptT $ do
+    curPath' <- curPath
+    sident' <- if _sident == "this" then _uid <$> curThis else return _sident
+    when (isJust curPath') $ do
+      c <- mapM (isChild uidIClaferMap' sident') $ unionType $ fromJust curPath'
+      let parentId' = str (fromJust curPath')
+      unless (or c || parentId' == "root") $ throwError $ SemanticErr _inPos ("'" ++ sident' ++ "' is not a child of type '" ++ parentId' ++ "'")
+    result <- (p `withType`) <$> typeOfUid sident'
+    if _isTop
+    then return result -- Case 1: Use the sident
+          <++>
+          addDref result -- Case 2: Dereference the sident 1..* times
+          <++>
+          addSome result
+    else return result -- all not top-level identifiers must be in a path
+
+
+resolveTPExp' p@PExp{_inPos, _exp} =
+  runListT $ runExceptT $ (case _exp of
+    e@IFunExp {_op = ".", _exps = [arg1, arg2]} -> do
+        (iType', exp') <-  do
+            arg1' <- lift $ ListT $ resolveTPExp arg1
+            localCurPath (typeOf arg1') $ do
+                arg2' <- liftError $ lift $ ListT $ resolveTPExp arg2
+                (case _iType arg2' of
+                    Just (t'@TClafer{}) -> return (t', e{_exps = [arg1', arg2']})
+                    Just (TMap{_ta=t'}) -> return (t', e{_exps = [arg1', arg2']})
+                    _ -> fail $ "Function '.' cannot be performed on " ++ showType arg1' ++ "\n.\n " ++ showType arg2')
+        let result = p{_iType = Just iType', _exp = exp'}
+        return result -- Case 1: Use the sident
+          <++>
+          addDref result -- Case 2: Dereference the sident 1..* times
+          <++>
+          addSome result
+    _ -> do
+      (iType', exp') <- ExceptT $ ListT $ resolveTExp _exp
+      return p{_iType = Just iType', _exp = exp'})
+  where
+  resolveTExp :: IExp -> TypeAnalysis [Either ClaferSErr (IType, IExp)]
+  resolveTExp e@(IInt _)    = runListT $ runExceptT $ return (TInteger, e)
+  resolveTExp e@(IDouble _) = runListT $ runExceptT $ return (TDouble, e)
+  resolveTExp e@(IReal _) = runListT $ runExceptT $ return (TReal, e)
+  resolveTExp e@(IStr _)    = runListT $ runExceptT $ return (TString, e)
+
+  resolveTExp e@IFunExp {_op, _exps = [arg]} =
+    runListT $ runExceptT $ do
+      arg' <- lift $ ListT $ resolveTPExp arg
+      let t = typeOf arg'
+      let
+          test c =
+            unless c $
+              throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' cannot be performed on " ++ _op ++ " '" ++ showType arg' ++ "'")
+      let result
+            | _op == iNot = test (isTBoolean t) >> return TBoolean
+            | _op == iCSet = return TInteger
+            | _op == iSumSet = test (isTInteger t) >> return TInteger
+            | _op == iProdSet = test (isTInteger t) >> return TInteger
+            | _op `elem` [iMin, iMinimum, iMaximum, iMinimize, iMaximize] = test (numeric t) >> return t
+            | otherwise = assert False $ error $ "Unknown op '" ++ _op ++ "'"
+      result' <- result
+      return (result', e{_exps = [arg']})
+
+  resolveTExp e@IFunExp {_op = "++", _exps = [arg1, arg2]} = do
+      -- arg1s' <- resolveTPExp arg1
+      -- arg2s' <- resolveTPExp arg2
+      -- let union' a b = typeOf a +++ typeOf b
+      -- return [ return (union' arg1' arg2', e{_exps = [arg1', arg2']})
+      --        | (arg1', arg2') <- sortBy (comparing $ length . unionType . uncurry union') $ liftM2 (,) arg1s' arg2s'
+      --        , not (isTBoolean $ typeOf arg1') && not (isTBoolean $ typeOf arg2') ]
+      runListT $ runExceptT $ do
+        arg1' <- lift $ ListT $ resolveTPExp arg1
+        arg2' <- lift $ ListT $ resolveTPExp arg2
+        let t1 = typeOf arg1'
+        let t2 = typeOf arg2'
+        return (t1 +++ t2, e{_exps = [arg1', arg2']})
+
+
+  resolveTExp e@IFunExp {_op, _exps = [arg1, arg2]} = do
+    uidIClaferMap' <- asks iUIDIClaferMap
+    runListT $ runExceptT $ do
+      arg1' <- lift $ ListT $ resolveTPExp arg1
+      arg2' <- lift $ ListT $ resolveTPExp arg2
+      let t1 = typeOf arg1'
+      let t2 = typeOf arg2'
+      let testIntersect e1 e2 =
+            do
+              it <- intersection uidIClaferMap' e1 e2
+              case it of
+                Just it' -> if isTBoolean it'
+                            then throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' cannot be performed on\n" ++ showType arg1' ++ "\n" ++ _op ++ "\n" ++ showType arg2')
+                            else return it'
+                Nothing  -> throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' cannot be performed on\n" ++ showType arg1' ++ "\n" ++ _op ++ "\n" ++ showType arg2')
+      let testNotSame e1 e2 =
+            when (e1 `sameAs` e2) $
+              throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' is redundant because the two subexpressions are always equivalent")
+      let test c =
+            unless c $
+              throwError $ SemanticErr _inPos ("Function '" ++ _op ++ "' cannot be performed on\n" ++ showType arg1' ++ "\n" ++ _op ++ "\n" ++ showType arg2')
+      let result
+            | _op `elem` logBinOps = test (isTBoolean t1 && isTBoolean t2) >> return TBoolean
+            | _op `elem` [iLt, iGt, iLte, iGte] = test (numeric t1 && numeric t2) >> return TBoolean
+            | _op `elem` [iEq, iNeq] = testNotSame arg1' arg2' >> testIntersect t1 t2 >> return TBoolean
+            | _op == iDifference = testNotSame arg1' arg2' >> testIntersect t1 t2 >> return t1
+            | _op == iIntersection = testNotSame arg1' arg2' >> testIntersect t1 t2
+            | _op `elem` [iDomain, iRange] = testIntersect t1 t2
+            | _op `elem` relSetBinOps = testIntersect t1 t2 >> return TBoolean
+            | _op `elem` [iSub, iMul, iDiv, iRem] = test (numeric t1 && numeric t2) >> return (coerce t1 t2)
+            | _op == iPlus =
+                (test (isTString t1 && isTString t2) >> return TString) -- Case 1: String concatenation
+                `catchError`
+                const (test (numeric t1 && numeric t2) >> return (coerce t1 t2)) -- Case 2: Addition
+            | otherwise = error $ "ResolverType: Unknown op: " ++ show e
+      result' <- result
+      return (result', e{_exps = [arg1', arg2']})
+
+  resolveTExp e@(IFunExp "ifthenelse" [arg1, arg2, arg3]) = do
+    uidIClaferMap' <- asks iUIDIClaferMap
+    runListT $ runExceptT $ do
+      arg1' <- lift $ ListT $ resolveTPExp arg1
+      arg2' <- lift $ ListT $ resolveTPExp arg2
+      arg3' <- lift $ ListT $ resolveTPExp arg3
+      let t1 = typeOf arg1'
+      let t2 = typeOf arg2'
+      let t3 = typeOf arg3'
+
+      unless (isTBoolean t1) $
+        throwError $ SemanticErr _inPos ("The type of condition in 'if/then/else' must be 'TBoolean', insted it is " ++ showType arg1')
+
+      it <- getIfThenElseType uidIClaferMap' t2 t3
+      t <- case it of
+        Just it' -> return it'
+        Nothing  -> throwError $ SemanticErr _inPos ("Function 'if/then/else' cannot be performed on \nif\n" ++ showType arg1' ++ "\nthen\n" ++ showType arg2' ++ "\nelse\n" ++ showType arg3')
+
+      return (t, e{_exps = [arg1', arg2', arg3']})
+  -- some P, no P, one P
+  -- P must not be TBoolean
+  resolveTExp e@IDeclPExp{_oDecls=[], _bpexp} =
+    runListT $ runExceptT $ do
+      bpexp' <- liftError $ lift $ ListT $ resolveTPExp _bpexp
+      case _iType bpexp' of
+          Nothing -> fail $ "resolveTExp@IDeclPExp: No type computed for body\n" ++ show bpexp'
+          Just t' -> if  isTBoolean t'
+                     then throwError $ SemanticErr _inPos "The type of body of a quantified expression without local declarations must not be 'TBoolean'"
+                     else return $ (TBoolean, e{_bpexp = bpexp'})
+  -- some x : X | P, no x : X | P, one x : X | P
+  -- X must not be TBoolean, P must be TBoolean
+  resolveTExp e@IDeclPExp{_oDecls, _bpexp} =
+    runListT $ runExceptT $ do
+      oDecls' <- mapM resolveTDecl _oDecls
+      let extraDecls = [(decl, typeOf $ _body oDecl) | oDecl <- oDecls', decl <- _decls oDecl]
+      localDecls extraDecls $ do
+        bpexp' <- liftError $ lift $ ListT $ resolveTPExp _bpexp
+        case _iType bpexp' of
+            Nothing -> fail $ "resolveTExp@IDeclPExp: No type computed for body\n" ++ show bpexp'
+            Just t' -> if  isTBoolean t'
+                       then return $ (TBoolean, e{_oDecls = oDecls', _bpexp = bpexp'})
+                       else throwError $ SemanticErr _inPos $ "The type of body of a quantified expression with local declarations must be 'TBoolean', instead it is\n" ++ showType bpexp'
+    where
+    resolveTDecl d@IDecl{_body} =
+      do
+        body' <- lift $ ListT $ resolveTPExp _body
+        case _iType body' of
+            Nothing -> fail $ "resolveTExp@IDeclPExp: No type computed for local declaration\n" ++ show body'
+            Just t' -> if  isTBoolean t'
+                       then throwError $ SemanticErr _inPos "The type of declaration of a quantified expression must not be 'TBoolean'"
+                       else return $ d{_body = body'}
+  resolveTExp e = error $ "Unknown iexp: " ++ show e
+
+-- Adds "dref"s at the end, effectively dereferencing Clafers when needed.
+addDref :: PExp -> ExceptT ClaferSErr (ListT TypeAnalysis) PExp
+addDref pexp =
+  do
+    localCurPath (typeOf pexp) $ do
+      deref <- (ExceptT $ ListT $ resolveTPExp' $ newPExp $ IClaferId "" "dref" False Nothing) `catchError` const (lift mzero)
+      let result = (newPExp $ IFunExp "." [pexp, deref]) `withType` typeOf deref
+      return result <++> addDref result
+  where
+  newPExp = PExp Nothing "" $ _inPos pexp
+
+-- Adds a quantifier "some" at the beginning, effectively turning an identifier into a TBoolean expression
+addSome :: PExp -> ExceptT ClaferSErr (ListT TypeAnalysis) PExp
+addSome pexp =
+  do
+    localCurPath (typeOf pexp) $ return $ (newPExp $ IDeclPExp ISome [] pexp) `withType` TBoolean
+  where
+  newPExp = PExp Nothing "" $ _inPos pexp
+
+typeOf :: PExp -> IType
+typeOf pexp = fromMaybe (error "No type") $ _iType pexp
+
+withType :: PExp -> IType -> PExp
+withType p t = p{_iType = Just t}
+
+(<++>) :: MonadPlus m => ExceptT e m a -> ExceptT e m a -> ExceptT e m a
+(ExceptT a) <++> (ExceptT b) = ExceptT $ a `mplus` b
+
+liftError :: MonadError e m => ExceptT e m a -> ExceptT e m a
+liftError e =
+  liftCatch catchError e throwError
+  where
+  liftCatch catchError' m h = ExceptT $ runExceptT m `catchError'` (runExceptT . h)
+
+{-
+ -
+ - Utility functions
+ -
+ -}
+
+liftList :: Monad m => [a] -> ListT m a
+liftList = ListT . return
+
+comparing :: Ord b => (a -> b) -> a -> a -> Ordering
+comparing f a b = f a `compare` f b
+
+syntaxOf :: PExp -> String
+syntaxOf = printTree . sugarExp
+
+-- Returns true iff the left and right expressions are syntactically identical
+sameAs :: PExp -> PExp -> Bool
+sameAs e1 e2 = syntaxOf e1 == syntaxOf e2 -- Not very efficient but hopefully correct
diff --git a/src/Language/Clafer/Intermediate/ScopeAnalysis.hs b/src/Language/Clafer/Intermediate/ScopeAnalysis.hs
--- a/src/Language/Clafer/Intermediate/ScopeAnalysis.hs
+++ b/src/Language/Clafer/Intermediate/ScopeAnalysis.hs
@@ -1,5 +1,5 @@
 {-
- Copyright (C) 2013 Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2013-2017 Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs b/src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs
--- a/src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs
+++ b/src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs
@@ -1,5 +1,5 @@
 {-
- Copyright (C) 2012-2015 Jimmy Liang, Kacper Bak, Michał Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Jimmy Liang, Kacper Bak, Michał Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Intermediate/StringAnalyzer.hs b/src/Language/Clafer/Intermediate/StringAnalyzer.hs
--- a/src/Language/Clafer/Intermediate/StringAnalyzer.hs
+++ b/src/Language/Clafer/Intermediate/StringAnalyzer.hs
@@ -1,78 +1,78 @@
-{-# LANGUAGE RankNTypes, KindSignatures ,FlexibleContexts #-}
-{-
- Copyright (C) 2012-2015 Kacper Bak, Jimmy Liang, Luke Brown <http://gsd.uwaterloo.ca>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
--}
-module Language.Clafer.Intermediate.StringAnalyzer where
-
-import Control.Applicative
-import Control.Monad.State
-import Data.Tuple
-import qualified Data.Map as Map
-import Prelude
-
-import Language.Clafer.Intermediate.Intclafer
-
--- | Convert all strings into ints for analysis
--- | Return an inverse map from ints back to strings
-astrModule :: IModule -> (IModule, Map.Map Int String)
-astrModule imodule = (imodule{_mDecls = decls''}, flipMap strMap')
-  where
-    decls' = _mDecls imodule
-    (decls'', strMap') = runState (mapM astrElement decls') Map.empty
-
-    flipMap :: Map.Map String Int -> Map.Map Int String
-    flipMap = Map.fromList . map swap . Map.toList
-
-
-astrClafer :: MonadState (Map.Map String Int) m => IClafer -> m IClafer
-astrClafer (IClafer s isAbstract' gcrd' ident' uid' puid' super' reference' crd' gCard elements') = do
-    reference'' <- astrReference reference'
-    elements'' <- astrElement `mapM` elements'
-    return $ IClafer s isAbstract' gcrd' ident' uid' puid' super' reference'' crd' gCard elements''
-
-astrReference :: MonadState (Map.Map String Int) m => Maybe IReference -> m (Maybe IReference)
-astrReference Nothing = return Nothing
-astrReference (Just (IReference isSet' ref')) = Just <$> IReference isSet' `liftM` astrPExp ref'
-
--- astrs single subclafer
-astrElement :: MonadState (Map.Map String Int) m => IElement -> m IElement
-astrElement x = case x of
-  IEClafer clafer -> IEClafer `liftM` astrClafer clafer
-  IEConstraint isHard' pexp -> IEConstraint isHard' `liftM` astrPExp pexp
-  IEGoal isMaximize' pexp -> IEGoal isMaximize' `liftM` astrPExp pexp
-
-astrPExp :: MonadState (Map.Map String Int) m => PExp -> m PExp
-astrPExp (PExp (Just TString) pid' pos' exp') =
-    PExp (Just TInteger) pid' pos' `liftM` astrIExp exp'
-astrPExp (PExp t pid' pos' (IFunExp op' exps')) = PExp t pid' pos' `liftM`
-                              (IFunExp op' `liftM` mapM astrPExp exps')
-astrPExp (PExp t pid' pos' (IDeclPExp quant' oDecls' bpexp')) =
-    PExp t pid' pos' `liftM` (IDeclPExp quant' oDecls' `liftM` astrPExp bpexp')
-astrPExp x = return x
-
-astrIExp :: MonadState (Map.Map String Int) m => IExp -> m IExp
-astrIExp x = case x of
-  IFunExp op' exps' -> IFunExp op' `liftM` mapM astrPExp exps'
-  IStr str -> do
-    modify (\e -> Map.insertWith (flip const) str (Map.size e) e)
-    st <- get
-    return (IInt $ toInteger $ (Map.!) st str)
-  _ -> return x
+{-# LANGUAGE RankNTypes, KindSignatures ,FlexibleContexts #-}
+{-
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang, Luke Brown <http://gsd.uwaterloo.ca>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+-}
+module Language.Clafer.Intermediate.StringAnalyzer where
+
+import Control.Applicative
+import Control.Monad.State
+import Data.Tuple
+import qualified Data.Map as Map
+import Prelude
+
+import Language.Clafer.Intermediate.Intclafer
+
+-- | Convert all strings into ints for analysis
+-- | Return an inverse map from ints back to strings
+astrModule :: IModule -> (IModule, Map.Map Int String)
+astrModule imodule = (imodule{_mDecls = decls''}, flipMap strMap')
+  where
+    decls' = _mDecls imodule
+    (decls'', strMap') = runState (mapM astrElement decls') Map.empty
+
+    flipMap :: Map.Map String Int -> Map.Map Int String
+    flipMap = Map.fromList . map swap . Map.toList
+
+
+astrClafer :: MonadState (Map.Map String Int) m => IClafer -> m IClafer
+astrClafer (IClafer s isAbstract' gcrd' ident' uid' puid' super' reference' crd' gCard elements') = do
+    reference'' <- astrReference reference'
+    elements'' <- astrElement `mapM` elements'
+    return $ IClafer s isAbstract' gcrd' ident' uid' puid' super' reference'' crd' gCard elements''
+
+astrReference :: MonadState (Map.Map String Int) m => Maybe IReference -> m (Maybe IReference)
+astrReference Nothing = return Nothing
+astrReference (Just (IReference isSet' ref')) = Just <$> IReference isSet' `liftM` astrPExp ref'
+
+-- astrs single subclafer
+astrElement :: MonadState (Map.Map String Int) m => IElement -> m IElement
+astrElement x = case x of
+  IEClafer clafer -> IEClafer `liftM` astrClafer clafer
+  IEConstraint isHard' pexp -> IEConstraint isHard' `liftM` astrPExp pexp
+  IEGoal isMaximize' pexp -> IEGoal isMaximize' `liftM` astrPExp pexp
+
+astrPExp :: MonadState (Map.Map String Int) m => PExp -> m PExp
+astrPExp (PExp (Just TString) pid' pos' exp') =
+    PExp (Just TInteger) pid' pos' `liftM` astrIExp exp'
+astrPExp (PExp t pid' pos' (IFunExp op' exps')) = PExp t pid' pos' `liftM`
+                              (IFunExp op' `liftM` mapM astrPExp exps')
+astrPExp (PExp t pid' pos' (IDeclPExp quant' oDecls' bpexp')) =
+    PExp t pid' pos' `liftM` (IDeclPExp quant' oDecls' `liftM` astrPExp bpexp')
+astrPExp x = return x
+
+astrIExp :: MonadState (Map.Map String Int) m => IExp -> m IExp
+astrIExp x = case x of
+  IFunExp op' exps' -> IFunExp op' `liftM` mapM astrPExp exps'
+  IStr str -> do
+    modify (\e -> Map.insertWith (flip const) str (Map.size e) e)
+    st <- get
+    return (IInt $ toInteger $ (Map.!) st str)
+  _ -> return x
diff --git a/src/Language/Clafer/Intermediate/Tracing.hs b/src/Language/Clafer/Intermediate/Tracing.hs
--- a/src/Language/Clafer/Intermediate/Tracing.hs
+++ b/src/Language/Clafer/Intermediate/Tracing.hs
@@ -1,5 +1,5 @@
 {-
- Copyright (C) 2012 Kacper Bak <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/src/Language/Clafer/Intermediate/Transformer.hs b/src/Language/Clafer/Intermediate/Transformer.hs
--- a/src/Language/Clafer/Intermediate/Transformer.hs
+++ b/src/Language/Clafer/Intermediate/Transformer.hs
@@ -1,5 +1,5 @@
 {-
- Copyright (C) 2012 Kacper Bak <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
@@ -50,5 +50,3 @@
     cond = op' == iIfThenElse &&
            iType' `elem` [TBoolean, TClafer []]
 transIExp _      iexp' = iexp'
-
-
diff --git a/src/Language/Clafer/Intermediate/TypeSystem.hs b/src/Language/Clafer/Intermediate/TypeSystem.hs
--- a/src/Language/Clafer/Intermediate/TypeSystem.hs
+++ b/src/Language/Clafer/Intermediate/TypeSystem.hs
@@ -1,563 +1,563 @@
-{-# LANGUAGE NamedFieldPuns #-}
-{-
- Copyright (C) 2015 Michal Antkiewicz <http://gsd.uwaterloo.ca>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
--}
-module Language.Clafer.Intermediate.TypeSystem where
-
-import Language.Clafer.Common
-import Language.Clafer.Intermediate.Intclafer hiding (uid)
-
-import Control.Applicative
-import Control.Lens ((&), (<&>), (%~))
-import Control.Monad (mplus, liftM)
-import Data.List (nub)
-import Data.Maybe
-import Prelude hiding (exp)
-
-{- | Example Clafer model used in the various test cases.
-
-abstract Person
-    DOB -> integer
-
-abstract Student : Person
-    StudentID -> string
-
-abstract Employee : Person
-    EmplID -> integer
-
-Alice : Student
-    [ this.DOB.dref = 1990 ]
-    [ this.StudentID.dref = "123Alice" ]
-
-Bob : Employee
-    [ this.EmplID.dref = 345 ]
-
-AliceAndBob -> Person
-[ root.AliceAndBob.dref = Alice, Bob ]
-
-AliceAndBob2 -> Alice ++ Bob
--}
-
-{- $setup
->>> :m + Control.Monad.List
-
-TClafer
->>> let tClaferPerson = TClafer [ "Person" ]
->>> let tClaferDOB = TClafer [ "DOB" ]
->>> let tClaferStudent = TClafer [ "Student", "Person" ]
->>> let tClaferStudentID = TClafer [ "StudentID" ]
->>> let tClaferEmployee = TClafer [ "Employee", "Person" ]
->>> let tClaferEmplID = TClafer [ "EmplID" ]
->>> let tClaferAlice = TClafer [ "Alice", "Student", "Person" ]
->>> let tClaferBob = TClafer [ "Bob", "Employee", "Person" ]
->>> let tClaferAliceAndBob = TClafer [ "AliceAndBob" ]
->>> let tClaferAliceAndBob2 = TClafer [ "AliceAndBob2" ]
-
-TUnion
->>> let tUnionAliceBob = TUnion [ tClaferAlice, tClaferBob ]
-
-TMap
->>> let tMapDOB = TMap tClaferPerson tClaferDOB
->>> let tDrefMapDOB = TMap tClaferDOB TInteger
->>> let tMapStudentID = TMap tClaferStudent tClaferStudentID
->>> let tDrefMapStudentID = TMap tClaferStudentID TString
->>> let tMapEmplID = TMap tClaferEmplID tClaferEmplID
->>> let tDrefMapEmplID = TMap tClaferEmplID TInteger
->>> let tDrefMapAliceAndBob = TMap tClaferAliceAndBob tClaferPerson
->>> let tDrefMapAliceAndBob2 = TMap tClaferAliceAndBob tUnionAliceBob
-
-constants
->>> let t1990 = TInteger
->>> let t123Alice = TString
->>> let t345 = TInteger
--}
-
--- | Sing
-rootTClafer :: IType
-rootTClafer = TClafer ["root"]
-
--- | Obj
-claferTClafer :: IType
-claferTClafer = TClafer ["clafer"]
-
-numeric :: IType     -> Bool
-numeric TInteger     = True
-numeric TReal        = True
-numeric TDouble      = True
-numeric (TMap _ ta') = numeric ta'
-numeric (TUnion un') = any numeric un'
-numeric _            = False
-
-isTInteger :: IType    -> Bool
-isTInteger TInteger     = True
-isTInteger (TMap _ ta') = isTInteger ta'
-isTInteger (TUnion un') = any isTInteger un'
-isTInteger _            = False
-
-isTString :: IType    -> Bool
-isTString TString      = True
-isTString (TMap _ ta') = isTString ta'
-isTString (TUnion un') = any isTString un'
-isTString _            = False
-
-isTBoolean :: IType    -> Bool
-isTBoolean TBoolean      = True
-isTBoolean (TMap _ ta') = isTBoolean ta'
-isTBoolean (TUnion un') = any isTBoolean un'
-isTBoolean _            = False
-
--- | Get TClafer for a given Clafer
--- can only be called after inheritance resolver
-getTClafer :: IClafer -> IType
-getTClafer    iClafer' = case _uid iClafer' of
-  "root"   -> rootTClafer
-  "clafer" -> claferTClafer
-  _        -> case _super iClafer' of
-    Nothing     -> TClafer [ _uid iClafer']
-    Just super' -> fromJust (_iType super') & hi %~ (:) (_uid iClafer')
-
--- | Get TClafer for a given Clafer by its UID
--- can only be called after inheritance resolver
-getTClaferByUID :: UIDIClaferMap -> UID -> Maybe IType
-getTClaferByUID    uidIClaferMap'   uid' = case uid' of
-  "root"   -> Just rootTClafer
-  "clafer" -> Just claferTClafer
-  _        -> findIClafer uidIClaferMap' uid' <&> getTClafer
-
--- | Get TClafer for a given Clafer by its UID
--- can only be called after inheritance resolver
-getTClaferFromIExp :: UIDIClaferMap -> IExp -> Maybe IType
-getTClaferFromIExp    uidIClaferMap'   (IClaferId _ uid' _ _) = getTClaferByUID uidIClaferMap' uid'
-getTClaferFromIExp    _                (IInt _)               = Just TInteger
-getTClaferFromIExp    _                (IReal _)              = Just TReal
-getTClaferFromIExp    _                (IDouble _)            = Just TDouble
-getTClaferFromIExp    _                (IStr _)               = Just TString
-getTClaferFromIExp    _                _                      = Nothing
-
--- | Get TMap for a given reference Clafer. Nothing for non-reference clafers.
--- can only be called after inheritance resolver
-getDrefTMap :: IClafer -> Maybe IType
-getDrefTMap    iClafer' = case _uid iClafer' of
-  "root"   -> Nothing
-  "clafer" -> Nothing
-  _        -> TMap <$> (Just $ getTClafer iClafer') <*> (iClafer' & _reference <&> _ref >>= _iType)
-
--- | Get TMap for a given Clafer by its UID. Nothing for non-reference clafers.
--- can only be called after inheritance resolver
-getDrefTMapByUID :: UIDIClaferMap -> UID -> Maybe IType
-getDrefTMapByUID    uidIClaferMap'   uid' = case uid' of
-  "root"   -> Nothing
-  "clafer" -> Nothing
-  _        -> findIClafer uidIClaferMap' uid' >>= getDrefTMap
-
-
-hierarchy :: (Monad m) => UIDIClaferMap -> UID -> m [IClafer]
-hierarchy uidIClaferMap' uid' = case findIClafer uidIClaferMap' uid' of
-      Nothing -> fail $ "TypeSystem.hierarchy: clafer " ++ uid' ++ "not found!"
-      Just clafer -> return $ findHierarchy getSuper uidIClaferMap' clafer
-
-hierarchyMap :: (Monad m) => UIDIClaferMap -> (IClafer -> a) -> UID -> m [a]
-hierarchyMap uidIClaferMap' f c = case findIClafer uidIClaferMap' c of
-      Nothing -> fail $ "TypeSystem.hierarchyMap: clafer " ++ c ++ "not found!"
-      Just clafer -> return $ mapHierarchy f getSuper uidIClaferMap' clafer
-
-
-{- ---------------------------------------
- - Sums, Intersections, and Compositions -
- --------------------------------------- -}
-
-unionType :: IType -> [String]
-unionType TString  = [stringType]
-unionType TReal    = [realType]
-unionType TDouble  = [doubleType]
-unionType TInteger = [integerType]
-unionType TBoolean = [booleanType]
-unionType (TClafer u) = u
-unionType (TUnion types) = concatMap unionType types
-unionType (TMap _ ta') = unionType ta'
-
-fromUnionType :: [String] -> Maybe IType
-fromUnionType u =
-    case nub u of
-        ["string"]  -> Just TString
-        ["integer"] -> Just TInteger
-        ["int"]     -> Just TInteger
-        ["double"]  -> Just TDouble
-        ["real"]    -> Just TReal
-        ["root"]    -> Just rootTClafer
-        ["clafer"]  -> Just claferTClafer
-        []          -> Nothing
-        u'          -> Just $ TClafer u'
-
-{- | Union the two given types
->>> TString +++ TString
-TString
-
-Unions with only one type should be collapsed.
->>> TUnion [TString] +++ TString
-TString
-
->>> TString +++ TInteger
-TUnion {_un = [TString,TInteger]}
-
->>> TString +++ TUnion [TInteger]
-TUnion {_un = [TString,TInteger]}
-
->>> TUnion [TString] +++ TInteger
-TUnion {_un = [TString,TInteger]}
-
->>> TUnion [TString] +++ TUnion[TInteger]
-TUnion {_un = [TString,TInteger]}
-
->>> TUnion [TString] +++ TUnion[TInteger] +++ TInteger +++ TString
-TUnion {_un = [TString,TInteger]}
-
-Should return TUnion {_un = [TClafer {_hi = ["Alice","Student","Person"]},TClafer {_hi = ["Bob","Employee","Person"]}]}
->>> tClaferAlice +++ tClaferBob
-TClafer {_hi = ["Alice","Student","Person","Bob","Employee"]}
-
->>> tClaferAlice +++ tClaferAlice
-TClafer {_hi = ["Alice","Student","Person"]}
-
->>> (TClafer {_hi = ["A", "X"]} +++ TClafer {_hi = ["B", "X"]}) +++ TClafer {_hi = ["C", "X"]}
-TClafer {_hi = ["A","X","B","C"]}
-
->>> TClafer {_hi = ["A", "X"]} +++ (TClafer {_hi = ["B", "X"]} +++ TClafer {_hi = ["C", "X"]})
-TClafer {_hi = ["A","X","B","C"]}
--}
-(+++) :: IType -> IType -> IType
-TBoolean        +++ TBoolean        = TBoolean
-TString         +++ TString         = TString
-TReal           +++ TReal           = TReal
-TDouble         +++ TDouble         = TDouble
-TInteger        +++ TInteger        = TInteger
-t1@(TClafer u1) +++ t2@(TClafer u2) = if t1 == t2
-                                      then t1
-                                      else TClafer $ nub $ u1 ++ u2  -- should be TUnion [t1,t2]
-(TMap so1 ta1)  +++ (TMap so2 ta2)  = TMap (so1 +++ so2) (ta1 +++ ta2)
-(TUnion un1)    +++ (TUnion un2)    = collapseUnion (TUnion $ nub $ un1 ++ un2)
-(TUnion un1)    +++ t2              = collapseUnion (TUnion $ nub $ un1 ++ [t2])
-t1              +++ (TUnion un2)    = collapseUnion (TUnion $ nub $ t1:un2)
-t1              +++ t2              = if t1 == t2
-                                      then t1
-                                      else TUnion [t1, t2]
-
-collapseUnion :: IType    -> IType
-collapseUnion (TUnion [t]) = t
-collapseUnion t            = t
-
--- original version
--- (+++) :: IType -> IType -> IType
--- t1 +++ t2 = fromJust $ fromUnionType $ unionType t1 ++ unionType t2
-
-{- | Intersection of two types.
->>> runListT $ intersection undefined TString TString
-[Just TString]
-
->>> runListT $ intersection undefined TInteger TString
-[Nothing]
-
->>> runListT $ intersection undefined TInteger TReal
-[Just TReal]
-
->>> runListT $ intersection undefined tDrefMapDOB TInteger
-[Just TInteger]
-
-Cannot assign a TReal to a map to TInteger
->>> runListT $ intersection undefined tDrefMapDOB TReal
-[Nothing]
-
-Cannot assign a TReal to a map to TInteger
->>> runListT $ intersection undefined TReal tDrefMapDOB
-[Nothing]
-
-runListT $ intersection undefined TClafer {_hi = ["A","X","B","C"]} TClafer {_hi = ["X"]}
-[ Just TClafer {_hi = ["X"]]
--}
-
-intersection :: Monad m => UIDIClaferMap -> IType -> IType -> m (Maybe IType)
-intersection _              TBoolean        TBoolean      = return $ Just TBoolean
-intersection _              TString         TString       = return $ Just TString
-intersection _              TReal           TReal         = return $ Just TReal
-intersection _              TReal           TDouble       = return $ Just TReal
-intersection _              TDouble         TReal         = return $ Just TReal
-intersection _              TReal           TInteger      = return $ Just TReal
-intersection _              TInteger        TReal         = return $ Just TReal
-intersection _              TDouble         TDouble       = return $ Just TDouble
-intersection _              TDouble         TInteger      = return $ Just TDouble
-intersection _              TInteger        TDouble       = return $ Just TDouble
-intersection _              TInteger        TInteger      = return $ Just TInteger
-intersection _              t               (TClafer ["clafer"]) = return $ Just t
-intersection _              (TClafer ["clafer"]) t               = return $ Just t
-intersection uidIClaferMap' (TUnion t1s)    t2@(TClafer _) = do
-  t1s' <- mapM (intersection uidIClaferMap' t2) t1s
-  return $ case catMaybes t1s' of
-    [] -> Nothing
-    [t] -> Just t
-    t1s'' -> Just $ TUnion t1s''
-intersection uidIClaferMap' t1@(TClafer _)  (TUnion t2s) = do
-  t2s' <- mapM (intersection uidIClaferMap' t1) t2s
-  return $ case catMaybes t2s' of
-    [] -> Nothing
-    [t] -> Just t
-    t2s'' -> Just $ TUnion t2s''
-intersection uidIClaferMap' t@(TClafer ut1) (TClafer ut2) = if ut1 == ut2
-  then return $ Just t
-  else do
-    h1 <- mapM (hierarchyMap uidIClaferMap' _uid) ut1
-    h2 <- mapM (hierarchyMap uidIClaferMap' _uid) ut2
-    return $ fromUnionType $ catMaybes [contains (head u1) u2 `mplus` contains (head u2) u1 | u1 <- h1, u2 <- h2 ]
-  where
-  contains i is = if i `elem` is then Just i else Nothing
-intersection uidIClaferMap' (TMap _ ta1) (TMap _ ta2) = intersection uidIClaferMap' ta1 ta2
-intersection uidIClaferMap' (TMap _ ta1) ot2          = do
-  coercedType <- intersection uidIClaferMap' ta1 ot2
-  -- that means ot2 was coerced to ta1, so it's safe
-  return $ if Just ta1 == coercedType then coercedType else Nothing
-intersection uidIClaferMap' ot1          (TMap _ ta2) = do
-  coercedType <- intersection uidIClaferMap' ot1 ta2
-  -- that means ot2 was coerced to ta1, so it's safe
-  return $ if Just ta2 == coercedType then coercedType else Nothing
-intersection _              _            _            = do
-  -- traceM $ "(DEBUG) TypeSystem.intersection: cannot intersect incompatible types: '"
-  --      ++ show t1
-  --      ++ "'' and '"
-  --      ++ show t2
-  --      ++ "'"
-  return Nothing
-
--- old version
--- intersection :: Monad m => UIDIClaferMap -> IType -> IType -> m (Maybe IType)
--- intersection uidIClaferMap' t1 t2 = do
---   h1 <- (mapM (hierarchyMap uidIClaferMap' _uid) $ unionType t1)
---   h2 <- (mapM (hierarchyMap uidIClaferMap' _uid) $ unionType t2)
---   return $ fromUnionType $ catMaybes [contains (head u1) u2 `mplus` contains (head u2) u1 | u1 <- h1, u2 <- h2 ]
---   where
---   contains i is = if i `elem` is then Just i else Nothing
-
--- | This function is similar to 'intersection', but takes into account more ancestors to be able to combine
--- clafers of different types, but with a common ancestor:
--- Inputs:
--- t1 is of type B
--- t2 is of type C
--- B : A
--- C : A
--- Outputs:
--- the resulting type is: A, and the type combination is valid
-getIfThenElseType :: Monad m => UIDIClaferMap -> IType -> IType -> m (Maybe IType)
-getIfThenElseType _              TBoolean        TBoolean      = return $ Just TBoolean
-getIfThenElseType _              TString         TString       = return $ Just TString
-getIfThenElseType _              TReal           TReal         = return $ Just TReal
-getIfThenElseType _              TReal           TDouble       = return $ Just TReal
-getIfThenElseType _              TDouble         TReal         = return $ Just TReal
-getIfThenElseType _              TReal           TInteger      = return $ Just TReal
-getIfThenElseType _              TInteger        TReal         = return $ Just TReal
-getIfThenElseType _              TDouble         TDouble       = return $ Just TDouble
-getIfThenElseType _              TDouble         TInteger      = return $ Just TDouble
-getIfThenElseType _              TInteger        TDouble       = return $ Just TDouble
-getIfThenElseType _              TInteger        TInteger      = return $ Just TInteger
-getIfThenElseType uidIClaferMap' (TUnion t1s)    t2@(TClafer _) = undefined {- o
-  t1s' <- mapM (getIfThenElseType uidIClaferMap' t2) t1s
-  return $ case catMaybes t1s' of
-    [] -> Nothing
-    [t] -> Just t
-    t1s'' -> Just $ TUnion t1s''  -}
-getIfThenElseType uidIClaferMap' t1@(TClafer _)  (TUnion t2s) = undefined {- do
-  t2s' <- mapM (getIfThenElseType uidIClaferMap' t1) t2s
-  return $ case catMaybes t2s' of
-    [] -> Nothing
-    [t] -> Just t
-    t2s'' -> Just $ TUnion t2s''  -}
-getIfThenElseType uidIClaferMap' t@(TClafer ut1) (TClafer ut2) = if ut1 == ut2
-  then return $ Just t
-  else do
-    h1 <- mapM (hierarchyMap uidIClaferMap' _uid) ut1
-    h2 <- mapM (hierarchyMap uidIClaferMap' _uid) ut2
-    let ut = catMaybes [commonHierarchy u1 u2 | u1 <- h1, u2 <- h2]
-    return $ fromUnionType ut
-    where
-    commonHierarchy :: [UID] -> [UID] -> Maybe UID
-    commonHierarchy h1 h2 = commonHierarchy' (reverse h1) (reverse h2) Nothing
-    commonHierarchy' (x:xs) (y:ys) accumulator =
-      if x == y
-      then
-        if null xs || null ys
-        then Just x
-        else commonHierarchy' xs ys $ Just x
-      else accumulator
-    commonHierarchy' _ _ _ = error "ResolverType.commonHierarchy' expects two non empty lists but was given at least one empty list!" -- Should never happen
-getIfThenElseType _ _ _ = return Nothing
-
-
-{- | Compute the type of sequential composition of two types
->>> runListT $ composition undefined TString TString
-[Nothing]
-
->>> runListT $ composition undefined TInteger TString
-[Nothing]
-
->>> runListT $ composition undefined TInteger TReal
-[Nothing]
-
->>> runListT $ composition undefined tDrefMapDOB TInteger
-[Just (TMap {_so = TClafer {_hi = ["DOB"]}, _ta = TInteger})]
-
-Cannot assign a TReal to a map to TInteger, should return [Nothing]
->>> runListT $ composition undefined tDrefMapDOB TReal
-[Just (TMap {_so = TClafer {_hi = ["DOB"]}, _ta = TReal})]
-
-Cannot assign a TInteger to a map to TInteger
->>> runListT $ composition undefined TInteger tDrefMapDOB
-[Nothing]
-
-Cannot assign a TReal to a map to TInteger
->>> runListT $ composition undefined TReal tDrefMapDOB
-[Nothing]
-
->>> runListT $ composition undefined tDrefMapDOB (TMap TReal TString)
-[Just (TMap {_so = TClafer {_hi = ["DOB"]}, _ta = TString})]
-
-The following should return [Nothing]
->>> runListT $ composition undefined (TMap TString TReal) (TMap TInteger TString)
-[Just (TMap {_so = TString, _ta = TString})]
--}
-composition :: Monad m => UIDIClaferMap -> IType -> IType -> m (Maybe IType)
-composition uidIClaferMap' (TMap so1 ta1) (TMap so2 ta2) = do
-    -- check whether we can compose?
-    _ <- intersection uidIClaferMap' ta1 so2
-    return $ Just $ TMap so1 ta2
-composition uidIClaferMap' ot1          (TMap so2 ta2) = do
-    ot1' <- intersection uidIClaferMap' ot1 so2
-    return $ TMap <$> ot1' <*> Just ta2
-composition uidIClaferMap' (TMap so1 ta1) ot2          = do
-    ot2' <- intersection uidIClaferMap' ta1 ot2
-    return $ TMap so1 <$> ot2'
-composition _              _            _            = do
-  -- traceM $ "(DEBUG) ResolverType.composition: cannot compose incompatible types: '"
-  --      ++ show t1
-  --      ++ "'' and '"
-  --      ++ show t2
-  --      ++ "'"
-  return Nothing
-
-addHierarchy :: UIDIClaferMap -> IType           -> IType
-addHierarchy    uidIClaferMap'   (TClafer [uid']) = TClafer $ mapHierarchy _uid getSuper uidIClaferMap' $ fromJust $ findIClafer uidIClaferMap' uid'
-addHierarchy    uidIClaferMap'   (TMap so' ta')   = TMap (addHierarchy uidIClaferMap' so') (addHierarchy uidIClaferMap' ta')
-addHierarchy    uidIClaferMap'   (TUnion un')     = TUnion $ map (addHierarchy uidIClaferMap') un'
-addHierarchy    _                x                = x
-
-closure :: Monad m => UIDIClaferMap -> [String] -> m [String]
-closure uidIClaferMap' ut = concat `liftM` mapM (hierarchyMap uidIClaferMap' _uid) ut
-
-getTMaps :: UIDIClaferMap -> IType        -> [IType]
-getTMaps    uidIClaferMap'   (TClafer hi') = catMaybes $ map (getDrefTMapByUID uidIClaferMap') hi'
-getTMaps    uidIClaferMap'   (TMap _ ta')  = getTMaps uidIClaferMap' ta'
-getTMaps    uidIClaferMap'   (TUnion un')  = concatMap (getTMaps uidIClaferMap') un'
-getTMaps    _                _             = []
-
-getTClafers :: UIDIClaferMap -> IType          -> [IType]
-getTClafers    uidIClaferMap'   (TClafer hi')   = catMaybes $ map (getTClaferByUID uidIClaferMap') hi'
-getTClafers    uidIClaferMap'   (TMap _ ta')    = getTClafers uidIClaferMap' ta'
-getTClafers    uidIClaferMap'   (TUnion un')    = concatMap (getTClafers uidIClaferMap') un'
-getTClafers    _                _               = []
-
-
-{- Coersions
->>> coerce tDrefMapDOB tDrefMapDOB
-TInteger
->>> coerce tDrefMapDOB TInteger
-TInteger
->>> coerce tDrefMapDOB tDrefMapDOB
-TInteger
--}
-
-coerce :: IType -> IType -> IType
--- basic coersions
-coerce TReal TReal       = TReal
-coerce TReal TInteger    = TReal
-coerce TInteger TReal    = TReal
-coerce TReal TDouble     = TReal
-coerce TDouble TReal     = TReal
-coerce TDouble TDouble   = TDouble
-coerce TDouble TInteger  = TDouble
-coerce TInteger TDouble  = TDouble
-coerce TInteger TInteger = TInteger
--- reduce complex types to simple ones
-coerce (TMap _ t1) (TMap _ t2) = coerce t1 t2
-coerce (TMap _ t1) t2          = coerce t1 t2
-coerce t1          (TMap _ t2) = coerce t1 t2
-coerce x y = error $ "TypeSystem.coerce: Cannot coerce not numeric: " ++ show x ++ " and " ++ show y
-
-
-{- | Return the type if it's possible to coerce the right type
-
-coerceRight TString TInteger
-Nothing
-
->>> coerceRight TInteger TInteger
-Just TInteger
-
->>> coerceRight TDouble TInteger
-Just TDouble
-
->>> coerceRight TReal TDouble
-Just TReal
-
->>> coerceRight TInteger TDouble
-Nothing
-
->>> coerceRight TDouble TReal
-Nothing
--}
-coerceRight :: IType -> IType -> Maybe IType
-coerceRight    lt       rt     = let
-    coercedRType = coerce lt rt
-  in
-    if lt == coercedRType then Just lt else Nothing
-
-{- Note about intersections and unions
-
-Refinement Intersections
-========================
-
-http://cstheory.stackexchange.com/questions/20536/what-are-the-practical-issues-with-intersection-and-union-types
-"the intersection/union of two types can be formed only if they refine the same archetype"
-
-In Clafer, that means that for
-abstract Person
-abstract Student : Person
-Alice : Student   -- AT = TClafer [ Alice, Student, Person ]
-Bob : Person      -- BT = TClafer [ Bob, Person ]
-
-then
-
-AT +++ BT = TClafer [ Person ]
-AT *** BT = TClafer [ Person ]
-
-
-Unrestricted Intersections
-==========================
-
-http://www.cs.cmu.edu/~joshuad/papers/intcomp/Dunfield12_elaboration.pdf
-
-Subtyping Union Types
-http://www.pps.univ-paris-diderot.fr/~vouillon/publi/subtyping-csl.pdf
--}
+{-# LANGUAGE NamedFieldPuns #-}
+{-
+ Copyright (C) 2015-2017 Michal Antkiewicz <http://gsd.uwaterloo.ca>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+-}
+module Language.Clafer.Intermediate.TypeSystem where
+
+import Language.Clafer.Common
+import Language.Clafer.Intermediate.Intclafer hiding (uid)
+
+import Control.Applicative
+import Control.Lens ((&), (<&>), (%~))
+import Control.Monad (mplus, liftM)
+import Data.List (nub)
+import Data.Maybe
+import Prelude hiding (exp)
+
+{- | Example Clafer model used in the various test cases.
+
+abstract Person
+    DOB -> integer
+
+abstract Student : Person
+    StudentID -> string
+
+abstract Employee : Person
+    EmplID -> integer
+
+Alice : Student
+    [ this.DOB.dref = 1990 ]
+    [ this.StudentID.dref = "123Alice" ]
+
+Bob : Employee
+    [ this.EmplID.dref = 345 ]
+
+AliceAndBob -> Person
+[ root.AliceAndBob.dref = Alice, Bob ]
+
+AliceAndBob2 -> Alice ++ Bob
+-}
+
+{- $setup
+>>> :m + Control.Monad.List
+
+TClafer
+>>> let tClaferPerson = TClafer [ "Person" ]
+>>> let tClaferDOB = TClafer [ "DOB" ]
+>>> let tClaferStudent = TClafer [ "Student", "Person" ]
+>>> let tClaferStudentID = TClafer [ "StudentID" ]
+>>> let tClaferEmployee = TClafer [ "Employee", "Person" ]
+>>> let tClaferEmplID = TClafer [ "EmplID" ]
+>>> let tClaferAlice = TClafer [ "Alice", "Student", "Person" ]
+>>> let tClaferBob = TClafer [ "Bob", "Employee", "Person" ]
+>>> let tClaferAliceAndBob = TClafer [ "AliceAndBob" ]
+>>> let tClaferAliceAndBob2 = TClafer [ "AliceAndBob2" ]
+
+TUnion
+>>> let tUnionAliceBob = TUnion [ tClaferAlice, tClaferBob ]
+
+TMap
+>>> let tMapDOB = TMap tClaferPerson tClaferDOB
+>>> let tDrefMapDOB = TMap tClaferDOB TInteger
+>>> let tMapStudentID = TMap tClaferStudent tClaferStudentID
+>>> let tDrefMapStudentID = TMap tClaferStudentID TString
+>>> let tMapEmplID = TMap tClaferEmplID tClaferEmplID
+>>> let tDrefMapEmplID = TMap tClaferEmplID TInteger
+>>> let tDrefMapAliceAndBob = TMap tClaferAliceAndBob tClaferPerson
+>>> let tDrefMapAliceAndBob2 = TMap tClaferAliceAndBob tUnionAliceBob
+
+constants
+>>> let t1990 = TInteger
+>>> let t123Alice = TString
+>>> let t345 = TInteger
+-}
+
+-- | Sing
+rootTClafer :: IType
+rootTClafer = TClafer ["root"]
+
+-- | Obj
+claferTClafer :: IType
+claferTClafer = TClafer ["clafer"]
+
+numeric :: IType     -> Bool
+numeric TInteger     = True
+numeric TReal        = True
+numeric TDouble      = True
+numeric (TMap _ ta') = numeric ta'
+numeric (TUnion un') = any numeric un'
+numeric _            = False
+
+isTInteger :: IType    -> Bool
+isTInteger TInteger     = True
+isTInteger (TMap _ ta') = isTInteger ta'
+isTInteger (TUnion un') = any isTInteger un'
+isTInteger _            = False
+
+isTString :: IType    -> Bool
+isTString TString      = True
+isTString (TMap _ ta') = isTString ta'
+isTString (TUnion un') = any isTString un'
+isTString _            = False
+
+isTBoolean :: IType    -> Bool
+isTBoolean TBoolean      = True
+isTBoolean (TMap _ ta') = isTBoolean ta'
+isTBoolean (TUnion un') = any isTBoolean un'
+isTBoolean _            = False
+
+-- | Get TClafer for a given Clafer
+-- can only be called after inheritance resolver
+getTClafer :: IClafer -> IType
+getTClafer    iClafer' = case _uid iClafer' of
+  "root"   -> rootTClafer
+  "clafer" -> claferTClafer
+  _        -> case _super iClafer' of
+    Nothing     -> TClafer [ _uid iClafer']
+    Just super' -> fromJust (_iType super') & hi %~ (:) (_uid iClafer')
+
+-- | Get TClafer for a given Clafer by its UID
+-- can only be called after inheritance resolver
+getTClaferByUID :: UIDIClaferMap -> UID -> Maybe IType
+getTClaferByUID    uidIClaferMap'   uid' = case uid' of
+  "root"   -> Just rootTClafer
+  "clafer" -> Just claferTClafer
+  _        -> findIClafer uidIClaferMap' uid' <&> getTClafer
+
+-- | Get TClafer for a given Clafer by its UID
+-- can only be called after inheritance resolver
+getTClaferFromIExp :: UIDIClaferMap -> IExp -> Maybe IType
+getTClaferFromIExp    uidIClaferMap'   (IClaferId _ uid' _ _) = getTClaferByUID uidIClaferMap' uid'
+getTClaferFromIExp    _                (IInt _)               = Just TInteger
+getTClaferFromIExp    _                (IReal _)              = Just TReal
+getTClaferFromIExp    _                (IDouble _)            = Just TDouble
+getTClaferFromIExp    _                (IStr _)               = Just TString
+getTClaferFromIExp    _                _                      = Nothing
+
+-- | Get TMap for a given reference Clafer. Nothing for non-reference clafers.
+-- can only be called after inheritance resolver
+getDrefTMap :: IClafer -> Maybe IType
+getDrefTMap    iClafer' = case _uid iClafer' of
+  "root"   -> Nothing
+  "clafer" -> Nothing
+  _        -> TMap <$> (Just $ getTClafer iClafer') <*> (iClafer' & _reference <&> _ref >>= _iType)
+
+-- | Get TMap for a given Clafer by its UID. Nothing for non-reference clafers.
+-- can only be called after inheritance resolver
+getDrefTMapByUID :: UIDIClaferMap -> UID -> Maybe IType
+getDrefTMapByUID    uidIClaferMap'   uid' = case uid' of
+  "root"   -> Nothing
+  "clafer" -> Nothing
+  _        -> findIClafer uidIClaferMap' uid' >>= getDrefTMap
+
+
+hierarchy :: (Monad m) => UIDIClaferMap -> UID -> m [IClafer]
+hierarchy uidIClaferMap' uid' = case findIClafer uidIClaferMap' uid' of
+      Nothing -> fail $ "TypeSystem.hierarchy: clafer " ++ uid' ++ "not found!"
+      Just clafer -> return $ findHierarchy getSuper uidIClaferMap' clafer
+
+hierarchyMap :: (Monad m) => UIDIClaferMap -> (IClafer -> a) -> UID -> m [a]
+hierarchyMap uidIClaferMap' f c = case findIClafer uidIClaferMap' c of
+      Nothing -> fail $ "TypeSystem.hierarchyMap: clafer " ++ c ++ "not found!"
+      Just clafer -> return $ mapHierarchy f getSuper uidIClaferMap' clafer
+
+
+{- ---------------------------------------
+ - Sums, Intersections, and Compositions -
+ --------------------------------------- -}
+
+unionType :: IType -> [String]
+unionType TString  = [stringType]
+unionType TReal    = [realType]
+unionType TDouble  = [doubleType]
+unionType TInteger = [integerType]
+unionType TBoolean = [booleanType]
+unionType (TClafer u) = u
+unionType (TUnion types) = concatMap unionType types
+unionType (TMap _ ta') = unionType ta'
+
+fromUnionType :: [String] -> Maybe IType
+fromUnionType u =
+    case nub u of
+        ["string"]  -> Just TString
+        ["integer"] -> Just TInteger
+        ["int"]     -> Just TInteger
+        ["double"]  -> Just TDouble
+        ["real"]    -> Just TReal
+        ["root"]    -> Just rootTClafer
+        ["clafer"]  -> Just claferTClafer
+        []          -> Nothing
+        u'          -> Just $ TClafer u'
+
+{- | Union the two given types
+>>> TString +++ TString
+TString
+
+Unions with only one type should be collapsed.
+>>> TUnion [TString] +++ TString
+TString
+
+>>> TString +++ TInteger
+TUnion {_un = [TString,TInteger]}
+
+>>> TString +++ TUnion [TInteger]
+TUnion {_un = [TString,TInteger]}
+
+>>> TUnion [TString] +++ TInteger
+TUnion {_un = [TString,TInteger]}
+
+>>> TUnion [TString] +++ TUnion[TInteger]
+TUnion {_un = [TString,TInteger]}
+
+>>> TUnion [TString] +++ TUnion[TInteger] +++ TInteger +++ TString
+TUnion {_un = [TString,TInteger]}
+
+Should return TUnion {_un = [TClafer {_hi = ["Alice","Student","Person"]},TClafer {_hi = ["Bob","Employee","Person"]}]}
+>>> tClaferAlice +++ tClaferBob
+TClafer {_hi = ["Alice","Student","Person","Bob","Employee"]}
+
+>>> tClaferAlice +++ tClaferAlice
+TClafer {_hi = ["Alice","Student","Person"]}
+
+>>> (TClafer {_hi = ["A", "X"]} +++ TClafer {_hi = ["B", "X"]}) +++ TClafer {_hi = ["C", "X"]}
+TClafer {_hi = ["A","X","B","C"]}
+
+>>> TClafer {_hi = ["A", "X"]} +++ (TClafer {_hi = ["B", "X"]} +++ TClafer {_hi = ["C", "X"]})
+TClafer {_hi = ["A","X","B","C"]}
+-}
+(+++) :: IType -> IType -> IType
+TBoolean        +++ TBoolean        = TBoolean
+TString         +++ TString         = TString
+TReal           +++ TReal           = TReal
+TDouble         +++ TDouble         = TDouble
+TInteger        +++ TInteger        = TInteger
+t1@(TClafer u1) +++ t2@(TClafer u2) = if t1 == t2
+                                      then t1
+                                      else TClafer $ nub $ u1 ++ u2  -- should be TUnion [t1,t2]
+(TMap so1 ta1)  +++ (TMap so2 ta2)  = TMap (so1 +++ so2) (ta1 +++ ta2)
+(TUnion un1)    +++ (TUnion un2)    = collapseUnion (TUnion $ nub $ un1 ++ un2)
+(TUnion un1)    +++ t2              = collapseUnion (TUnion $ nub $ un1 ++ [t2])
+t1              +++ (TUnion un2)    = collapseUnion (TUnion $ nub $ t1:un2)
+t1              +++ t2              = if t1 == t2
+                                      then t1
+                                      else TUnion [t1, t2]
+
+collapseUnion :: IType    -> IType
+collapseUnion (TUnion [t]) = t
+collapseUnion t            = t
+
+-- original version
+-- (+++) :: IType -> IType -> IType
+-- t1 +++ t2 = fromJust $ fromUnionType $ unionType t1 ++ unionType t2
+
+{- | Intersection of two types.
+>>> runListT $ intersection undefined TString TString
+[Just TString]
+
+>>> runListT $ intersection undefined TInteger TString
+[Nothing]
+
+>>> runListT $ intersection undefined TInteger TReal
+[Just TReal]
+
+>>> runListT $ intersection undefined tDrefMapDOB TInteger
+[Just TInteger]
+
+Cannot assign a TReal to a map to TInteger
+>>> runListT $ intersection undefined tDrefMapDOB TReal
+[Nothing]
+
+Cannot assign a TReal to a map to TInteger
+>>> runListT $ intersection undefined TReal tDrefMapDOB
+[Nothing]
+
+runListT $ intersection undefined TClafer {_hi = ["A","X","B","C"]} TClafer {_hi = ["X"]}
+[ Just TClafer {_hi = ["X"]]
+-}
+
+intersection :: Monad m => UIDIClaferMap -> IType -> IType -> m (Maybe IType)
+intersection _              TBoolean        TBoolean      = return $ Just TBoolean
+intersection _              TString         TString       = return $ Just TString
+intersection _              TReal           TReal         = return $ Just TReal
+intersection _              TReal           TDouble       = return $ Just TReal
+intersection _              TDouble         TReal         = return $ Just TReal
+intersection _              TReal           TInteger      = return $ Just TReal
+intersection _              TInteger        TReal         = return $ Just TReal
+intersection _              TDouble         TDouble       = return $ Just TDouble
+intersection _              TDouble         TInteger      = return $ Just TDouble
+intersection _              TInteger        TDouble       = return $ Just TDouble
+intersection _              TInteger        TInteger      = return $ Just TInteger
+intersection _              t               (TClafer ["clafer"]) = return $ Just t
+intersection _              (TClafer ["clafer"]) t               = return $ Just t
+intersection uidIClaferMap' (TUnion t1s)    t2@(TClafer _) = do
+  t1s' <- mapM (intersection uidIClaferMap' t2) t1s
+  return $ case catMaybes t1s' of
+    [] -> Nothing
+    [t] -> Just t
+    t1s'' -> Just $ TUnion t1s''
+intersection uidIClaferMap' t1@(TClafer _)  (TUnion t2s) = do
+  t2s' <- mapM (intersection uidIClaferMap' t1) t2s
+  return $ case catMaybes t2s' of
+    [] -> Nothing
+    [t] -> Just t
+    t2s'' -> Just $ TUnion t2s''
+intersection uidIClaferMap' t@(TClafer ut1) (TClafer ut2) = if ut1 == ut2
+  then return $ Just t
+  else do
+    h1 <- mapM (hierarchyMap uidIClaferMap' _uid) ut1
+    h2 <- mapM (hierarchyMap uidIClaferMap' _uid) ut2
+    return $ fromUnionType $ catMaybes [contains (head u1) u2 `mplus` contains (head u2) u1 | u1 <- h1, u2 <- h2 ]
+  where
+  contains i is = if i `elem` is then Just i else Nothing
+intersection uidIClaferMap' (TMap _ ta1) (TMap _ ta2) = intersection uidIClaferMap' ta1 ta2
+intersection uidIClaferMap' (TMap _ ta1) ot2          = do
+  coercedType <- intersection uidIClaferMap' ta1 ot2
+  -- that means ot2 was coerced to ta1, so it's safe
+  return $ if Just ta1 == coercedType then coercedType else Nothing
+intersection uidIClaferMap' ot1          (TMap _ ta2) = do
+  coercedType <- intersection uidIClaferMap' ot1 ta2
+  -- that means ot2 was coerced to ta1, so it's safe
+  return $ if Just ta2 == coercedType then coercedType else Nothing
+intersection _              _            _            = do
+  -- traceM $ "(DEBUG) TypeSystem.intersection: cannot intersect incompatible types: '"
+  --      ++ show t1
+  --      ++ "'' and '"
+  --      ++ show t2
+  --      ++ "'"
+  return Nothing
+
+-- old version
+-- intersection :: Monad m => UIDIClaferMap -> IType -> IType -> m (Maybe IType)
+-- intersection uidIClaferMap' t1 t2 = do
+--   h1 <- (mapM (hierarchyMap uidIClaferMap' _uid) $ unionType t1)
+--   h2 <- (mapM (hierarchyMap uidIClaferMap' _uid) $ unionType t2)
+--   return $ fromUnionType $ catMaybes [contains (head u1) u2 `mplus` contains (head u2) u1 | u1 <- h1, u2 <- h2 ]
+--   where
+--   contains i is = if i `elem` is then Just i else Nothing
+
+-- | This function is similar to 'intersection', but takes into account more ancestors to be able to combine
+-- clafers of different types, but with a common ancestor:
+-- Inputs:
+-- t1 is of type B
+-- t2 is of type C
+-- B : A
+-- C : A
+-- Outputs:
+-- the resulting type is: A, and the type combination is valid
+getIfThenElseType :: Monad m => UIDIClaferMap -> IType -> IType -> m (Maybe IType)
+getIfThenElseType _              TBoolean        TBoolean      = return $ Just TBoolean
+getIfThenElseType _              TString         TString       = return $ Just TString
+getIfThenElseType _              TReal           TReal         = return $ Just TReal
+getIfThenElseType _              TReal           TDouble       = return $ Just TReal
+getIfThenElseType _              TDouble         TReal         = return $ Just TReal
+getIfThenElseType _              TReal           TInteger      = return $ Just TReal
+getIfThenElseType _              TInteger        TReal         = return $ Just TReal
+getIfThenElseType _              TDouble         TDouble       = return $ Just TDouble
+getIfThenElseType _              TDouble         TInteger      = return $ Just TDouble
+getIfThenElseType _              TInteger        TDouble       = return $ Just TDouble
+getIfThenElseType _              TInteger        TInteger      = return $ Just TInteger
+getIfThenElseType uidIClaferMap' (TUnion t1s)    t2@(TClafer _) = undefined {- o
+  t1s' <- mapM (getIfThenElseType uidIClaferMap' t2) t1s
+  return $ case catMaybes t1s' of
+    [] -> Nothing
+    [t] -> Just t
+    t1s'' -> Just $ TUnion t1s''  -}
+getIfThenElseType uidIClaferMap' t1@(TClafer _)  (TUnion t2s) = undefined {- do
+  t2s' <- mapM (getIfThenElseType uidIClaferMap' t1) t2s
+  return $ case catMaybes t2s' of
+    [] -> Nothing
+    [t] -> Just t
+    t2s'' -> Just $ TUnion t2s''  -}
+getIfThenElseType uidIClaferMap' t@(TClafer ut1) (TClafer ut2) = if ut1 == ut2
+  then return $ Just t
+  else do
+    h1 <- mapM (hierarchyMap uidIClaferMap' _uid) ut1
+    h2 <- mapM (hierarchyMap uidIClaferMap' _uid) ut2
+    let ut = catMaybes [commonHierarchy u1 u2 | u1 <- h1, u2 <- h2]
+    return $ fromUnionType ut
+    where
+    commonHierarchy :: [UID] -> [UID] -> Maybe UID
+    commonHierarchy h1 h2 = commonHierarchy' (reverse h1) (reverse h2) Nothing
+    commonHierarchy' (x:xs) (y:ys) accumulator =
+      if x == y
+      then
+        if null xs || null ys
+        then Just x
+        else commonHierarchy' xs ys $ Just x
+      else accumulator
+    commonHierarchy' _ _ _ = error "ResolverType.commonHierarchy' expects two non empty lists but was given at least one empty list!" -- Should never happen
+getIfThenElseType _ _ _ = return Nothing
+
+
+{- | Compute the type of sequential composition of two types
+>>> runListT $ composition undefined TString TString
+[Nothing]
+
+>>> runListT $ composition undefined TInteger TString
+[Nothing]
+
+>>> runListT $ composition undefined TInteger TReal
+[Nothing]
+
+>>> runListT $ composition undefined tDrefMapDOB TInteger
+[Just (TMap {_so = TClafer {_hi = ["DOB"]}, _ta = TInteger})]
+
+Cannot assign a TReal to a map to TInteger, should return [Nothing]
+>>> runListT $ composition undefined tDrefMapDOB TReal
+[Just (TMap {_so = TClafer {_hi = ["DOB"]}, _ta = TReal})]
+
+Cannot assign a TInteger to a map to TInteger
+>>> runListT $ composition undefined TInteger tDrefMapDOB
+[Nothing]
+
+Cannot assign a TReal to a map to TInteger
+>>> runListT $ composition undefined TReal tDrefMapDOB
+[Nothing]
+
+>>> runListT $ composition undefined tDrefMapDOB (TMap TReal TString)
+[Just (TMap {_so = TClafer {_hi = ["DOB"]}, _ta = TString})]
+
+The following should return [Nothing]
+>>> runListT $ composition undefined (TMap TString TReal) (TMap TInteger TString)
+[Just (TMap {_so = TString, _ta = TString})]
+-}
+composition :: Monad m => UIDIClaferMap -> IType -> IType -> m (Maybe IType)
+composition uidIClaferMap' (TMap so1 ta1) (TMap so2 ta2) = do
+    -- check whether we can compose?
+    _ <- intersection uidIClaferMap' ta1 so2
+    return $ Just $ TMap so1 ta2
+composition uidIClaferMap' ot1          (TMap so2 ta2) = do
+    ot1' <- intersection uidIClaferMap' ot1 so2
+    return $ TMap <$> ot1' <*> Just ta2
+composition uidIClaferMap' (TMap so1 ta1) ot2          = do
+    ot2' <- intersection uidIClaferMap' ta1 ot2
+    return $ TMap so1 <$> ot2'
+composition _              _            _            = do
+  -- traceM $ "(DEBUG) ResolverType.composition: cannot compose incompatible types: '"
+  --      ++ show t1
+  --      ++ "'' and '"
+  --      ++ show t2
+  --      ++ "'"
+  return Nothing
+
+addHierarchy :: UIDIClaferMap -> IType           -> IType
+addHierarchy    uidIClaferMap'   (TClafer [uid']) = TClafer $ mapHierarchy _uid getSuper uidIClaferMap' $ fromJust $ findIClafer uidIClaferMap' uid'
+addHierarchy    uidIClaferMap'   (TMap so' ta')   = TMap (addHierarchy uidIClaferMap' so') (addHierarchy uidIClaferMap' ta')
+addHierarchy    uidIClaferMap'   (TUnion un')     = TUnion $ map (addHierarchy uidIClaferMap') un'
+addHierarchy    _                x                = x
+
+closure :: Monad m => UIDIClaferMap -> [String] -> m [String]
+closure uidIClaferMap' ut = concat `liftM` mapM (hierarchyMap uidIClaferMap' _uid) ut
+
+getTMaps :: UIDIClaferMap -> IType        -> [IType]
+getTMaps    uidIClaferMap'   (TClafer hi') = catMaybes $ map (getDrefTMapByUID uidIClaferMap') hi'
+getTMaps    uidIClaferMap'   (TMap _ ta')  = getTMaps uidIClaferMap' ta'
+getTMaps    uidIClaferMap'   (TUnion un')  = concatMap (getTMaps uidIClaferMap') un'
+getTMaps    _                _             = []
+
+getTClafers :: UIDIClaferMap -> IType          -> [IType]
+getTClafers    uidIClaferMap'   (TClafer hi')   = catMaybes $ map (getTClaferByUID uidIClaferMap') hi'
+getTClafers    uidIClaferMap'   (TMap _ ta')    = getTClafers uidIClaferMap' ta'
+getTClafers    uidIClaferMap'   (TUnion un')    = concatMap (getTClafers uidIClaferMap') un'
+getTClafers    _                _               = []
+
+
+{- Coersions
+>>> coerce tDrefMapDOB tDrefMapDOB
+TInteger
+>>> coerce tDrefMapDOB TInteger
+TInteger
+>>> coerce tDrefMapDOB tDrefMapDOB
+TInteger
+-}
+
+coerce :: IType -> IType -> IType
+-- basic coersions
+coerce TReal TReal       = TReal
+coerce TReal TInteger    = TReal
+coerce TInteger TReal    = TReal
+coerce TReal TDouble     = TReal
+coerce TDouble TReal     = TReal
+coerce TDouble TDouble   = TDouble
+coerce TDouble TInteger  = TDouble
+coerce TInteger TDouble  = TDouble
+coerce TInteger TInteger = TInteger
+-- reduce complex types to simple ones
+coerce (TMap _ t1) (TMap _ t2) = coerce t1 t2
+coerce (TMap _ t1) t2          = coerce t1 t2
+coerce t1          (TMap _ t2) = coerce t1 t2
+coerce x y = error $ "TypeSystem.coerce: Cannot coerce not numeric: " ++ show x ++ " and " ++ show y
+
+
+{- | Return the type if it's possible to coerce the right type
+
+coerceRight TString TInteger
+Nothing
+
+>>> coerceRight TInteger TInteger
+Just TInteger
+
+>>> coerceRight TDouble TInteger
+Just TDouble
+
+>>> coerceRight TReal TDouble
+Just TReal
+
+>>> coerceRight TInteger TDouble
+Nothing
+
+>>> coerceRight TDouble TReal
+Nothing
+-}
+coerceRight :: IType -> IType -> Maybe IType
+coerceRight    lt       rt     = let
+    coercedRType = coerce lt rt
+  in
+    if lt == coercedRType then Just lt else Nothing
+
+{- Note about intersections and unions
+
+Refinement Intersections
+========================
+
+http://cstheory.stackexchange.com/questions/20536/what-are-the-practical-issues-with-intersection-and-union-types
+"the intersection/union of two types can be formed only if they refine the same archetype"
+
+In Clafer, that means that for
+abstract Person
+abstract Student : Person
+Alice : Student   -- AT = TClafer [ Alice, Student, Person ]
+Bob : Person      -- BT = TClafer [ Bob, Person ]
+
+then
+
+AT +++ BT = TClafer [ Person ]
+AT *** BT = TClafer [ Person ]
+
+
+Unrestricted Intersections
+==========================
+
+http://www.cs.cmu.edu/~joshuad/papers/intcomp/Dunfield12_elaboration.pdf
+
+Subtyping Union Types
+http://www.pps.univ-paris-diderot.fr/~vouillon/publi/subtyping-csl.pdf
+-}
diff --git a/src/Language/Clafer/JSONMetaData.hs b/src/Language/Clafer/JSONMetaData.hs
--- a/src/Language/Clafer/JSONMetaData.hs
+++ b/src/Language/Clafer/JSONMetaData.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-
- Copyright (C) 2014 Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2014-2017 Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
@@ -77,20 +77,20 @@
 
 -- insert a new line after  [, {, and ,
 prettyPrintJSON :: String -> String
-prettyPrintJSON ('[':line) = '[':'\n':(prettyPrintJSON line)
-prettyPrintJSON ('{':line) = '{':'\n':(prettyPrintJSON line)
-prettyPrintJSON (',':line) = ',':'\n':(prettyPrintJSON line)
+prettyPrintJSON ('[':line) = '[':'\n':prettyPrintJSON line
+prettyPrintJSON ('{':line) = '{':'\n':prettyPrintJSON line
+prettyPrintJSON (',':line) = ',':'\n':prettyPrintJSON line
 -- insert a new line before ], }
-prettyPrintJSON (']':line) = '\n':']':(prettyPrintJSON line)
-prettyPrintJSON ('}':line) = '\n':'}':(prettyPrintJSON line)
+prettyPrintJSON (']':line) = '\n':']':prettyPrintJSON line
+prettyPrintJSON ('}':line) = '\n':'}':prettyPrintJSON line
 -- just rewrite and continue
-prettyPrintJSON (c:line) =  c:(prettyPrintJSON line)
+prettyPrintJSON (c:line) =  c:prettyPrintJSON line
 prettyPrintJSON ""         = ""
 
 -- | given the QNameMaps, parse the JSON scopes and return list of scopes
 parseJSONScopes :: QNameMaps -> String    -> [ (UID, Integer) ]
 parseJSONScopes    qNameMaps    scopesJSON =
-    foldl (\uidScopes qScope -> (qNameToUIDs qScope) ++ uidScopes) [] decodedScopes
+    foldl (\uidScopes qScope -> qNameToUIDs qScope ++ uidScopes) [] decodedScopes
     where
       --                  QName
       decodedScopes :: [ (T.Text, Integer) ]
diff --git a/src/Language/Clafer/QNameUID.hs b/src/Language/Clafer/QNameUID.hs
--- a/src/Language/Clafer/QNameUID.hs
+++ b/src/Language/Clafer/QNameUID.hs
@@ -1,5 +1,5 @@
 {-
- Copyright (C) 2014 Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2014-2017 Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
@@ -95,7 +95,7 @@
 addClafer :: [String] -> (FQNameUIDMap, UIDFqNameMap) -> IElement          -> (FQNameUIDMap, UIDFqNameMap)
 addClafer    path        (fqNameUIDMap, uidFqNameMap)    (IEClafer iClaf) =
     let
-        newPath = (_ident iClaf) : path
+        newPath = _ident iClaf : path
         fqKey :: FQKey
         fqKey = concat newPath
         fqName :: FQName
diff --git a/src/Language/Clafer/SplitJoin.hs b/src/Language/Clafer/SplitJoin.hs
--- a/src/Language/Clafer/SplitJoin.hs
+++ b/src/Language/Clafer/SplitJoin.hs
@@ -1,4 +1,25 @@
 {-# LANGUAGE RecordWildCards #-}
+{-
+ Copyright (C) 2012-2017 Kacper Bak <http://gsd.uwaterloo.ca>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+-}
 module Language.Clafer.SplitJoin(splitArgs, joinArgs) where
 
 import Data.Char
diff --git a/src/Language/ClaferT.hs b/src/Language/ClaferT.hs
--- a/src/Language/ClaferT.hs
+++ b/src/Language/ClaferT.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE RankNTypes #-}
 {-
- Copyright (C) 2012-2015 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2017 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,14 +1,9 @@
-# for GHC-8.0.1
-extra-deps:
-  - data-stringmap-1.0.1.1
-  - json-builder-0.3
-resolver: nightly-2016-06-21
-
-# for GHC-7.10.3
-# extra-deps:
-#  - data-stringmap-1.0.1.1
-# resolver: lts-6.4
-
-flags: {}
-packages:
-- '.'
+# for GHC-8.0.2
+extra-deps:
+  - data-stringmap-1.0.1.1
+  - json-builder-0.3
+resolver: lts-8.5
+
+flags: {}
+packages:
+- '.'
diff --git a/test/Functions.hs b/test/Functions.hs
--- a/test/Functions.hs
+++ b/test/Functions.hs
@@ -1,5 +1,5 @@
 {-
- Copyright (C) 2013-2015 Luke Brown, Michal Antkiewicz <http://gsd.uwaterloo.ca>
+ Copyright (C) 2013-2017 Luke Brown, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
diff --git a/test/test-suite.hs b/test/test-suite.hs
--- a/test/test-suite.hs
+++ b/test/test-suite.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-}
 {-
- Copyright (C) 2013 Luke Brown <http://gsd.uwaterloo.ca>
+ Copyright (C) 2013-2017 Luke Brown, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
