packages feed

language-c (empty) → 0.3.0

raw patch · 37 files changed

+15578/−0 lines, 37 filesdep +arraydep +basedep +bytestringsetup-changed

Dependencies added: array, base, bytestring, containers, directory, filepath, pretty, process

Files

+ LICENSE view
@@ -0,0 +1,29 @@+Copyright (c) 1999-2008 Manuel M T Chakravarty +												Duncan Coutts+					              Benedikt Huber+Portions Copyright (c)  1989,  1990  James  A.  Roskind+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:+1. Redistributions of source code must retain the above copyright+   notice, this list of conditions and the following disclaimer.+2. Redistributions in binary form must reproduce the above copyright+   notice, this list of conditions and the following disclaimer in the+   documentation and/or other materials provided with the distribution.+3. Neither the name of the author nor the names of his contributors+   may be used to endorse or promote products derived from this software+   without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,5 @@+#!/usr/bin/env runhaskell++import Distribution.Simple++main = defaultMain
+ dist/build/Language/C/Parser/Lexer.hs view
@@ -0,0 +1,513 @@+{-# OPTIONS -fglasgow-exts -cpp #-}+{-# LINE 49 "src/Language/C/Parser/Lexer.x" #-}++module Language.C.Parser.Lexer (lexC, parseError) where++import Data.Char (isDigit)+import Control.Monad (liftM)++import Language.C.Data.InputStream+import Language.C.Data.Position  (Position(..),posOf)+import Language.C.Data.Ident    (mkIdent)++import Language.C.Syntax.Constants++import Language.C.Parser.Tokens+import Language.C.Parser.ParserMonad++#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#else+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+import Data.Char (ord)+import Data.Array.Base (unsafeAt)+#else+import Array+import Char (ord)+#endif+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif+alex_base :: AlexAddr+alex_base = AlexA# "\xf8\xff\xff\xff\x6e\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x78\x00\x00\x00\x82\x00\x00\x00\x9c\x00\x00\x00\xb6\x00\x00\x00\xbf\x00\x00\x00\xd9\x00\x00\x00\xf3\x00\x00\x00\xfc\x00\x00\x00\x16\x01\x00\x00\x30\x01\x00\x00\x39\x01\x00\x00\x53\x01\x00\x00\x6d\x01\x00\x00\xbe\x01\x00\x00\x1e\x02\x00\x00\x7e\x02\x00\x00\xde\x02\x00\x00\x3e\x03\x00\x00\x9e\x03\x00\x00\xfc\x03\x00\x00\x45\x04\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\xfd\xff\xff\xff\xa7\xff\xff\xff\x9c\xff\xff\xff\xa3\xff\xff\xff\xaa\xff\xff\xff\x9a\xff\xff\xff\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x9b\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\xae\xff\xff\xff\x6b\x04\x00\x00\xc4\x04\x00\x00\x1b\x05\x00\x00\x00\x00\x00\x00\x62\x01\x00\x00\x68\x05\x00\x00\xae\x00\x00\x00\x5c\x01\x00\x00\x66\x01\x00\x00\xd3\x03\x00\x00\xeb\x03\x00\x00\xfa\x03\x00\x00\x56\x05\x00\x00\x08\x01\x00\x00\xec\xff\xff\xff\xa8\xff\xff\xff\xc7\xff\xff\xff\x32\x00\x00\x00\x48\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\xae\x05\x00\x00\xd4\x05\x00\x00\x5a\x05\x00\x00\x5e\x05\x00\x00\x80\x05\x00\x00\x84\x05\x00\x00\xa6\x05\x00\x00\xca\x05\x00\x00\xd8\x05\x00\x00\x09\x01\x00\x00\x55\x00\x00\x00\xa9\xff\xff\xff\xca\xff\xff\xff\x6f\x00\x00\x00\x8b\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x1e\x06\x00\x00\x64\x06\x00\x00\xf0\x05\x00\x00\x11\x06\x00\x00\x56\x06\x00\x00\x69\x06\x00\x00\x6e\x06\x00\x00\x8a\x06\x00\x00\x8f\x06\x00\x00\x5e\x01\x00\x00\x92\x00\x00\x00\xab\xff\xff\xff\x08\x00\x00\x00\xad\x00\x00\x00\xc8\x00\x00\x00\xac\x00\x00\x00\xd5\x06\x00\x00\xee\x06\x00\x00\xd6\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x07\x00\x00\x3a\x07\x00\x00\x17\x04\x00\x00\x4e\x07\x00\x00\x8e\x07\x00\x00\x9a\x05\x00\x00\xe7\x05\x00\x00\x14\x06\x00\x00\xd3\x07\x00\x00\x1c\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x07\x00\x00\xaf\x07\x00\x00\x51\x06\x00\x00\x33\x08\x00\x00\x79\x08\x00\x00\x65\x06\x00\x00\x94\x06\x00\x00\x96\x06\x00\x00\x91\x08\x00\x00\xda\x08\x00\x00\x00\x00\x00\x00\xee\x07\x00\x00\xf1\x08\x00\x00\x1f\x09\x00\x00\x27\x09\x00\x00\xa5\x06\x00\x00\xed\x06\x00\x00\x3b\x09\x00\x00\x7b\x09\x00\x00\x1e\x07\x00\x00\x4d\x07\x00\x00\x5b\x09\x00\x00\x9b\x09\x00\x00\x52\x07\x00\x00\xbb\x09\x00\x00\xd3\x09\x00\x00\xf2\x09\x00\x00\x3b\x0a\x00\x00\x52\x0a\x00\x00\x89\x0a\x00\x00\xd2\x0a\x00\x00\x00\x00\x00\x00\xa0\x0a\x00\x00\xe9\x0a\x00\x00\x17\x0b\x00\x00\x1f\x0b\x00\x00\x7f\x07\x00\x00\x80\x07\x00\x00\x33\x0b\x00\x00\x73\x0b\x00\x00\x8f\x07\x00\x00\x90\x07\x00\x00\x53\x0b\x00\x00\x93\x0b\x00\x00\xb0\x07\x00\x00\xb3\x0b\x00\x00\xcb\x0b\x00\x00\xea\x0b\x00\x00\x33\x0c\x00\x00\x4a\x0c\x00\x00\x81\x0c\x00\x00\xca\x0c\x00\x00\x00\x00\x00\x00\xec\x0c\x00\x00\x0e\x0d\x00\x00\x9e\x0c\x00\x00\x2f\x0d\x00\x00\x1b\x00\x00\x00\x01\x04\x00\x00\x60\x04\x00\x00\x4e\x0d\x00\x00\xb5\x06\x00\x00\x10\x05\x00\x00\x6f\x0d\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x79\x0d\x00\x00\x1f\x00\x00\x00\x19\x04\x00\x00\x85\x0d\x00\x00\xc6\x0d\x00\x00\xec\x0d\x00\x00\x08\x0e\x00\x00\xe1\x0c\x00\x00\x00\x00\x00\x00\xc1\x07\x00\x00\x35\x08\x00\x00\x49\x04\x00\x00\x2a\x0e\x00\x00\x49\x0e\x00\x00\x5f\x0e\x00\x00\x67\x0e\x00\x00\xde\x05\x00\x00\x4c\x08\x00\x00\x95\x0e\x00\x00\xda\x0e\x00\x00\x7b\x08\x00\x00\xf2\x0e\x00\x00\x3b\x0f\x00\x00\x7b\x0e\x00\x00\x84\x0f\x00\x00\x00\x00\x00\x00\x1f\x08\x00\x00\x7d\x08\x00\x00\x20\x07\x00\x00\x52\x0f\x00\x00\x9d\x0f\x00\x00\xcb\x0f\x00\x00\xd3\x0f\x00\x00\xcb\x07\x00\x00\xac\x08\x00\x00\x01\x10\x00\x00\x46\x10\x00\x00\xd6\x08\x00\x00\x5e\x10\x00\x00\xa7\x10\x00\x00\xe7\x0f\x00\x00\xf0\x10\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x63\x00\x00\x00\x07\x11\x00\x00\x2d\x11\x00\x00\x44\x11\x00\x00\x6a\x11\x00\x00\x81\x11\x00\x00\xa7\x11\x00\x00\xbe\x11\x00\x00\xe4\x11\x00\x00\xfb\x11\x00\x00\x21\x12\x00\x00\x38\x12\x00\x00\x5e\x12\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\x3d\x09\x00\x00\x3f\x09\x00\x00\xec\x09\x00\x00\xee\x09\x00\x00\xbe\x10\x00\x00\xa3\x12\x00\x00\x33\x0a\x00\x00\xab\x12\x00\x00\xa2\x0a\x00\x00\xa4\x0a\x00\x00\x31\x08\x00\x00\xc2\x12\x00\x00\xf0\x12\x00\x00\x99\x08\x00\x00\xf8\x12\x00\x00\x10\x13\x00\x00\x59\x13\x00\x00\x70\x13\x00\x00\x96\x13\x00\x00\xad\x13\x00\x00\xd3\x13\x00\x00\xea\x13\x00\x00\x10\x14\x00\x00\x27\x14\x00\x00\x4d\x14\x00\x00\x64\x14\x00\x00\x8a\x14\x00\x00\xa1\x14\x00\x00\xc7\x14\x00\x00\xef\x14\x00\x00\x38\x15\x00\x00\x4f\x15\x00\x00\x75\x15\x00\x00\x8c\x15\x00\x00\xb2\x15\x00\x00\xc9\x15\x00\x00\xef\x15\x00\x00\x06\x16\x00\x00\x2c\x16\x00\x00\x43\x16\x00\x00\x69\x16\x00\x00\x80\x16\x00\x00\xa6\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x00\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x58\x00\x00\x00\x59\x00\x00\x00\x9d\x00\x00\x00\x5a\x00\x00\x00\x8a\x00\x00\x00\x5c\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA# "\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x19\x00\x19\x00\x1a\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x21\x00\x21\x00\x22\x00\x24\x00\x25\x00\x26\x00\x2b\x00\x2b\x00\x3c\x00\x3c\x00\x4d\x00\x02\x00\x1f\x01\xbd\x00\x0f\x00\x28\x00\x26\x01\x27\x01\x6b\x00\x19\x01\x1a\x01\x24\x01\x22\x01\x41\x01\x1e\x01\xac\x00\x25\x01\x2c\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x36\x01\x42\x01\x29\x01\x2f\x01\x2b\x01\x35\x01\x38\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x1b\x01\x4d\x00\x1c\x01\x31\x01\x28\x00\x37\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x43\x01\x32\x01\x44\x01\x20\x01\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x08\x00\x03\x00\x2b\x00\xa5\x00\xa5\x00\xdd\x00\x2b\x00\xb2\x00\xb2\x00\xdd\x00\x08\x00\x03\x00\xec\x00\x02\x00\x23\x01\x30\x01\x39\x01\x45\x01\x02\x00\x3b\x00\x3a\x01\x3b\x01\x3f\x01\x08\x00\x40\x01\x11\x00\x2d\x01\x2a\x01\x2b\x00\x3b\x00\x38\x01\x1d\x01\x49\x00\x08\x00\x2b\x00\x11\x00\x09\x00\x03\x00\x2b\x00\x05\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x05\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x09\x00\x2b\x00\x11\x00\x09\x00\x03\x00\x48\x00\x2e\x01\x33\x01\x3c\x00\x3c\x00\x28\x01\x2c\x01\x08\x00\x03\x00\x21\x01\x3d\x01\x07\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x09\x00\x4c\x00\x11\x00\x00\x00\x3c\x01\x4c\x00\x37\x01\x00\x00\x5a\x00\x08\x00\x3c\x00\x11\x00\x09\x00\x03\x00\x3c\x00\x3c\x00\x07\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x09\x00\x30\x00\x11\x00\x0b\x00\x03\x00\x59\x00\x3e\x01\x3c\x00\x4d\x00\x4d\x00\x60\x00\x00\x00\x0b\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0b\x00\x5d\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x5d\x00\x2f\x00\x00\x00\x0b\x00\x4d\x00\x00\x00\x0e\x00\x03\x00\x4d\x00\x4d\x00\x60\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0e\x00\x00\x00\x00\x00\x0e\x00\x03\x00\x00\x00\x00\x00\x4d\x00\x34\x01\x00\x00\x00\x00\x00\x00\x0e\x00\x03\x00\x00\x00\x00\x00\x0d\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x3a\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x10\x00\x36\x00\x47\x00\x00\x00\x0d\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x10\x00\x39\x00\x4a\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x10\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\xad\x00\xad\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\xb0\x00\x60\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x60\x00\x34\x00\x58\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x5e\x00\x60\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x2b\x00\x2b\x00\xb0\x00\x34\x00\x00\x00\x5b\x00\x35\x00\x35\x00\x00\x00\x31\x00\x2b\x00\x2b\x00\x60\x00\x60\x00\x58\x00\x00\x00\x00\x00\x27\x00\x2e\x00\x00\x00\x00\x00\x5f\x00\x60\x00\x00\x00\x20\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x60\x00\x00\x00\xff\xff\x60\x00\x12\x00\xff\xff\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x60\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2b\x00\x2b\x00\x62\x00\x33\x00\x34\x00\x12\x00\x60\x00\x00\x00\x00\x00\x00\x00\x60\x00\xa5\x00\x34\x00\x00\x00\x00\x00\x60\x00\x00\x00\xa5\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\xff\xff\x2b\x00\x2b\x00\xff\xff\x60\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\xb2\x00\x34\x00\x12\x00\x12\x00\x2b\x00\x2b\x00\xb2\x00\x60\x00\xa5\x00\x00\x00\x00\x00\x12\x00\xbb\x00\x00\x00\xa5\x00\x12\x00\x34\x00\x12\x00\x00\x00\x12\x00\x8b\x00\x18\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x00\x00\x00\x00\x46\x01\x2a\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xc8\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xce\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xa6\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\xad\x00\xad\x00\x60\x00\x00\x00\xff\xff\x00\x00\x41\x00\xff\xff\x00\x00\x00\x00\x60\x00\x60\x00\x00\x00\xb0\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x60\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x2b\x00\x2b\x00\x61\x00\x60\x00\x3c\x00\x3c\x00\x00\x00\x40\x00\x3c\x00\x3c\x00\x00\x00\x45\x00\x60\x00\x45\x00\xb0\x00\x00\x00\x60\x00\x60\x00\x35\x00\x35\x00\x60\x00\x31\x00\x60\x00\x00\x00\x00\x00\x00\x00\x45\x00\x00\x00\x00\x00\xa6\x00\x2e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\xff\xff\x3c\x00\x3c\x00\xff\xff\x60\x00\x3c\x00\x3c\x00\x00\x00\x44\x00\xff\xff\x44\x00\xb0\x00\xff\xff\x60\x00\x8a\x00\x00\x00\x00\x00\x45\x00\x43\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\xa6\x00\x3f\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x63\x00\x3c\x00\x3c\x00\x00\x00\x60\x00\xb0\x00\x00\x00\x00\x00\x60\x00\x46\x00\x46\x00\xb0\x00\x42\x00\x45\x00\x00\x00\x00\x00\xff\xff\x45\x00\x43\x00\xff\xff\x00\x00\x3f\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3c\x00\x00\x00\x60\x00\x00\x00\x00\x00\xb0\x00\xc8\x00\xff\xff\x52\x00\x46\x00\x46\x00\x45\x00\x42\x00\x3c\x00\x3c\x00\x8a\x00\x60\x00\x60\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x60\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x00\x00\x4d\x00\x4d\x00\xff\xff\x51\x00\x60\x00\xff\xff\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x60\x00\x60\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x6c\x00\x00\x00\xff\xff\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x4d\x00\x4d\x00\x00\x00\x56\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x00\x00\x60\x00\x57\x00\x57\x00\x00\x00\x53\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x50\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xff\xff\x00\x00\xff\xff\xff\xff\x56\x00\xff\xff\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x60\x00\x00\x00\xa0\x00\x00\x00\xff\xff\x54\x00\x00\x00\xff\xff\x00\x00\xb9\x00\x60\x00\x00\x00\x00\x00\x00\x00\x50\x00\x55\x00\x70\x00\x00\x00\xff\xff\x56\x00\x4d\x00\x4d\x00\x9f\x00\x60\x00\x56\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x60\x00\x7b\x00\x57\x00\x57\x00\x00\x00\x53\x00\x00\x00\x4d\x00\x4d\x00\xb9\x00\x55\x00\x60\x00\x4d\x00\x4d\x00\x50\x00\x60\x00\x60\x00\x00\x00\x00\x00\x56\x00\x56\x00\xaf\x00\x00\x00\xaf\x00\x56\x00\x60\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x9f\x00\x00\x00\x79\x00\x4d\x00\x4d\x00\x00\x00\x60\x00\xff\xff\x4d\x00\x4d\x00\xff\xff\x60\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x60\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\xb8\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xcc\x00\x00\x00\xff\xff\x7b\x00\x00\x00\xff\xff\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\xff\xff\xff\xff\x61\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x62\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x00\x00\x00\x00\x7b\x00\x62\x00\x00\x00\x00\x00\xff\xff\x7b\x00\x8e\x00\xff\xff\xd9\x00\x00\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x8a\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x6e\x00\x8b\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x90\x00\x90\x00\x00\x00\x8e\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x61\x00\x90\x00\x90\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x00\x00\x00\x00\x9f\x00\xff\xff\x00\x00\x00\x00\xff\xff\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\xff\xff\x6f\x00\x90\x00\xff\xff\x00\x00\x00\x00\xa3\x00\xa3\x00\xff\xff\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\xff\xff\x00\x00\x8a\x00\xa3\x00\xa3\x00\xcc\x00\x00\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x69\x00\x00\x00\x00\x00\xff\xff\x00\x00\x69\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\xa0\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x00\x00\xd9\x00\xe4\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x69\x00\x00\x00\x00\x00\x6a\x00\x69\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\xff\xff\x00\x00\x00\x00\x69\x00\xff\xff\x69\x00\xe0\x00\x69\x00\x8e\x00\x6d\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\xff\xff\xbc\x00\xff\xff\xff\xff\x6f\x00\x00\x00\xbe\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\xfd\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\xfd\x00\x00\x00\xa0\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\xff\xff\x00\x00\xbc\x00\x00\x00\xcd\x00\x6e\x00\x00\x00\xbe\x00\xff\xff\xcf\x00\x00\x00\xff\xff\x00\x00\xc9\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x76\x00\x00\x00\x00\x00\xff\xff\x00\x00\x76\x00\xff\xff\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\xff\xff\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x76\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x9f\x00\x77\x00\xc9\x00\x00\x00\xda\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x76\x00\x00\x00\xfd\x00\x77\x00\x76\x00\xcd\x00\x00\x00\x00\x00\xff\xff\x00\x00\xcf\x00\xff\xff\x76\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x76\x00\xe0\x00\x76\x00\xda\x00\x7a\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xda\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x8e\x00\x7b\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\xee\x00\x00\x00\xee\x00\x7b\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x7b\x00\x8e\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x0b\x01\x00\x00\x0b\x01\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x7b\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7b\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x84\x00\xff\xff\x8e\x00\xff\xff\xff\xff\x84\x00\xff\xff\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\xee\x00\x00\x00\x84\x00\xff\xff\x84\x00\xff\xff\x00\x00\x8e\x00\x84\x00\x84\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x84\x00\x00\x00\x00\x00\x84\x00\x84\x00\x00\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x84\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x84\x00\x0b\x01\x84\x00\x0b\x01\x8c\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\xee\x00\x00\x00\x84\x00\x84\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x84\x00\x00\x00\x84\x00\x00\x00\x8d\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x85\x00\xff\xff\xff\xff\xff\xff\xff\xff\x85\x00\xff\xff\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\xee\x00\x90\x00\x85\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x85\x00\x00\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x85\x00\x00\x00\x00\x00\x00\x00\x85\x00\xa3\x00\x85\x00\x0b\x01\x85\x00\x0b\x01\x8f\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x90\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x90\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x90\x00\xa3\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x90\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x90\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x99\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x99\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x00\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x00\x00\xa3\x00\x99\x00\x99\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\xa2\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\xaa\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\xa4\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\xaa\x00\x00\x00\x00\x00\xab\x00\xab\x00\x00\x00\xaa\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\xae\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xaa\x00\xae\x00\xaa\x00\xab\x00\xab\x00\x00\x00\xaa\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xaa\x00\xaa\x00\x00\x00\xab\x00\xab\x00\x00\x00\xaa\x00\xaa\x00\xa6\x00\x00\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\xaa\x00\x00\x00\x00\x00\xab\x00\xab\x00\xb1\x00\xaa\x00\xb1\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb0\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\x00\x00\xb4\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xba\x00\xff\xff\xba\x00\xb9\x00\xff\xff\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xbc\x00\xff\xff\x00\x00\x00\x00\x00\x00\xbe\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\xc8\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\xc9\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\xbe\x00\x00\x00\x00\x00\xbe\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc7\x00\x00\x00\xff\xff\xbe\x00\x00\x00\xc7\x00\x00\x00\xbe\x00\x00\x00\xbe\x00\x00\x00\xbe\x00\x00\x00\xca\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xc7\x00\xff\xff\x00\x00\x00\x00\xc7\x00\xd9\x00\xc7\x00\xff\x00\xc7\x00\x00\x00\xcb\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xda\x00\xcf\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd9\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\xda\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\xcf\x00\x00\x00\x00\x00\xcf\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd8\x00\x00\x00\xff\xff\xcf\x00\x00\x00\xd8\x00\x00\x00\xcf\x00\x00\x00\xcf\x00\x00\x00\xcf\x00\x00\x00\xdb\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x0b\x01\xd8\x00\xff\x00\xd8\x00\x00\x00\xdc\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\x00\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\x00\x00\x00\x00\x00\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\x00\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\x00\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xee\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0b\x01\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xff\xff\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\xf8\x00\xff\x00\xf8\x00\x00\x00\xfe\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x00\x00\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x00\x00\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\xf1\x00\x0d\x01\xf1\x00\x00\x00\x0c\x01\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x00\x00\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x00\x00\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++alex_check :: AlexAddr+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x61\x00\x6d\x00\x67\x00\x61\x00\x72\x00\x0a\x00\x0a\x00\x74\x00\x6e\x00\x65\x00\x64\x00\x4c\x00\x6c\x00\x6c\x00\x4c\x00\x6c\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\x4c\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\x4c\x00\x5d\x00\x5e\x00\x5f\x00\x6c\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x55\x00\x69\x00\x6a\x00\x27\x00\x55\x00\x69\x00\x6a\x00\x27\x00\x09\x00\x0a\x00\x27\x00\x20\x00\x2d\x00\x3d\x00\x3d\x00\x2e\x00\x20\x00\x4c\x00\x3d\x00\x3d\x00\x3d\x00\x20\x00\x3d\x00\x22\x00\x3d\x00\x3e\x00\x55\x00\x6c\x00\x3d\x00\x3e\x00\x4c\x00\x20\x00\x75\x00\x22\x00\x09\x00\x0a\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x75\x00\x22\x00\x09\x00\x0a\x00\x6c\x00\x3d\x00\x26\x00\x55\x00\x55\x00\x3c\x00\x3d\x00\x09\x00\x0a\x00\x2b\x00\x3d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x4c\x00\x22\x00\xff\xff\x3d\x00\x6c\x00\x3d\x00\xff\xff\x4c\x00\x20\x00\x55\x00\x22\x00\x09\x00\x0a\x00\x75\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x4c\x00\x22\x00\x09\x00\x0a\x00\x6c\x00\x3d\x00\x75\x00\x55\x00\x55\x00\x55\x00\xff\xff\x09\x00\x0a\x00\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x4c\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6c\x00\x6c\x00\xff\xff\x20\x00\x55\x00\xff\xff\x09\x00\x0a\x00\x75\x00\x75\x00\x75\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x09\x00\x0a\x00\xff\xff\xff\xff\x75\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x09\x00\x0a\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x09\x00\x55\x00\x55\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x6c\x00\x6c\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x45\x00\x4c\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x55\x00\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x55\x00\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\xff\xff\x69\x00\x6a\x00\x65\x00\x6c\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x75\x00\xff\xff\xff\xff\x69\x00\x75\x00\xff\xff\xff\xff\x78\x00\x75\x00\xff\xff\x70\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\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\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\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\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\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\x22\x00\x4c\x00\xff\xff\x0a\x00\x4c\x00\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x69\x00\x6a\x00\x27\x00\x6c\x00\x55\x00\x45\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x46\x00\x75\x00\xff\xff\xff\xff\x75\x00\xff\xff\x4c\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x46\x00\x75\x00\x65\x00\x66\x00\x69\x00\x6a\x00\x4c\x00\x6c\x00\x66\x00\xff\xff\xff\xff\x6e\x00\x22\x00\xff\xff\x6c\x00\x72\x00\x75\x00\x74\x00\xff\xff\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x2e\x00\x24\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x22\x00\xff\xff\x24\x00\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\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x4c\x00\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\x45\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\x69\x00\x6a\x00\x27\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\x4c\x00\x65\x00\xff\xff\x75\x00\x4c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x2e\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x0a\x00\x4c\x00\x45\x00\x0d\x00\x75\x00\x5c\x00\xff\xff\xff\xff\x75\x00\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x65\x00\xff\xff\xff\xff\x4c\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x75\x00\xff\xff\xff\xff\x0a\x00\x55\x00\x4c\x00\x0d\x00\xff\xff\x75\x00\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\x65\x00\x5c\x00\x27\x00\x4c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x69\x00\x6a\x00\x5c\x00\x6c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x69\x00\x6a\x00\x0a\x00\x6c\x00\x4c\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x75\x00\x55\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x5c\x00\xff\xff\x0d\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\x4c\x00\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\xff\xff\x5c\x00\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\x50\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\x27\x00\xff\xff\x27\x00\x55\x00\x69\x00\x6a\x00\x5c\x00\x6c\x00\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x69\x00\x6a\x00\x70\x00\x6c\x00\x4c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x4c\x00\xff\xff\xff\xff\x75\x00\x55\x00\x2b\x00\xff\xff\x2d\x00\x75\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x75\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\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x22\x00\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\x0a\x00\x27\x00\x0d\x00\x0d\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\x27\x00\x27\x00\xff\xff\xff\xff\x0a\x00\x27\x00\x5c\x00\x0d\x00\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\x0a\x00\x0a\x00\x0d\x00\x0d\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x27\x00\x27\x00\xff\xff\x5c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\x27\x00\x27\x00\xff\xff\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\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\x5c\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x0a\x00\x27\x00\x27\x00\x0d\x00\xff\xff\xff\xff\x5c\x00\x5c\x00\x0a\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x27\x00\xff\xff\x5c\x00\x5c\x00\x5c\x00\x22\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x5c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x5c\x00\x55\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\x0d\x00\x0a\x00\x0d\x00\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\x27\x00\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x22\x00\x27\x00\x0d\x00\x27\x00\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0a\x00\xff\xff\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\xff\xff\x0d\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\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\x5c\x00\x45\x00\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x5c\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x5c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\x0a\x00\x5c\x00\x0a\x00\x0d\x00\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x22\x00\xff\xff\x3f\x00\x27\x00\x22\x00\x27\x00\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x5c\x00\x76\x00\x5c\x00\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x22\x00\xff\xff\x65\x00\x66\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\x27\x00\x0d\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x22\x00\x27\x00\x3f\x00\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x5c\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x22\x00\xff\xff\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x46\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x45\x00\x46\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\x65\x00\x66\x00\x46\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x4c\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x2b\x00\x6c\x00\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x65\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2b\x00\x0a\x00\x2d\x00\x70\x00\x0d\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\x22\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x22\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x27\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\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\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\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\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\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\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x22\x00\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\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_deflt :: AlexAddr+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x23\x00\x23\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\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x69\x00\xed\x00\xff\xff\xff\xff\xff\xff\xff\xff\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x76\x00\xed\x00\xff\xff\xff\xff\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\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\xf8\x00\xc7\x00\xbe\x00\xbe\x00\xc7\x00\xbe\x00\xc7\x00\xbe\x00\xc7\x00\xbe\x00\xc7\x00\xc7\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\xd8\x00\xcf\x00\xcf\x00\xd8\x00\xcf\x00\xd8\x00\xcf\x00\xd8\x00\xcf\x00\xd8\x00\xd8\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\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\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"#++alex_accept = listArray (0::Int,326) [[],[],[(AlexAccSkip)],[(AlexAcc (alex_action_1))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[],[],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_11))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_12))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_26))],[],[],[],[],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[],[],[],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_16))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_17))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_18))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_19))],[],[(AlexAcc (alex_action_20))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_25))],[(AlexAcc (alex_action_32))],[(AlexAcc (alex_action_27))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_29))],[(AlexAcc (alex_action_31))],[(AlexAcc (alex_action_30))],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_40))],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_43))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_44))],[(AlexAcc (alex_action_45))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_52))],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_63))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_65))],[(AlexAcc (alex_action_66))],[]]+{-# LINE 247 "src/Language/C/Parser/Lexer.x" #-}++-- We use the odd looking list of string patterns here rather than normal+-- string literals since GHC converts the latter into a sequence of string+-- comparisons (ie a linear search) but it translates the former using its+-- effecient pattern matching which gives us the expected radix-style search.+-- This gives change makes a significant performance difference.+--+idkwtok :: String -> Position -> P CToken+idkwtok ('a':'l':'i':'g':'n':'o':'f':[])         = tok CTokAlignof+idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':[])       = tok CTokAlignof+idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':'_':'_':[])     = tok CTokAlignof+idkwtok ('a':'s':'m':[])             = tok CTokAsm+idkwtok ('_':'_':'a':'s':'m':[])           = tok CTokAsm+idkwtok ('_':'_':'a':'s':'m':'_':'_':[])         = tok CTokAsm+idkwtok ('a':'u':'t':'o':[])             = tok CTokAuto+idkwtok ('b':'r':'e':'a':'k':[])           = tok CTokBreak+idkwtok ('_':'B':'o':'o':'l':[])           = tok CTokBool+idkwtok ('c':'a':'s':'e':[])             = tok CTokCase+idkwtok ('c':'h':'a':'r':[])             = tok CTokChar+idkwtok ('c':'o':'n':'s':'t':[])           = tok CTokConst+idkwtok ('_':'_':'c':'o':'n':'s':'t':[])         = tok CTokConst+idkwtok ('_':'_':'c':'o':'n':'s':'t':'_':'_':[])       = tok CTokConst+idkwtok ('c':'o':'n':'t':'i':'n':'u':'e':[])         = tok CTokContinue+idkwtok ('_':'C':'o':'m':'p':'l':'e':'x':[])         = tok CTokComplex+idkwtok ('_':'_':'c':'o':'m':'p':'l':'e':'x':'_':'_':[]) = tok CTokComplex+idkwtok ('d':'e':'f':'a':'u':'l':'t':[])         = tok CTokDefault+idkwtok ('d':'o':[])               = tok CTokDo+idkwtok ('d':'o':'u':'b':'l':'e':[])           = tok CTokDouble+idkwtok ('e':'l':'s':'e':[])             = tok CTokElse+idkwtok ('e':'n':'u':'m':[])             = tok CTokEnum+idkwtok ('e':'x':'t':'e':'r':'n':[])           = tok CTokExtern+idkwtok ('f':'l':'o':'a':'t':[])           = tok CTokFloat+idkwtok ('f':'o':'r':[])             = tok CTokFor+idkwtok ('g':'o':'t':'o':[])             = tok CTokGoto+idkwtok ('i':'f':[])               = tok CTokIf+idkwtok ('i':'n':'l':'i':'n':'e':[])           = tok CTokInline+idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':[])         = tok CTokInline+idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':'_':'_':[])       = tok CTokInline+idkwtok ('i':'n':'t':[])             = tok CTokInt+idkwtok ('l':'o':'n':'g':[])             = tok CTokLong+idkwtok ('r':'e':'g':'i':'s':'t':'e':'r':[])         = tok CTokRegister+idkwtok ('r':'e':'s':'t':'r':'i':'c':'t':[])         = tok CTokRestrict+idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':[])       = tok CTokRestrict+idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':'_':'_':[]) = tok CTokRestrict+idkwtok ('r':'e':'t':'u':'r':'n':[])           = tok CTokReturn+idkwtok ('s':'h':'o':'r':'t':[])           = tok CTokShort+idkwtok ('s':'i':'g':'n':'e':'d':[])           = tok CTokSigned+idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':[])         = tok CTokSigned+idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':'_':'_':[])       = tok CTokSigned+idkwtok ('s':'i':'z':'e':'o':'f':[])           = tok CTokSizeof+idkwtok ('s':'t':'a':'t':'i':'c':[])           = tok CTokStatic+idkwtok ('s':'t':'r':'u':'c':'t':[])           = tok CTokStruct+idkwtok ('s':'w':'i':'t':'c':'h':[])           = tok CTokSwitch+idkwtok ('t':'y':'p':'e':'d':'e':'f':[])         = tok CTokTypedef+idkwtok ('t':'y':'p':'e':'o':'f':[])           = tok CTokTypeof+idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':[])         = tok CTokTypeof+idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':'_':'_':[])       = tok CTokTypeof+idkwtok ('_':'_':'t':'h':'r':'e':'a':'d':[])         = tok CTokThread+idkwtok ('u':'n':'i':'o':'n':[])           = tok CTokUnion+idkwtok ('u':'n':'s':'i':'g':'n':'e':'d':[])         = tok CTokUnsigned+idkwtok ('v':'o':'i':'d':[])             = tok CTokVoid+idkwtok ('v':'o':'l':'a':'t':'i':'l':'e':[])         = tok CTokVolatile+idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':[])       = tok CTokVolatile+idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':'_':'_':[]) = tok CTokVolatile+idkwtok ('w':'h':'i':'l':'e':[])           = tok CTokWhile+idkwtok ('_':'_':'l':'a':'b':'e':'l':'_':'_':[])             = tok CTokLabel+idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':[]) = tok (CTokGnuC GnuCAttrTok)+idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':'_':'_':[]) = tok (CTokGnuC GnuCAttrTok)+idkwtok ('_':'_':'e':'x':'t':'e':'n':'s':'i':'o':'n':'_':'_':[]) = tok (CTokGnuC GnuCExtTok)+idkwtok ('_':'_':'r':'e':'a':'l':[])   = tok (CTokGnuC GnuCComplexReal)+idkwtok ('_':'_':'r':'e':'a':'l':'_':'_':[])   = tok (CTokGnuC GnuCComplexReal)+idkwtok ('_':'_':'i':'m':'a':'g':[])   = tok (CTokGnuC GnuCComplexImag)+idkwtok ('_':'_':'i':'m':'a':'g':'_':'_':[])   = tok (CTokGnuC GnuCComplexImag)+idkwtok ('_':'_':'b':'u':'i':'l':'t':'i':'n':'_':rest)+        | rest == "va_arg"             = tok (CTokGnuC GnuCVaArg)+        | rest == "offsetof"           = tok (CTokGnuC GnuCOffsetof)+        | rest == "types_compatible_p" = tok (CTokGnuC GnuCTyCompat)++idkwtok cs = \pos -> do+  name <- getNewName+  let ident = mkIdent pos cs name+  tyident <- isTypeIdent ident+  if tyident+    then return (CTokTyIdent pos ident)+    else return (CTokIdent   pos ident)++ignoreAttribute :: P ()+ignoreAttribute = skipTokens (0::Int)+  where skipTokens :: Int -> P ()+        skipTokens n = do+          tok <- lexToken+          case tok of+            CTokRParen _ | n == 1    -> return ()+                         | otherwise -> skipTokens (n-1)+            CTokLParen _             -> skipTokens (n+1)+            _                        -> skipTokens n++tok :: (Position -> CToken) -> Position -> P CToken+tok tc pos = return (tc pos)++adjustPos :: String -> Position -> Position+adjustPos str (Position fname row _) = Position fname' row' 0+    where+    str'            = dropWhite . drop 1 $ str+    (rowStr, str'') = span isDigit str'+    row'      = read rowStr+    str'''      = dropWhite str''+    fnameStr      = takeWhile (/= '"') . drop 1 $ str'''+    fname'      | null str''' || head str''' /= '"' = fname+     -- try and get more sharing of file name strings+     | fnameStr == fname     = fname+     | otherwise             = fnameStr+    --+    dropWhite = dropWhile (\c -> c == ' ' || c == '\t')++-- special utility for the lexer+unescapeMultiChars :: String -> [Char]+unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'+unescapeMultiChars ('\'' : []) = []+unescapeMultiChars _ = error "Unexpected end of multi-char constant"++{-# INLINE token_ #-}+-- token that ignores the string+token_ :: (Position -> CToken) -> Position -> Int -> InputStream -> P CToken+token_ tok pos _ _ = return (tok pos)++{-# INLINE token_fail #-}+-- error token+token_fail :: String -> Position ->+              Int -> InputStream -> P CToken+token_fail errmsg pos _ _ =   failP pos [ "Lexical Error !", errmsg ]+++{-# INLINE token #-}+-- token that uses the string+token :: (Position -> a -> CToken) -> (String -> a)+      -> Position -> Int -> InputStream -> P CToken+token tok read pos len str = return (tok pos (read $ takeChars len str))++{-# INLINE token_plus #-}+-- token that may fail+token_plus :: (Position -> a -> CToken) -> (String -> Either String a)+      -> Position -> Int -> InputStream -> P CToken+token_plus tok read pos len str =+  case read (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]+                                   Right ok -> return $! tok pos ok++-- -----------------------------------------------------------------------------+-- The input type++type AlexInput = (Position,   -- current position,+                  InputStream)     -- current input string++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar _ = error "alexInputPrevChar not used"++alexGetChar :: AlexInput -> Maybe (Char,AlexInput)+alexGetChar (p,is) | inputStreamEmpty is = Nothing+                   | otherwise  = let (c,s) = takeChar is in+                                  let p' = alexMove p c in p' `seq`+                                  Just (c, (p', s))++alexMove :: Position -> Char -> Position+alexMove (Position f l c) ' '  = Position f l (c+1)+alexMove (Position f l c) '\n' = Position f (l+1) 1+alexMove (Position f l c) '\t' = Position f l (((c+7) `div` 8)*8+1)+alexMove p                '\r' = p+alexMove (Position f l c) _    = Position f l     (c+1)++lexicalError :: P a+lexicalError = do+  pos <- getPos+  (c,cs) <- liftM takeChar getInput+  failP pos+        ["Lexical error !",+         "The character " ++ show c ++ " does not fit here."]++parseError :: P a+parseError = do+  tok <- getLastToken+  failP (posOf tok)+        ["Syntax error !",+         "The symbol `" ++ show tok ++ "' does not fit here."]++lexToken :: P CToken+lexToken = do+  pos <- getPos+  inp <- getInput+  case alexScan (pos, inp) 0 of+    AlexEOF -> return CTokEof+    AlexError inp' -> lexicalError+    AlexSkip  (pos', inp') len -> do+        setPos pos'+        setInput inp'+        lexToken+    AlexToken (pos', inp') len action -> do+        setPos pos'+        setInput inp'+        tok <- action pos len inp+        setLastToken tok+        return tok++lexC :: (CToken -> P a) -> P a+lexC cont = do+  tok <- lexToken+  cont tok++alex_action_1 = \pos len str -> setPos (adjustPos (takeChars len str) pos) >> lexToken +alex_action_4 = \pos len str -> idkwtok (takeChars len str) pos +alex_action_5 = token_plus CTokILit (readCInteger OctalRepr) +alex_action_6 = token_plus CTokILit (readCInteger DecRepr) +alex_action_7 = token_plus CTokILit (readCInteger HexRepr . drop 2) +alex_action_8 = token_fail "Invalid integer constant suffix" +alex_action_9 = token CTokCLit (cChar . fst . unescapeChar . tail) +alex_action_10 = token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) +alex_action_11 = token CTokCLit (flip cChars False . unescapeMultiChars .tail) +alex_action_12 = token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) +alex_action_13 = token CTokFLit readCFloat +alex_action_14 = token CTokFLit readCFloat +alex_action_15 = token_fail "Hexadecimal floating constant requires an exponent" +alex_action_16 = token CTokSLit (cString . unescapeString . init . tail) +alex_action_17 = token CTokSLit (cString_w . unescapeString . init . tail . tail) +alex_action_18 = token_fail "Universal character names are unsupported" +alex_action_19 = token_fail "Invalid escape sequence" +alex_action_20 = token_fail "Universal character names in string literals are unsupported"+alex_action_21 = token_ CTokLParen +alex_action_22 = token_ CTokRParen  +alex_action_23 = token_ CTokLBracket +alex_action_24 = token_ CTokRBracket +alex_action_25 = token_ CTokArrow +alex_action_26 = token_ CTokDot +alex_action_27 = token_ CTokExclam +alex_action_28 = token_ CTokTilde +alex_action_29 = token_ CTokInc +alex_action_30 = token_ CTokDec +alex_action_31 = token_ CTokPlus +alex_action_32 = token_ CTokMinus +alex_action_33 = token_ CTokStar +alex_action_34 = token_ CTokSlash +alex_action_35 = token_ CTokPercent +alex_action_36 = token_ CTokAmper +alex_action_37 = token_ CTokShiftL +alex_action_38 = token_ CTokShiftR +alex_action_39 = token_ CTokLess +alex_action_40 = token_ CTokLessEq +alex_action_41 = token_ CTokHigh +alex_action_42 = token_ CTokHighEq +alex_action_43 = token_ CTokEqual +alex_action_44 = token_ CTokUnequal +alex_action_45 = token_ CTokHat +alex_action_46 = token_ CTokBar +alex_action_47 = token_ CTokAnd +alex_action_48 = token_ CTokOr +alex_action_49 = token_ CTokQuest +alex_action_50 = token_ CTokColon +alex_action_51 = token_ CTokAssign +alex_action_52 = token_ CTokPlusAss +alex_action_53 = token_ CTokMinusAss +alex_action_54 = token_ CTokStarAss +alex_action_55 = token_ CTokSlashAss +alex_action_56 = token_ CTokPercAss +alex_action_57 = token_ CTokAmpAss +alex_action_58 = token_ CTokHatAss +alex_action_59 = token_ CTokBarAss +alex_action_60 = token_ CTokSLAss +alex_action_61 = token_ CTokSRAss +alex_action_62 = token_ CTokComma +alex_action_63 = token_ CTokSemic +alex_action_64 = token_ CTokLBrace +alex_action_65 = token_ CTokRBrace +alex_action_66 = token_ CTokEllipsis +{-# LINE 1 "GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command line>" #-}+{-# LINE 1 "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 35 "GenericTemplate.hs" #-}++{-# LINE 45 "GenericTemplate.hs" #-}+++data AlexAddr = AlexA# Addr#++#if __GLASGOW_HASKELL__ < 503+uncheckedShiftL# = shiftL#+#endif++{-# INLINE alexIndexInt16OffAddr #-}+alexIndexInt16OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+  narrow16Int# i+  where+	i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+	high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+	low  = int2Word# (ord# (indexCharOffAddr# arr off'))+	off' = off *# 2#+#else+  indexInt16OffAddr# arr off+#endif++++++{-# INLINE alexIndexInt32OffAddr #-}+alexIndexInt32OffAddr (AlexA# arr) off = +#ifdef WORDS_BIGENDIAN+  narrow32Int# i+  where+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`+		     (b2 `uncheckedShiftL#` 16#) `or#`+		     (b1 `uncheckedShiftL#` 8#) `or#` b0)+   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))+   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))+   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))+   off' = off *# 4#+#else+  indexInt32OffAddr# arr off+#endif++++++#if __GLASGOW_HASKELL__ < 503+quickIndex arr i = arr ! i+#else+-- GHC >= 503, unsafeAt is available from Data.Array.Base.+quickIndex = unsafeAt+#endif+++++-- -----------------------------------------------------------------------------+-- Main lexing routines++data AlexReturn a+  = AlexEOF+  | AlexError  !AlexInput+  | AlexSkip   !AlexInput !Int+  | AlexToken  !AlexInput !Int a++-- alexScan :: AlexInput -> StartCode -> AlexReturn a+alexScan input (I# (sc))+  = alexScanUser undefined input (I# (sc))++alexScanUser user input (I# (sc))+  = case alex_scan_tkn user input 0# input sc AlexNone of+	(AlexNone, input') ->+		case alexGetChar input of+			Nothing -> ++++				   AlexEOF+			Just _ ->++++				   AlexError input'++	(AlexLastSkip input len, _) ->++++		AlexSkip input len++	(AlexLastAcc k input len, _) ->++++		AlexToken input len k+++-- Push the input through the DFA, remembering the most recent accepting+-- state it encountered.++alex_scan_tkn user orig_input len input s last_acc =+  input `seq` -- strict in the input+  let +	new_acc = check_accs (alex_accept `quickIndex` (I# (s)))+  in+  new_acc `seq`+  case alexGetChar input of+     Nothing -> (new_acc, input)+     Just (c, new_input) -> ++++	let+		base   = alexIndexInt32OffAddr alex_base s+		(I# (ord_c)) = ord c+		offset = (base +# ord_c)+		check  = alexIndexInt16OffAddr alex_check offset+		+		new_s = if (offset >=# 0#) && (check ==# ord_c)+			  then alexIndexInt16OffAddr alex_table offset+			  else alexIndexInt16OffAddr alex_deflt s+	in+	case new_s of +	    -1# -> (new_acc, input)+		-- on an error, we want to keep the input *before* the+		-- character that failed, not after.+    	    _ -> alex_scan_tkn user orig_input (len +# 1#) +			new_input new_s new_acc++  where+	check_accs [] = last_acc+	check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))+	check_accs (AlexAccSkip : _)  = AlexLastSkip  input (I# (len))+	check_accs (AlexAccPred a pred : rest)+	   | pred user orig_input (I# (len)) input+	   = AlexLastAcc a input (I# (len))+	check_accs (AlexAccSkipPred pred : rest)+	   | pred user orig_input (I# (len)) input+	   = AlexLastSkip input (I# (len))+	check_accs (_ : rest) = check_accs rest++data AlexLastAcc a+  = AlexNone+  | AlexLastAcc a !AlexInput !Int+  | AlexLastSkip  !AlexInput !Int++data AlexAcc a user+  = AlexAcc a+  | AlexAccSkip+  | AlexAccPred a (AlexAccPred user)+  | AlexAccSkipPred (AlexAccPred user)++type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool++-- -----------------------------------------------------------------------------+-- Predicates on a rule++alexAndPred p1 p2 user in1 len in2+  = p1 user in1 len in2 && p2 user in1 len in2++--alexPrevCharIsPred :: Char -> AlexAccPred _ +alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input++--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ +alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input++--alexRightContext :: Int -> AlexAccPred _+alexRightContext (I# (sc)) user _ _ input = +     case alex_scan_tkn user input 0# input sc AlexNone of+	  (AlexNone, _) -> False+	  _ -> True+	-- TODO: there's no need to find the longest+	-- match when checking the right context, just+	-- the first match will do.++-- used by wrappers+iUnbox (I# (i)) = i
+ dist/build/Language/C/Parser/Parser.hs view
@@ -0,0 +1,6308 @@+{-# OPTIONS -fglasgow-exts -cpp #-}+module Language.C.Parser.Parser (parseC, ParseError(..)) where++-- Relevant C99 sections:+--+-- 6.5 Expressions .1 - .17 and 6.6 (almost literally)+--  Supported GNU extensions:+--     - Allow a compound statement as an expression+--     - Various __builtin_* forms that take type parameters+--     - `alignof' expression or type+--     - `__extension__' to suppress warnings about extensions+--     - Allow taking address of a label with: && label+--     - Omitting the `then' part of conditional expressions+--     - complex numbers+--+-- 6.7 C Declarations .1 -.8+--  Supported GNU extensions:+--     - '__thread' thread local storage (6.7.1)+--+-- 6.8 Statements .1 - .8+--  Supported GNU extensions:+--    - case ranges (C99 6.8.1)+--    - '__label__ ident;' declarations (C99 6.8.2)+--    - computed gotos (C99 6.8.6)+--+-- 6.9 Translation unit+--  Supported GNU extensions:+--     - allow empty translation_unit+--     - allow redundant ';'+--     - allow extension keyword before external declaration+--     - asm definitions+--+--  Since some of the grammar productions are quite difficult to read,+--  (especially those involved with the decleration syntax) we document them+--  with an extended syntax that allows a more consise representation:+--+--  Ordinary rules+--+--   foo      named terminal or non-terminal+--+--   'c'      terminal, literal character token+--+--   A B      concatenation+--+--   A | B    alternation+--+--   (A)      grouping+--+--  Extended rules+--+--   A?       optional, short hand for (A|) or [A]{ 0==A || 1==A }+--+--   ...      stands for some part of the grammar omitted for clarity+--+--   {A}      represents sequences, 0 or more.+--+--   <permute> modifier which states that any permutation of the immediate subterms is valid+--+--+--- TODO ----------------------------------------------------------------------+--+--  !* We ignore the C99 static keyword (see C99 6.7.5.3)+--  !* We do not distinguish in the AST between incomplete array types and+--      complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)+--  !* The AST doesn't allow recording __attribute__ of unnamed struct field+--     (see , struct_default_declaring_list, struct_identifier_declarator)+--  !* see `We're being far to liberal here' (... struct definition within structs)+--  * Documentation isn't complete and consistent yet.++import Prelude    hiding (reverse)+import qualified Data.List as List++import Language.C.Parser.Builtin   (builtinTypeNames)+import Language.C.Parser.Lexer     (lexC, parseError)+import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..))+import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef,+                                      enterScope, leaveScope, ParseError(..))++import Language.C.Data.RList+import Language.C.Data.InputStream+import Language.C.Data.Ident+import Language.C.Data.Name+import Language.C.Data.Node+import Language.C.Data.Position+import Language.C.Syntax+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+#else+import Array+#endif+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif++-- parser produced by Happy Version 1.16++newtype HappyAbsSyn  = HappyAbsSyn (() -> ())+happyIn6 :: (CTranslUnit) -> (HappyAbsSyn )+happyIn6 x = unsafeCoerce# x+{-# INLINE happyIn6 #-}+happyOut6 :: (HappyAbsSyn ) -> (CTranslUnit)+happyOut6 x = unsafeCoerce# x+{-# INLINE happyOut6 #-}+happyIn7 :: (Reversed [CExtDecl]) -> (HappyAbsSyn )+happyIn7 x = unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn ) -> (Reversed [CExtDecl])+happyOut7 x = unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: (CExtDecl) -> (HappyAbsSyn )+happyIn8 x = unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn ) -> (CExtDecl)+happyOut8 x = unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: (CFunDef) -> (HappyAbsSyn )+happyIn9 x = unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn ) -> (CFunDef)+happyOut9 x = unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: (CDeclr) -> (HappyAbsSyn )+happyIn10 x = unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn ) -> (CDeclr)+happyOut10 x = unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: (CStat) -> (HappyAbsSyn )+happyIn11 x = unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn ) -> (CStat)+happyOut11 x = unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: (CStat) -> (HappyAbsSyn )+happyIn12 x = unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn ) -> (CStat)+happyOut12 x = unsafeCoerce# x+{-# INLINE happyOut12 #-}+happyIn13 :: (CStat) -> (HappyAbsSyn )+happyIn13 x = unsafeCoerce# x+{-# INLINE happyIn13 #-}+happyOut13 :: (HappyAbsSyn ) -> (CStat)+happyOut13 x = unsafeCoerce# x+{-# INLINE happyOut13 #-}+happyIn14 :: (()) -> (HappyAbsSyn )+happyIn14 x = unsafeCoerce# x+{-# INLINE happyIn14 #-}+happyOut14 :: (HappyAbsSyn ) -> (())+happyOut14 x = unsafeCoerce# x+{-# INLINE happyOut14 #-}+happyIn15 :: (()) -> (HappyAbsSyn )+happyIn15 x = unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn ) -> (())+happyOut15 x = unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: (Reversed [CBlockItem]) -> (HappyAbsSyn )+happyIn16 x = unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn ) -> (Reversed [CBlockItem])+happyOut16 x = unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: (CBlockItem) -> (HappyAbsSyn )+happyIn17 x = unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn ) -> (CBlockItem)+happyOut17 x = unsafeCoerce# x+{-# INLINE happyOut17 #-}+happyIn18 :: (CBlockItem) -> (HappyAbsSyn )+happyIn18 x = unsafeCoerce# x+{-# INLINE happyIn18 #-}+happyOut18 :: (HappyAbsSyn ) -> (CBlockItem)+happyOut18 x = unsafeCoerce# x+{-# INLINE happyOut18 #-}+happyIn19 :: (CFunDef) -> (HappyAbsSyn )+happyIn19 x = unsafeCoerce# x+{-# INLINE happyIn19 #-}+happyOut19 :: (HappyAbsSyn ) -> (CFunDef)+happyOut19 x = unsafeCoerce# x+{-# INLINE happyOut19 #-}+happyIn20 :: (Reversed [Ident]) -> (HappyAbsSyn )+happyIn20 x = unsafeCoerce# x+{-# INLINE happyIn20 #-}+happyOut20 :: (HappyAbsSyn ) -> (Reversed [Ident])+happyOut20 x = unsafeCoerce# x+{-# INLINE happyOut20 #-}+happyIn21 :: (CStat) -> (HappyAbsSyn )+happyIn21 x = unsafeCoerce# x+{-# INLINE happyIn21 #-}+happyOut21 :: (HappyAbsSyn ) -> (CStat)+happyOut21 x = unsafeCoerce# x+{-# INLINE happyOut21 #-}+happyIn22 :: (CStat) -> (HappyAbsSyn )+happyIn22 x = unsafeCoerce# x+{-# INLINE happyIn22 #-}+happyOut22 :: (HappyAbsSyn ) -> (CStat)+happyOut22 x = unsafeCoerce# x+{-# INLINE happyOut22 #-}+happyIn23 :: (CStat) -> (HappyAbsSyn )+happyIn23 x = unsafeCoerce# x+{-# INLINE happyIn23 #-}+happyOut23 :: (HappyAbsSyn ) -> (CStat)+happyOut23 x = unsafeCoerce# x+{-# INLINE happyOut23 #-}+happyIn24 :: (CStat) -> (HappyAbsSyn )+happyIn24 x = unsafeCoerce# x+{-# INLINE happyIn24 #-}+happyOut24 :: (HappyAbsSyn ) -> (CStat)+happyOut24 x = unsafeCoerce# x+{-# INLINE happyOut24 #-}+happyIn25 :: (CAsmStmt) -> (HappyAbsSyn )+happyIn25 x = unsafeCoerce# x+{-# INLINE happyIn25 #-}+happyOut25 :: (HappyAbsSyn ) -> (CAsmStmt)+happyOut25 x = unsafeCoerce# x+{-# INLINE happyOut25 #-}+happyIn26 :: (Maybe CTypeQual) -> (HappyAbsSyn )+happyIn26 x = unsafeCoerce# x+{-# INLINE happyIn26 #-}+happyOut26 :: (HappyAbsSyn ) -> (Maybe CTypeQual)+happyOut26 x = unsafeCoerce# x+{-# INLINE happyOut26 #-}+happyIn27 :: ([CAsmOperand]) -> (HappyAbsSyn )+happyIn27 x = unsafeCoerce# x+{-# INLINE happyIn27 #-}+happyOut27 :: (HappyAbsSyn ) -> ([CAsmOperand])+happyOut27 x = unsafeCoerce# x+{-# INLINE happyOut27 #-}+happyIn28 :: (Reversed [CAsmOperand]) -> (HappyAbsSyn )+happyIn28 x = unsafeCoerce# x+{-# INLINE happyIn28 #-}+happyOut28 :: (HappyAbsSyn ) -> (Reversed [CAsmOperand])+happyOut28 x = unsafeCoerce# x+{-# INLINE happyOut28 #-}+happyIn29 :: (CAsmOperand) -> (HappyAbsSyn )+happyIn29 x = unsafeCoerce# x+{-# INLINE happyIn29 #-}+happyOut29 :: (HappyAbsSyn ) -> (CAsmOperand)+happyOut29 x = unsafeCoerce# x+{-# INLINE happyOut29 #-}+happyIn30 :: (Reversed [CStrLit]) -> (HappyAbsSyn )+happyIn30 x = unsafeCoerce# x+{-# INLINE happyIn30 #-}+happyOut30 :: (HappyAbsSyn ) -> (Reversed [CStrLit])+happyOut30 x = unsafeCoerce# x+{-# INLINE happyOut30 #-}+happyIn31 :: (CDecl) -> (HappyAbsSyn )+happyIn31 x = unsafeCoerce# x+{-# INLINE happyIn31 #-}+happyOut31 :: (HappyAbsSyn ) -> (CDecl)+happyOut31 x = unsafeCoerce# x+{-# INLINE happyOut31 #-}+happyIn32 :: (Reversed [CDecl]) -> (HappyAbsSyn )+happyIn32 x = unsafeCoerce# x+{-# INLINE happyIn32 #-}+happyOut32 :: (HappyAbsSyn ) -> (Reversed [CDecl])+happyOut32 x = unsafeCoerce# x+{-# INLINE happyOut32 #-}+happyIn33 :: (CDecl) -> (HappyAbsSyn )+happyIn33 x = unsafeCoerce# x+{-# INLINE happyIn33 #-}+happyOut33 :: (HappyAbsSyn ) -> (CDecl)+happyOut33 x = unsafeCoerce# x+{-# INLINE happyOut33 #-}+happyIn34 :: ((Maybe CStrLit, [CAttr])) -> (HappyAbsSyn )+happyIn34 x = unsafeCoerce# x+{-# INLINE happyIn34 #-}+happyOut34 :: (HappyAbsSyn ) -> ((Maybe CStrLit, [CAttr]))+happyOut34 x = unsafeCoerce# x+{-# INLINE happyOut34 #-}+happyIn35 :: (CDecl) -> (HappyAbsSyn )+happyIn35 x = unsafeCoerce# x+{-# INLINE happyIn35 #-}+happyOut35 :: (HappyAbsSyn ) -> (CDecl)+happyOut35 x = unsafeCoerce# x+{-# INLINE happyOut35 #-}+happyIn36 :: ([CDeclSpec]) -> (HappyAbsSyn )+happyIn36 x = unsafeCoerce# x+{-# INLINE happyIn36 #-}+happyOut36 :: (HappyAbsSyn ) -> ([CDeclSpec])+happyOut36 x = unsafeCoerce# x+{-# INLINE happyOut36 #-}+happyIn37 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn37 x = unsafeCoerce# x+{-# INLINE happyIn37 #-}+happyOut37 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut37 x = unsafeCoerce# x+{-# INLINE happyOut37 #-}+happyIn38 :: (CDeclSpec) -> (HappyAbsSyn )+happyIn38 x = unsafeCoerce# x+{-# INLINE happyIn38 #-}+happyOut38 :: (HappyAbsSyn ) -> (CDeclSpec)+happyOut38 x = unsafeCoerce# x+{-# INLINE happyOut38 #-}+happyIn39 :: (CStorageSpec) -> (HappyAbsSyn )+happyIn39 x = unsafeCoerce# x+{-# INLINE happyIn39 #-}+happyOut39 :: (HappyAbsSyn ) -> (CStorageSpec)+happyOut39 x = unsafeCoerce# x+{-# INLINE happyOut39 #-}+happyIn40 :: ([CDeclSpec]) -> (HappyAbsSyn )+happyIn40 x = unsafeCoerce# x+{-# INLINE happyIn40 #-}+happyOut40 :: (HappyAbsSyn ) -> ([CDeclSpec])+happyOut40 x = unsafeCoerce# x+{-# INLINE happyOut40 #-}+happyIn41 :: (CTypeSpec) -> (HappyAbsSyn )+happyIn41 x = unsafeCoerce# x+{-# INLINE happyIn41 #-}+happyOut41 :: (HappyAbsSyn ) -> (CTypeSpec)+happyOut41 x = unsafeCoerce# x+{-# INLINE happyOut41 #-}+happyIn42 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn42 x = unsafeCoerce# x+{-# INLINE happyIn42 #-}+happyOut42 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut42 x = unsafeCoerce# x+{-# INLINE happyOut42 #-}+happyIn43 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn43 x = unsafeCoerce# x+{-# INLINE happyIn43 #-}+happyOut43 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut43 x = unsafeCoerce# x+{-# INLINE happyOut43 #-}+happyIn44 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn44 x = unsafeCoerce# x+{-# INLINE happyIn44 #-}+happyOut44 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut44 x = unsafeCoerce# x+{-# INLINE happyOut44 #-}+happyIn45 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn45 x = unsafeCoerce# x+{-# INLINE happyIn45 #-}+happyOut45 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut45 x = unsafeCoerce# x+{-# INLINE happyOut45 #-}+happyIn46 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn46 x = unsafeCoerce# x+{-# INLINE happyIn46 #-}+happyOut46 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut46 x = unsafeCoerce# x+{-# INLINE happyOut46 #-}+happyIn47 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn47 x = unsafeCoerce# x+{-# INLINE happyIn47 #-}+happyOut47 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut47 x = unsafeCoerce# x+{-# INLINE happyOut47 #-}+happyIn48 :: (CTypeSpec) -> (HappyAbsSyn )+happyIn48 x = unsafeCoerce# x+{-# INLINE happyIn48 #-}+happyOut48 :: (HappyAbsSyn ) -> (CTypeSpec)+happyOut48 x = unsafeCoerce# x+{-# INLINE happyOut48 #-}+happyIn49 :: (CStructUnion) -> (HappyAbsSyn )+happyIn49 x = unsafeCoerce# x+{-# INLINE happyIn49 #-}+happyOut49 :: (HappyAbsSyn ) -> (CStructUnion)+happyOut49 x = unsafeCoerce# x+{-# INLINE happyOut49 #-}+happyIn50 :: (Located CStructTag) -> (HappyAbsSyn )+happyIn50 x = unsafeCoerce# x+{-# INLINE happyIn50 #-}+happyOut50 :: (HappyAbsSyn ) -> (Located CStructTag)+happyOut50 x = unsafeCoerce# x+{-# INLINE happyOut50 #-}+happyIn51 :: (Reversed [CDecl]) -> (HappyAbsSyn )+happyIn51 x = unsafeCoerce# x+{-# INLINE happyIn51 #-}+happyOut51 :: (HappyAbsSyn ) -> (Reversed [CDecl])+happyOut51 x = unsafeCoerce# x+{-# INLINE happyOut51 #-}+happyIn52 :: (CDecl) -> (HappyAbsSyn )+happyIn52 x = unsafeCoerce# x+{-# INLINE happyIn52 #-}+happyOut52 :: (HappyAbsSyn ) -> (CDecl)+happyOut52 x = unsafeCoerce# x+{-# INLINE happyOut52 #-}+happyIn53 :: (CDecl) -> (HappyAbsSyn )+happyIn53 x = unsafeCoerce# x+{-# INLINE happyIn53 #-}+happyOut53 :: (HappyAbsSyn ) -> (CDecl)+happyOut53 x = unsafeCoerce# x+{-# INLINE happyOut53 #-}+happyIn54 :: (CDecl) -> (HappyAbsSyn )+happyIn54 x = unsafeCoerce# x+{-# INLINE happyIn54 #-}+happyOut54 :: (HappyAbsSyn ) -> (CDecl)+happyOut54 x = unsafeCoerce# x+{-# INLINE happyOut54 #-}+happyIn55 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )+happyIn55 x = unsafeCoerce# x+{-# INLINE happyIn55 #-}+happyOut55 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))+happyOut55 x = unsafeCoerce# x+{-# INLINE happyOut55 #-}+happyIn56 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )+happyIn56 x = unsafeCoerce# x+{-# INLINE happyIn56 #-}+happyOut56 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))+happyOut56 x = unsafeCoerce# x+{-# INLINE happyOut56 #-}+happyIn57 :: (CEnum) -> (HappyAbsSyn )+happyIn57 x = unsafeCoerce# x+{-# INLINE happyIn57 #-}+happyOut57 :: (HappyAbsSyn ) -> (CEnum)+happyOut57 x = unsafeCoerce# x+{-# INLINE happyOut57 #-}+happyIn58 :: (Reversed [(Ident, Maybe CExpr)]) -> (HappyAbsSyn )+happyIn58 x = unsafeCoerce# x+{-# INLINE happyIn58 #-}+happyOut58 :: (HappyAbsSyn ) -> (Reversed [(Ident, Maybe CExpr)])+happyOut58 x = unsafeCoerce# x+{-# INLINE happyOut58 #-}+happyIn59 :: ((Ident, Maybe CExpr)) -> (HappyAbsSyn )+happyIn59 x = unsafeCoerce# x+{-# INLINE happyIn59 #-}+happyOut59 :: (HappyAbsSyn ) -> ((Ident, Maybe CExpr))+happyOut59 x = unsafeCoerce# x+{-# INLINE happyOut59 #-}+happyIn60 :: (CTypeQual) -> (HappyAbsSyn )+happyIn60 x = unsafeCoerce# x+{-# INLINE happyIn60 #-}+happyOut60 :: (HappyAbsSyn ) -> (CTypeQual)+happyOut60 x = unsafeCoerce# x+{-# INLINE happyOut60 #-}+happyIn61 :: (Reversed [CTypeQual]) -> (HappyAbsSyn )+happyIn61 x = unsafeCoerce# x+{-# INLINE happyIn61 #-}+happyOut61 :: (HappyAbsSyn ) -> (Reversed [CTypeQual])+happyOut61 x = unsafeCoerce# x+{-# INLINE happyOut61 #-}+happyIn62 :: (CDeclrR) -> (HappyAbsSyn )+happyIn62 x = unsafeCoerce# x+{-# INLINE happyIn62 #-}+happyOut62 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut62 x = unsafeCoerce# x+{-# INLINE happyOut62 #-}+happyIn63 :: (Maybe CStrLit) -> (HappyAbsSyn )+happyIn63 x = unsafeCoerce# x+{-# INLINE happyIn63 #-}+happyOut63 :: (HappyAbsSyn ) -> (Maybe CStrLit)+happyOut63 x = unsafeCoerce# x+{-# INLINE happyOut63 #-}+happyIn64 :: (CDeclrR) -> (HappyAbsSyn )+happyIn64 x = unsafeCoerce# x+{-# INLINE happyIn64 #-}+happyOut64 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut64 x = unsafeCoerce# x+{-# INLINE happyOut64 #-}+happyIn65 :: (CDeclrR) -> (HappyAbsSyn )+happyIn65 x = unsafeCoerce# x+{-# INLINE happyIn65 #-}+happyOut65 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut65 x = unsafeCoerce# x+{-# INLINE happyOut65 #-}+happyIn66 :: (CDeclrR) -> (HappyAbsSyn )+happyIn66 x = unsafeCoerce# x+{-# INLINE happyIn66 #-}+happyOut66 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut66 x = unsafeCoerce# x+{-# INLINE happyOut66 #-}+happyIn67 :: (CDeclrR) -> (HappyAbsSyn )+happyIn67 x = unsafeCoerce# x+{-# INLINE happyIn67 #-}+happyOut67 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut67 x = unsafeCoerce# x+{-# INLINE happyOut67 #-}+happyIn68 :: (CDeclrR) -> (HappyAbsSyn )+happyIn68 x = unsafeCoerce# x+{-# INLINE happyIn68 #-}+happyOut68 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut68 x = unsafeCoerce# x+{-# INLINE happyOut68 #-}+happyIn69 :: (CDeclrR) -> (HappyAbsSyn )+happyIn69 x = unsafeCoerce# x+{-# INLINE happyIn69 #-}+happyOut69 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut69 x = unsafeCoerce# x+{-# INLINE happyOut69 #-}+happyIn70 :: (CDeclrR) -> (HappyAbsSyn )+happyIn70 x = unsafeCoerce# x+{-# INLINE happyIn70 #-}+happyOut70 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut70 x = unsafeCoerce# x+{-# INLINE happyOut70 #-}+happyIn71 :: (CDeclrR) -> (HappyAbsSyn )+happyIn71 x = unsafeCoerce# x+{-# INLINE happyIn71 #-}+happyOut71 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut71 x = unsafeCoerce# x+{-# INLINE happyOut71 #-}+happyIn72 :: (CDeclrR) -> (HappyAbsSyn )+happyIn72 x = unsafeCoerce# x+{-# INLINE happyIn72 #-}+happyOut72 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut72 x = unsafeCoerce# x+{-# INLINE happyOut72 #-}+happyIn73 :: (CDeclrR) -> (HappyAbsSyn )+happyIn73 x = unsafeCoerce# x+{-# INLINE happyIn73 #-}+happyOut73 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut73 x = unsafeCoerce# x+{-# INLINE happyOut73 #-}+happyIn74 :: (CDeclrR) -> (HappyAbsSyn )+happyIn74 x = unsafeCoerce# x+{-# INLINE happyIn74 #-}+happyOut74 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut74 x = unsafeCoerce# x+{-# INLINE happyOut74 #-}+happyIn75 :: (CDeclr) -> (HappyAbsSyn )+happyIn75 x = unsafeCoerce# x+{-# INLINE happyIn75 #-}+happyOut75 :: (HappyAbsSyn ) -> (CDeclr)+happyOut75 x = unsafeCoerce# x+{-# INLINE happyOut75 #-}+happyIn76 :: (CDeclrR) -> (HappyAbsSyn )+happyIn76 x = unsafeCoerce# x+{-# INLINE happyIn76 #-}+happyOut76 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut76 x = unsafeCoerce# x+{-# INLINE happyOut76 #-}+happyIn77 :: (CDeclrR) -> (HappyAbsSyn )+happyIn77 x = unsafeCoerce# x+{-# INLINE happyIn77 #-}+happyOut77 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut77 x = unsafeCoerce# x+{-# INLINE happyOut77 #-}+happyIn78 :: (([CDecl], Bool)) -> (HappyAbsSyn )+happyIn78 x = unsafeCoerce# x+{-# INLINE happyIn78 #-}+happyOut78 :: (HappyAbsSyn ) -> (([CDecl], Bool))+happyOut78 x = unsafeCoerce# x+{-# INLINE happyOut78 #-}+happyIn79 :: (Reversed [CDecl]) -> (HappyAbsSyn )+happyIn79 x = unsafeCoerce# x+{-# INLINE happyIn79 #-}+happyOut79 :: (HappyAbsSyn ) -> (Reversed [CDecl])+happyOut79 x = unsafeCoerce# x+{-# INLINE happyOut79 #-}+happyIn80 :: (CDecl) -> (HappyAbsSyn )+happyIn80 x = unsafeCoerce# x+{-# INLINE happyIn80 #-}+happyOut80 :: (HappyAbsSyn ) -> (CDecl)+happyOut80 x = unsafeCoerce# x+{-# INLINE happyOut80 #-}+happyIn81 :: (Reversed [Ident]) -> (HappyAbsSyn )+happyIn81 x = unsafeCoerce# x+{-# INLINE happyIn81 #-}+happyOut81 :: (HappyAbsSyn ) -> (Reversed [Ident])+happyOut81 x = unsafeCoerce# x+{-# INLINE happyOut81 #-}+happyIn82 :: (CDecl) -> (HappyAbsSyn )+happyIn82 x = unsafeCoerce# x+{-# INLINE happyIn82 #-}+happyOut82 :: (HappyAbsSyn ) -> (CDecl)+happyOut82 x = unsafeCoerce# x+{-# INLINE happyOut82 #-}+happyIn83 :: (CDeclrR) -> (HappyAbsSyn )+happyIn83 x = unsafeCoerce# x+{-# INLINE happyIn83 #-}+happyOut83 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut83 x = unsafeCoerce# x+{-# INLINE happyOut83 #-}+happyIn84 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )+happyIn84 x = unsafeCoerce# x+{-# INLINE happyIn84 #-}+happyOut84 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)+happyOut84 x = unsafeCoerce# x+{-# INLINE happyOut84 #-}+happyIn85 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )+happyIn85 x = unsafeCoerce# x+{-# INLINE happyIn85 #-}+happyOut85 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)+happyOut85 x = unsafeCoerce# x+{-# INLINE happyOut85 #-}+happyIn86 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )+happyIn86 x = unsafeCoerce# x+{-# INLINE happyIn86 #-}+happyOut86 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)+happyOut86 x = unsafeCoerce# x+{-# INLINE happyOut86 #-}+happyIn87 :: (CDeclrR) -> (HappyAbsSyn )+happyIn87 x = unsafeCoerce# x+{-# INLINE happyIn87 #-}+happyOut87 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut87 x = unsafeCoerce# x+{-# INLINE happyOut87 #-}+happyIn88 :: (CDeclrR) -> (HappyAbsSyn )+happyIn88 x = unsafeCoerce# x+{-# INLINE happyIn88 #-}+happyOut88 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut88 x = unsafeCoerce# x+{-# INLINE happyOut88 #-}+happyIn89 :: (CInit) -> (HappyAbsSyn )+happyIn89 x = unsafeCoerce# x+{-# INLINE happyIn89 #-}+happyOut89 :: (HappyAbsSyn ) -> (CInit)+happyOut89 x = unsafeCoerce# x+{-# INLINE happyOut89 #-}+happyIn90 :: (Maybe CInit) -> (HappyAbsSyn )+happyIn90 x = unsafeCoerce# x+{-# INLINE happyIn90 #-}+happyOut90 :: (HappyAbsSyn ) -> (Maybe CInit)+happyOut90 x = unsafeCoerce# x+{-# INLINE happyOut90 #-}+happyIn91 :: (Reversed CInitList) -> (HappyAbsSyn )+happyIn91 x = unsafeCoerce# x+{-# INLINE happyIn91 #-}+happyOut91 :: (HappyAbsSyn ) -> (Reversed CInitList)+happyOut91 x = unsafeCoerce# x+{-# INLINE happyOut91 #-}+happyIn92 :: ([CDesignator]) -> (HappyAbsSyn )+happyIn92 x = unsafeCoerce# x+{-# INLINE happyIn92 #-}+happyOut92 :: (HappyAbsSyn ) -> ([CDesignator])+happyOut92 x = unsafeCoerce# x+{-# INLINE happyOut92 #-}+happyIn93 :: (Reversed [CDesignator]) -> (HappyAbsSyn )+happyIn93 x = unsafeCoerce# x+{-# INLINE happyIn93 #-}+happyOut93 :: (HappyAbsSyn ) -> (Reversed [CDesignator])+happyOut93 x = unsafeCoerce# x+{-# INLINE happyOut93 #-}+happyIn94 :: (CDesignator) -> (HappyAbsSyn )+happyIn94 x = unsafeCoerce# x+{-# INLINE happyIn94 #-}+happyOut94 :: (HappyAbsSyn ) -> (CDesignator)+happyOut94 x = unsafeCoerce# x+{-# INLINE happyOut94 #-}+happyIn95 :: (CDesignator) -> (HappyAbsSyn )+happyIn95 x = unsafeCoerce# x+{-# INLINE happyIn95 #-}+happyOut95 :: (HappyAbsSyn ) -> (CDesignator)+happyOut95 x = unsafeCoerce# x+{-# INLINE happyOut95 #-}+happyIn96 :: (CExpr) -> (HappyAbsSyn )+happyIn96 x = unsafeCoerce# x+{-# INLINE happyIn96 #-}+happyOut96 :: (HappyAbsSyn ) -> (CExpr)+happyOut96 x = unsafeCoerce# x+{-# INLINE happyOut96 #-}+happyIn97 :: (Reversed [CDesignator]) -> (HappyAbsSyn )+happyIn97 x = unsafeCoerce# x+{-# INLINE happyIn97 #-}+happyOut97 :: (HappyAbsSyn ) -> (Reversed [CDesignator])+happyOut97 x = unsafeCoerce# x+{-# INLINE happyOut97 #-}+happyIn98 :: (CExpr) -> (HappyAbsSyn )+happyIn98 x = unsafeCoerce# x+{-# INLINE happyIn98 #-}+happyOut98 :: (HappyAbsSyn ) -> (CExpr)+happyOut98 x = unsafeCoerce# x+{-# INLINE happyOut98 #-}+happyIn99 :: (Reversed [CExpr]) -> (HappyAbsSyn )+happyIn99 x = unsafeCoerce# x+{-# INLINE happyIn99 #-}+happyOut99 :: (HappyAbsSyn ) -> (Reversed [CExpr])+happyOut99 x = unsafeCoerce# x+{-# INLINE happyOut99 #-}+happyIn100 :: (CExpr) -> (HappyAbsSyn )+happyIn100 x = unsafeCoerce# x+{-# INLINE happyIn100 #-}+happyOut100 :: (HappyAbsSyn ) -> (CExpr)+happyOut100 x = unsafeCoerce# x+{-# INLINE happyOut100 #-}+happyIn101 :: (Located CUnaryOp) -> (HappyAbsSyn )+happyIn101 x = unsafeCoerce# x+{-# INLINE happyIn101 #-}+happyOut101 :: (HappyAbsSyn ) -> (Located CUnaryOp)+happyOut101 x = unsafeCoerce# x+{-# INLINE happyOut101 #-}+happyIn102 :: (CExpr) -> (HappyAbsSyn )+happyIn102 x = unsafeCoerce# x+{-# INLINE happyIn102 #-}+happyOut102 :: (HappyAbsSyn ) -> (CExpr)+happyOut102 x = unsafeCoerce# x+{-# INLINE happyOut102 #-}+happyIn103 :: (CExpr) -> (HappyAbsSyn )+happyIn103 x = unsafeCoerce# x+{-# INLINE happyIn103 #-}+happyOut103 :: (HappyAbsSyn ) -> (CExpr)+happyOut103 x = unsafeCoerce# x+{-# INLINE happyOut103 #-}+happyIn104 :: (CExpr) -> (HappyAbsSyn )+happyIn104 x = unsafeCoerce# x+{-# INLINE happyIn104 #-}+happyOut104 :: (HappyAbsSyn ) -> (CExpr)+happyOut104 x = unsafeCoerce# x+{-# INLINE happyOut104 #-}+happyIn105 :: (CExpr) -> (HappyAbsSyn )+happyIn105 x = unsafeCoerce# x+{-# INLINE happyIn105 #-}+happyOut105 :: (HappyAbsSyn ) -> (CExpr)+happyOut105 x = unsafeCoerce# x+{-# INLINE happyOut105 #-}+happyIn106 :: (CExpr) -> (HappyAbsSyn )+happyIn106 x = unsafeCoerce# x+{-# INLINE happyIn106 #-}+happyOut106 :: (HappyAbsSyn ) -> (CExpr)+happyOut106 x = unsafeCoerce# x+{-# INLINE happyOut106 #-}+happyIn107 :: (CExpr) -> (HappyAbsSyn )+happyIn107 x = unsafeCoerce# x+{-# INLINE happyIn107 #-}+happyOut107 :: (HappyAbsSyn ) -> (CExpr)+happyOut107 x = unsafeCoerce# x+{-# INLINE happyOut107 #-}+happyIn108 :: (CExpr) -> (HappyAbsSyn )+happyIn108 x = unsafeCoerce# x+{-# INLINE happyIn108 #-}+happyOut108 :: (HappyAbsSyn ) -> (CExpr)+happyOut108 x = unsafeCoerce# x+{-# INLINE happyOut108 #-}+happyIn109 :: (CExpr) -> (HappyAbsSyn )+happyIn109 x = unsafeCoerce# x+{-# INLINE happyIn109 #-}+happyOut109 :: (HappyAbsSyn ) -> (CExpr)+happyOut109 x = unsafeCoerce# x+{-# INLINE happyOut109 #-}+happyIn110 :: (CExpr) -> (HappyAbsSyn )+happyIn110 x = unsafeCoerce# x+{-# INLINE happyIn110 #-}+happyOut110 :: (HappyAbsSyn ) -> (CExpr)+happyOut110 x = unsafeCoerce# x+{-# INLINE happyOut110 #-}+happyIn111 :: (CExpr) -> (HappyAbsSyn )+happyIn111 x = unsafeCoerce# x+{-# INLINE happyIn111 #-}+happyOut111 :: (HappyAbsSyn ) -> (CExpr)+happyOut111 x = unsafeCoerce# x+{-# INLINE happyOut111 #-}+happyIn112 :: (CExpr) -> (HappyAbsSyn )+happyIn112 x = unsafeCoerce# x+{-# INLINE happyIn112 #-}+happyOut112 :: (HappyAbsSyn ) -> (CExpr)+happyOut112 x = unsafeCoerce# x+{-# INLINE happyOut112 #-}+happyIn113 :: (CExpr) -> (HappyAbsSyn )+happyIn113 x = unsafeCoerce# x+{-# INLINE happyIn113 #-}+happyOut113 :: (HappyAbsSyn ) -> (CExpr)+happyOut113 x = unsafeCoerce# x+{-# INLINE happyOut113 #-}+happyIn114 :: (CExpr) -> (HappyAbsSyn )+happyIn114 x = unsafeCoerce# x+{-# INLINE happyIn114 #-}+happyOut114 :: (HappyAbsSyn ) -> (CExpr)+happyOut114 x = unsafeCoerce# x+{-# INLINE happyOut114 #-}+happyIn115 :: (Located CAssignOp) -> (HappyAbsSyn )+happyIn115 x = unsafeCoerce# x+{-# INLINE happyIn115 #-}+happyOut115 :: (HappyAbsSyn ) -> (Located CAssignOp)+happyOut115 x = unsafeCoerce# x+{-# INLINE happyOut115 #-}+happyIn116 :: (CExpr) -> (HappyAbsSyn )+happyIn116 x = unsafeCoerce# x+{-# INLINE happyIn116 #-}+happyOut116 :: (HappyAbsSyn ) -> (CExpr)+happyOut116 x = unsafeCoerce# x+{-# INLINE happyOut116 #-}+happyIn117 :: (Reversed [CExpr]) -> (HappyAbsSyn )+happyIn117 x = unsafeCoerce# x+{-# INLINE happyIn117 #-}+happyOut117 :: (HappyAbsSyn ) -> (Reversed [CExpr])+happyOut117 x = unsafeCoerce# x+{-# INLINE happyOut117 #-}+happyIn118 :: (Maybe CExpr) -> (HappyAbsSyn )+happyIn118 x = unsafeCoerce# x+{-# INLINE happyIn118 #-}+happyOut118 :: (HappyAbsSyn ) -> (Maybe CExpr)+happyOut118 x = unsafeCoerce# x+{-# INLINE happyOut118 #-}+happyIn119 :: (Maybe CExpr) -> (HappyAbsSyn )+happyIn119 x = unsafeCoerce# x+{-# INLINE happyIn119 #-}+happyOut119 :: (HappyAbsSyn ) -> (Maybe CExpr)+happyOut119 x = unsafeCoerce# x+{-# INLINE happyOut119 #-}+happyIn120 :: (CExpr) -> (HappyAbsSyn )+happyIn120 x = unsafeCoerce# x+{-# INLINE happyIn120 #-}+happyOut120 :: (HappyAbsSyn ) -> (CExpr)+happyOut120 x = unsafeCoerce# x+{-# INLINE happyOut120 #-}+happyIn121 :: (CConst) -> (HappyAbsSyn )+happyIn121 x = unsafeCoerce# x+{-# INLINE happyIn121 #-}+happyOut121 :: (HappyAbsSyn ) -> (CConst)+happyOut121 x = unsafeCoerce# x+{-# INLINE happyOut121 #-}+happyIn122 :: (CStrLit) -> (HappyAbsSyn )+happyIn122 x = unsafeCoerce# x+{-# INLINE happyIn122 #-}+happyOut122 :: (HappyAbsSyn ) -> (CStrLit)+happyOut122 x = unsafeCoerce# x+{-# INLINE happyOut122 #-}+happyIn123 :: (Reversed [CString]) -> (HappyAbsSyn )+happyIn123 x = unsafeCoerce# x+{-# INLINE happyIn123 #-}+happyOut123 :: (HappyAbsSyn ) -> (Reversed [CString])+happyOut123 x = unsafeCoerce# x+{-# INLINE happyOut123 #-}+happyIn124 :: (Ident) -> (HappyAbsSyn )+happyIn124 x = unsafeCoerce# x+{-# INLINE happyIn124 #-}+happyOut124 :: (HappyAbsSyn ) -> (Ident)+happyOut124 x = unsafeCoerce# x+{-# INLINE happyOut124 #-}+happyIn125 :: ([CAttr]) -> (HappyAbsSyn )+happyIn125 x = unsafeCoerce# x+{-# INLINE happyIn125 #-}+happyOut125 :: (HappyAbsSyn ) -> ([CAttr])+happyOut125 x = unsafeCoerce# x+{-# INLINE happyOut125 #-}+happyIn126 :: ([CAttr]) -> (HappyAbsSyn )+happyIn126 x = unsafeCoerce# x+{-# INLINE happyIn126 #-}+happyOut126 :: (HappyAbsSyn ) -> ([CAttr])+happyOut126 x = unsafeCoerce# x+{-# INLINE happyOut126 #-}+happyIn127 :: ([CAttr]) -> (HappyAbsSyn )+happyIn127 x = unsafeCoerce# x+{-# INLINE happyIn127 #-}+happyOut127 :: (HappyAbsSyn ) -> ([CAttr])+happyOut127 x = unsafeCoerce# x+{-# INLINE happyOut127 #-}+happyIn128 :: (Reversed [CAttr]) -> (HappyAbsSyn )+happyIn128 x = unsafeCoerce# x+{-# INLINE happyIn128 #-}+happyOut128 :: (HappyAbsSyn ) -> (Reversed [CAttr])+happyOut128 x = unsafeCoerce# x+{-# INLINE happyOut128 #-}+happyIn129 :: (Maybe CAttr) -> (HappyAbsSyn )+happyIn129 x = unsafeCoerce# x+{-# INLINE happyIn129 #-}+happyOut129 :: (HappyAbsSyn ) -> (Maybe CAttr)+happyOut129 x = unsafeCoerce# x+{-# INLINE happyOut129 #-}+happyIn130 :: (Reversed [CExpr]) -> (HappyAbsSyn )+happyIn130 x = unsafeCoerce# x+{-# INLINE happyIn130 #-}+happyOut130 :: (HappyAbsSyn ) -> (Reversed [CExpr])+happyOut130 x = unsafeCoerce# x+{-# INLINE happyOut130 #-}+happyInTok :: CToken -> (HappyAbsSyn )+happyInTok x = unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn ) -> CToken+happyOutTok x = unsafeCoerce# x+{-# INLINE happyOutTok #-}++happyActOffsets :: HappyAddr+happyActOffsets = HappyA# "\x00\x00\x9a\x09\x18\x0f\x00\x00\x47\x07\x00\x00\xf3\x08\x18\x20\x18\x0f\x00\x00\x69\x09\xc3\x04\x98\x04\xdb\x04\x8e\x04\x63\x08\x48\x08\x3f\x08\x35\x08\x6a\x04\x00\x00\x19\x08\xee\x07\x00\x00\x00\x00\xd2\x08\x00\x00\x00\x00\xb4\x0e\xb4\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x23\x04\x96\x0e\x7d\x0e\x00\x00\x00\x00\x00\x00\xe9\x07\x00\x00\x19\x0e\xfb\x0d\xfb\x0d\x40\x08\x3b\x08\x33\x08\xc5\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x07\xfe\x07\x00\x00\x00\x00\x11\x05\xf0\x07\xe2\x0d\xed\x07\xf2\x07\x9a\x09\x0e\x08\x41\x00\xeb\x07\xe2\x0d\xe1\x07\xcf\x07\xad\x07\x00\x00\x5f\x07\xe2\x0d\xe2\x0d\x00\x00\x97\x07\xe2\x0d\x92\x07\xe2\x0d\x00\x00\x0a\x08\x64\x07\x9a\x09\x00\x00\x00\x00\x00\x00\x63\x01\x00\x00\xb4\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x07\x4d\x07\x00\x00\x1c\x1a\x1c\x1a\xe2\x0d\x00\x00\xd2\x08\x00\x00\x00\x00\x3b\x07\x00\x00\x00\x00\xd2\x08\x00\x00\xd2\x08\x00\x00\x00\x00\x00\x00\x91\x07\xbb\x02\x00\x00\xeb\x15\x72\x04\x72\x04\x00\x00\x00\x00\x2f\x07\x00\x00\x41\x0a\x8e\x07\x81\x07\x11\x05\xf8\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x07\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x07\xe2\x0d\xe2\x0d\x7e\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\x00\x00\xe2\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x0d\xe2\x0d\x23\x04\x23\x04\x00\x00\x00\x00\x00\x00\x00\x00\x51\x07\x00\x00\x32\x04\x2f\x04\xc8\x00\x8d\x11\x00\x00\xc8\x00\xf3\x18\xf3\x18\x6a\x17\x5a\x17\xe8\x07\xe8\x07\x5e\x11\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x00\x00\x00\x00\x41\x12\x45\x02\x45\x02\x00\x00\x7a\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x0f\x00\x00\x1e\x07\x22\x0b\x00\x00\x00\x00\x43\x01\x71\x07\x5c\x09\x6d\x07\x43\x01\x3f\x07\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x69\x07\x00\x00\x91\x17\x00\x00\x62\x07\x00\x00\xed\x17\xc6\x0a\x38\x07\x00\x00\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x2f\x11\x44\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x07\x25\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x07\x00\x00\x42\x02\x35\x02\x4a\x00\x17\x07\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x32\x07\x00\x00\x16\x07\x02\x07\x00\x00\xcf\x06\x00\x00\xcf\x06\x00\x00\x00\x00\x00\x00\x00\x00\x15\x07\x3c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x09\x4b\x09\x1c\x04\x1c\x04\xee\x03\xee\x03\xee\x03\xee\x03\xdb\x04\xdb\x04\xd8\x03\x07\x07\xfc\x06\xf8\x06\xf6\x06\xe2\x0d\xf4\x06\x00\x00\xe2\x06\x0a\x07\x36\x09\xd8\x01\xa9\x06\x00\x00\x00\x00\x48\x0d\x00\x00\x00\x00\x00\x00\xa9\x06\xb0\x19\x8c\x19\x00\x11\x96\x12\xd0\x01\x00\x00\x00\x00\xf5\x06\xef\x06\x00\x00\xea\x06\xb2\x06\xae\x06\xad\x06\x9a\x09\xa6\x07\x76\x06\x72\x06\x71\x06\x9a\x09\xe2\x0d\x00\x00\xb9\x06\xc5\x18\x8d\x06\x8c\x06\x00\x00\x9c\x06\x00\x00\x9b\x06\x97\x06\x9a\x09\x9a\x09\x9a\x09\x00\x00\xe2\x0d\xe2\x0d\x9f\x00\xd1\x10\x9f\x00\xa2\x10\x12\x12\xe2\x0d\x75\x06\x00\x00\x39\x02\x6a\x03\x00\x00\xa6\x07\x30\x06\x00\x00\x60\x06\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x73\x10\x9f\x00\x44\x10\x6c\x06\x6e\x08\x00\x00\xd4\x19\x35\x03\xd4\x19\x5b\x06\x5b\x06\x5b\x06\x56\x06\x00\x00\xe7\x0e\x00\x00\x0f\x01\x3b\x02\xe6\x0f\x3b\x02\xe8\x07\xe8\x07\xb7\x0f\x70\x06\x42\x06\x00\x00\x55\x06\x4f\x06\x14\x00\xeb\x11\x00\x00\x00\x00\x00\x00\x4b\x06\x00\x00\x00\x00\x00\x00\x47\x0c\x05\x06\x35\x03\x3a\x06\x28\x06\xd8\xff\xe2\x0d\x00\x00\xe2\x0d\x00\x00\xe2\x0d\x00\x00\x3c\x00\x9f\x00\x91\x17\x04\x06\x95\x05\xf3\x05\x00\x00\x36\x09\x91\x17\xce\x05\x00\x00\x00\x00\x77\x18\xaa\x0a\x00\x00\x00\x00\x0f\x02\x78\x01\xea\x05\xe5\x05\x4a\x00\xdb\x00\x78\x01\x00\x00\x91\x17\xcb\x05\x00\x00\x36\x09\xb6\x05\x00\x00\x89\x01\x00\x00\x91\x17\xb3\x05\x00\x00\x62\x0a\x00\x00\xc8\x05\xa7\x0b\x17\x00\x69\x05\x12\x01\x9e\x18\x00\x00\x00\x00\x00\x00\x36\x09\x91\x17\x98\x05\x00\x00\xaf\x05\x37\x09\x12\x00\x12\x00\x4a\x00\x00\x00\x4a\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x14\x09\x9a\x05\x66\x05\x00\x00\x00\x00\x00\x00\x14\x09\x01\x09\x00\x00\x4a\x00\x00\x00\xe4\x0c\x00\x00\x88\x05\x81\x05\x00\x00\x1d\x05\x72\x04\x29\x0c\x74\x05\x64\x05\x17\x00\x00\x00\x62\x05\x0e\x05\xfe\x09\x17\x00\x00\x00\x00\x00\x91\x17\x34\x05\x00\x00\x58\x05\x56\x05\x00\x00\x00\x00\xe9\x08\x54\x05\x0c\x00\x5a\x01\x4b\x05\x4a\x00\x4a\x00\xe6\x08\x00\x00\x00\x00\x00\x00\xa7\x0a\x2d\x01\x00\x00\x00\x00\x4a\x05\x48\x05\xe7\x04\x00\x00\x00\x00\x00\x00\x02\x05\x00\x00\xb9\x00\x94\x00\x02\x05\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x2b\x05\x00\x00\x00\x00\x26\x02\x00\x00\x08\x05\x35\x03\x00\x00\x33\x01\xe4\x0c\x64\x03\x00\x00\xc4\x02\x00\x00\xf9\x04\xe2\x0d\x35\x03\xc5\x0b\x36\x09\x13\x05\x10\x05\x13\x00\x00\x00\x4a\x00\x00\x00\xbf\x17\x00\x00\xb1\x04\x00\x00\x49\x18\x1b\x18\x88\x0f\xa3\x0a\xb1\x04\xb1\x04\x00\x00\x59\x0f\x10\x07\xb1\x04\x00\x00\xb1\x04\xb1\x04\x00\x00\x00\x00\x00\x00\x00\x00\x72\x04\x35\x17\x00\x00\xf8\x04\x3f\x03\x00\x00\xf6\x04\x00\x00\xc6\x04\x15\x10\xc6\x04\xc6\x04\xc6\x04\x00\x00\x5f\x03\xb0\x04\x00\x00\xbf\x04\x64\x00\x9a\x09\xdc\x04\xa6\x04\xa6\x04\x15\x10\xa6\x04\xa7\x04\x97\x04\x58\x04\x00\x00\x00\x00\x9a\x09\xe2\x0d\xe2\x0d\x83\x04\x65\x04\x00\x00\x14\x02\x64\x04\x00\x00\x88\x04\x29\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x04\x00\x00\x00\x00\x00\x00\xe2\x0d\x0c\x03\x00\x00\x08\x17\x9b\x02\x00\x00\x39\x03\xf5\x02\x68\x19\x7a\x12\x00\x00\x00\x00\x17\x19\x00\x00\x00\x00\x00\x00\x7b\x04\x8f\x00\xbc\x11\x00\x00\x00\x00\x05\x09\x26\x01\xeb\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x80\x04\x6c\x04\xae\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x0b\x00\x00\x59\x00\xe2\x0d\xa9\x02\x00\x00\xc6\x0c\x68\x04\xd8\xff\x49\x04\xbd\x00\x2b\x00\x2b\x00\x49\x04\x61\x04\x00\x00\x00\x00\xd3\x08\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x04\x4d\x04\x17\x00\xd5\x03\x00\x00\x48\x04\x00\x00\x00\x00\x45\x04\xe2\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x04\x00\x00\x00\x00\xe2\x0d\x3d\x04\x00\x00\x00\x00\x00\x00\x3d\x00\xad\x08\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x02\x00\x00\x00\x00\xab\x0c\x00\x00\x00\x00\xe2\x0d\x2a\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x14\x09\x3d\x00\x00\x00\xd1\x03\x0f\x04\xe2\x0d\xab\x02\x44\x19\xaf\x03\x00\x00\xaf\x03\x00\x00\xaf\x03\xeb\x03\xe2\x0d\x00\x00\x00\x00\x03\x04\x00\x00\xfe\x03\xe9\x03\xe2\x0d\x64\x00\xc0\x03\x64\x00\x00\x00\xe5\x03\xe0\x03\x00\x00\x9a\x09\x9a\x09\xec\x00\x00\x00\x00\x00\xde\x03\x77\x03\x77\x03\x00\x00\x00\x00\xe2\x0d\x00\x00\xab\x02\x9b\x02\x70\x03\x00\x00\xe2\x0d\x00\x00\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00\xe2\x0d\x00\x00\x00\x00\xc4\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x03\x66\x03\x00\x00\xb9\x03\xa7\x03\x00\x00\x76\x03\x34\x03\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\xe2\x0d\xe2\x0d\x00\x00\x7f\x03\x6f\x03\x44\x03\x06\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x77\x02\x9a\x06\xfd\x1c\x5e\x03\x38\x00\x00\x00\x00\x00\xd6\x02\xd9\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x03\x00\x00\x00\x00\x4f\x0e\x34\x0e\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x02\x9c\x0a\x80\x0a\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\xbd\x0d\x57\x0a\x85\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\x30\x03\x82\x00\x00\x00\xad\x1e\x00\x00\x00\x00\x7f\x06\x00\x00\xbf\x02\x00\x00\x83\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x1c\xc7\x1c\x00\x00\x00\x00\xac\x1c\x00\x00\x91\x1c\x00\x00\x5f\x06\x00\x00\x15\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x23\x08\x00\x00\xce\x15\xb4\x15\x92\x1e\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x02\x00\x00\x22\x02\x00\x00\x00\x00\x00\x00\x00\x00\x30\x05\x00\x00\x8b\x00\xfb\xff\xcf\xff\x00\x00\x00\x00\xf9\x07\x00\x00\xb9\x15\x00\x00\x00\x00\xee\x02\x73\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x1c\xfe\x1e\x5b\x1c\x19\x1f\x90\x14\x34\x1f\x41\x1f\x07\x0c\x85\x0b\x5c\x1f\x4f\x1f\x0b\x0f\x71\x0d\x99\x0d\xf4\x08\xb4\x0d\xc3\x07\x1d\x0b\xf3\x09\xb8\x09\x00\x00\x77\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x1c\x25\x1c\xb7\x02\xa7\x02\x00\x00\x00\x00\x00\x00\x00\x00\x04\x03\x00\x00\x00\x00\x00\x00\xf1\x05\x8a\x00\x00\x00\x51\x05\x84\x02\x16\x00\xa5\x02\x67\x01\x66\x01\x59\x01\x61\x00\x00\x00\x00\x00\x00\x00\xe3\x07\xef\x02\x00\x00\x00\x00\xdc\x00\x83\x03\xa1\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x90\x02\x3e\x08\x00\x00\x00\x00\xb5\x01\x00\x00\xe3\x07\x00\x00\x37\x02\xf7\x02\x00\x00\x00\x00\x00\x00\x1b\x02\xdb\x02\x00\x00\x00\x00\x00\x00\x74\x04\x00\x00\x52\x02\x00\x00\x60\x13\x51\x16\xd5\x02\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x01\xb8\x02\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x02\xbb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x02\x52\x0c\xb0\x16\xde\x07\xb0\x02\x00\x00\x00\x00\x00\x00\xa1\x01\x8f\x02\x00\x00\x00\x00\x00\x00\x9f\x02\x82\x01\x7a\x02\xb0\x07\x00\x00\x95\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x15\x09\x02\x24\x02\x00\x00\x00\x00\x60\x07\x00\x00\x00\x00\x00\x00\x04\x02\x28\x04\x00\x00\x2b\x13\xa1\x08\xfb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x05\xfc\x01\x5f\x02\x06\x02\xd6\x01\xdf\x05\x5c\x1e\x00\x00\x00\x00\x6d\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x05\x5a\x05\x3f\x05\x00\x00\x68\x1b\x4d\x1b\xf2\x1f\x0e\x07\xe5\x1f\xee\x13\x13\x14\x0a\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x01\xf2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x0b\x0a\x01\x8b\x07\x05\x01\x00\x00\xfd\x06\x00\x00\x9c\x15\x88\x00\x86\x15\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x02\x11\x07\x00\x00\x0b\x03\xa1\x1f\x9e\x13\x89\x1f\x92\x00\x69\x00\xb2\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x01\x57\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x1a\x00\x00\x1f\x01\x00\x00\x00\x00\x65\x02\x41\x1e\x00\x00\xc8\x1e\x00\x00\x26\x1e\x00\x00\x75\x04\xd8\x1f\x4e\x04\xc4\x01\x40\x07\x00\x00\x00\x00\xd6\x14\x13\x04\xbd\x01\x00\x00\x00\x00\x98\x09\xed\x02\x00\x00\x00\x00\x33\x05\xff\x0b\x00\x00\x00\x00\x5a\x07\xfd\x01\x7d\x0b\x00\x00\xed\x03\xb6\x01\x00\x00\xb2\x14\xff\x01\x00\x00\x47\x01\xca\x01\xb2\x03\x8e\x01\x00\x00\xee\x15\x00\x00\x00\x00\xfb\x1a\x29\x07\xca\x00\x00\x00\x6d\x03\x00\x00\x00\x00\x00\x00\x5a\x14\x8c\x03\x68\x01\x00\x00\x00\x00\x4f\x07\x9a\x01\xb2\x04\x19\x07\x00\x00\xfe\x06\x00\x00\xfb\x06\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x02\xfb\x06\x00\x00\xf0\x06\x00\x00\xe0\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\xba\x16\x00\x00\x00\x00\xc4\x06\x00\x00\x00\x00\x00\x00\x0e\x16\x2f\x06\x00\x00\x00\x00\x2b\x03\x60\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x06\x00\x00\x0b\x04\x3f\x0d\x00\x00\xdc\x06\xa0\x06\x86\x06\x00\x00\x00\x00\x00\x00\x65\x16\xdf\x03\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x01\x00\x00\x00\x00\x00\x00\x46\x01\x00\x00\xbe\x0c\x8f\x0e\x42\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\xc5\x1a\xd2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x1e\x25\x01\x28\x1a\x36\x14\x00\x00\x00\x00\xd1\x00\x00\x00\x66\x06\x00\x00\x90\x13\x00\x00\xf2\x05\x00\x00\xc7\x03\x00\x00\xf6\x12\xc1\x16\xd7\x05\xa9\x05\x00\x00\xbe\x12\x94\x16\xa6\x05\x00\x00\xa0\x05\x9d\x05\x00\x00\x00\x00\x00\x00\x00\x00\xce\xff\x54\x15\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x01\x2e\x01\x58\x01\x38\x01\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xff\xd5\x04\x00\x00\x3a\x01\x19\x00\x90\x12\xf6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x04\x32\x1b\x17\x1b\xf4\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\xfb\x00\x00\x00\x00\x00\x00\x00\xef\x1b\x74\x00\x00\x00\x54\x15\xcb\x1f\x00\x00\x00\x00\x00\x00\xcb\x03\x28\x12\x00\x00\x00\x00\x3d\x15\x00\x00\x00\x00\x00\x00\x48\x16\xc1\x05\xea\x13\x00\x00\x00\x00\xff\x13\x61\x06\x91\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x1a\x00\x00\x00\x00\xf0\x1d\xe2\xff\x00\x00\x87\x1a\x00\x00\x6c\x00\x7f\x00\x2c\x0e\xa0\x0c\x80\x0c\x67\x00\x00\x00\x00\x00\x00\x00\xab\x05\x00\x00\x00\x00\x6f\x09\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x0b\xa8\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x05\x37\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x21\x05\x23\x05\x00\x00\x00\x00\x00\x00\x58\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\x00\x00\xaa\x1a\x00\x00\x00\x00\x9f\x1d\x6c\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x21\x05\x00\x00\x30\x00\x00\x00\x84\x1d\x1e\x04\x28\x04\x95\x04\x00\x00\x49\x03\x00\x00\x23\x03\x00\x00\x69\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x1b\xf8\xff\x00\x00\xf2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x04\x65\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xff\xcb\xff\x00\x00\x00\x00\x4e\x1d\x00\x00\x7a\x03\xbc\x1f\xba\xff\x00\x00\x33\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x02\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\xff\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x1b\x9e\x1b\x00\x00\x00\x00\x00\x00\x00\x00\xa0\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\xfb\xff\x00\x00\x00\x00\x00\x00\x3e\xfe\x9c\xfe\x90\xfe\x7e\xfe\x00\x00\x7c\xfe\x78\xfe\x75\xfe\x72\xfe\x6d\xfe\x6a\xfe\x68\xfe\x66\xfe\x64\xfe\x62\xfe\x60\xfe\x5d\xfe\x50\xfe\x00\x00\xa6\xfe\xa5\xfe\x3e\xfe\x7f\xfe\x80\xfe\x00\x00\x00\x00\x82\xfe\x81\xfe\x83\xfe\x84\xfe\x00\x00\x00\x00\x00\x00\x46\xfe\x47\xfe\x45\xfe\x44\xfe\xa7\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\x00\x00\x00\x00\xc8\xff\xd8\xff\xb6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xfe\x00\x00\x00\x00\xa7\xfe\x3f\xfe\x00\x00\x00\x00\x00\x00\x4b\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x40\xfe\x4c\xfe\x00\x00\x00\x00\xbd\xff\x7e\xfe\x48\xfe\x00\x00\xbc\xff\x00\x00\xb5\xff\x30\xff\x2d\xff\x2e\xff\x2f\xff\xd6\xff\x3e\xfe\xc7\xff\x3e\xfe\x3e\xfe\x00\x00\x86\xfe\x3e\xfe\x87\xfe\x8d\xfe\x43\xfe\x42\xfe\x8b\xfe\x3e\xfe\x89\xfe\x3e\xfe\x85\xfe\x8e\xfe\x8f\xfe\x00\x00\xdf\xfe\x78\xff\x8b\xff\x8a\xff\x89\xff\x6d\xff\x53\xff\x3e\xfe\x52\xff\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x3c\xfe\x7f\xff\x87\xff\x7e\xff\x82\xff\x3e\xfe\x83\xff\x85\xff\x84\xff\x86\xff\x81\xff\x4e\xff\x00\x00\x4d\xff\x80\xff\x88\xff\x61\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\x8c\xfe\x00\x00\x5b\xfe\x57\xfe\x56\xfe\x5a\xfe\x59\xfe\x58\xfe\x53\xfe\x52\xfe\x51\xfe\x55\xfe\x54\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x96\xfe\x95\xfe\xf9\xff\xf8\xff\x00\x00\xf7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x99\xff\x00\x00\x9c\xff\x8b\xff\x9b\xff\x8a\xff\x9a\xff\x89\xff\x00\x00\xe6\xff\x0b\xff\x09\xff\x0a\xff\xa7\xff\xfc\xfe\xfb\xfe\x3d\xfe\x00\x00\x3e\xfe\xfa\xff\x00\x00\x8e\xff\x90\xff\x8d\xff\x8f\xff\x91\xff\x8c\xff\xff\xfe\x3e\xfe\xf6\xff\x00\x00\x00\x00\x08\xff\xfa\xfe\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\xff\x77\xff\x6c\xff\x27\xff\xa7\xff\x3b\xfe\x00\x00\x5b\xff\x3e\xfe\x04\xff\xd8\xfe\xd6\xfe\xf5\xfe\x4a\xfe\x00\x00\x97\xff\x76\xff\x6b\xff\x2b\xff\x27\xff\xa7\xff\x00\x00\x00\x00\x5e\xff\x67\xff\x55\xff\x54\xff\x63\xff\x93\xff\x92\xff\x62\xff\x70\xff\x69\xff\x68\xff\xaa\xff\x6f\xff\x6e\xff\xab\xff\x7c\xff\x73\xff\x74\xff\x72\xff\x7b\xff\x7a\xff\x79\xff\x00\x00\x27\xff\x28\xff\x24\xff\x21\xff\x20\xff\x25\xff\x17\xff\x29\xff\xa7\xff\x00\x00\x3e\xfe\x23\xff\x00\x00\x95\xff\x7d\xff\x71\xff\x27\xff\xa7\xff\x94\xff\x00\x00\x66\xff\x00\x00\x27\xff\xa7\xff\x3e\xfe\xa9\xff\x3e\xfe\xa8\xff\xf4\xff\x98\xfe\x97\xfe\x00\x00\x00\x00\x92\xfe\x9a\xfe\x5c\xfe\x79\xfe\x7a\xfe\x7b\xfe\x76\xfe\x77\xfe\x73\xfe\x74\xfe\x6e\xfe\x70\xfe\x6f\xfe\x71\xfe\x6b\xfe\x6c\xfe\x69\xfe\x67\xfe\x65\xfe\x63\xfe\x00\x00\x00\x00\x61\xfe\x4e\xfe\x4f\xfe\x00\x00\x3e\xfe\x00\x00\x3d\xfe\x2c\xff\xa4\xfe\x00\x00\xdc\xfe\xd9\xfe\xdb\xfe\xda\xfe\x00\x00\xdd\xfe\xf5\xfe\xc9\xfe\x00\x00\xde\xfe\xa3\xfe\x00\x00\x00\x00\x41\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xff\xd6\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\x00\x00\x3e\xfe\x00\x00\x00\x00\xbf\xff\x00\x00\xbb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\xff\x4c\xfe\x4c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x00\x00\xdd\xff\x00\x00\x00\x00\xe1\xfe\xd7\xff\x00\x00\xd4\xff\x00\x00\xd5\xff\xd3\xff\xd1\xff\xd2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x61\xff\x3e\xfe\xde\xff\x3e\xfe\x00\x00\x3e\xfe\x00\x00\x8a\xfe\x88\xfe\x4f\xff\x4c\xff\x3e\xfe\xc7\xfe\xc5\xfe\xf0\xfe\xec\xfe\xe9\xfe\x9b\xff\x8a\xff\xe5\xfe\x00\x00\xf4\xfe\xf2\xfe\x00\x00\x00\x00\x00\x00\x3d\xfe\x75\xff\x6a\xff\x2a\xff\x00\x00\x58\xff\xbb\xfe\x7d\xfe\xb5\xfe\x35\xff\x00\x00\x00\x00\x00\x00\x37\xfe\x00\x00\x5e\xfe\x00\x00\x99\xfe\x00\x00\x9b\xfe\x00\x00\x00\x00\x3e\xfe\xb7\xfe\x3e\xfe\x00\x00\xf2\xff\x3e\xfe\x3e\xfe\xb7\xfe\xf0\xff\x22\xff\xf5\xfe\x00\x00\x1f\xff\x13\xff\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\xff\x3e\xfe\xb7\xfe\xf1\xff\x3e\xfe\x00\x00\x96\xff\x27\xff\xa7\xff\x3e\xfe\xb7\xfe\xef\xff\x4a\xfe\x49\xfe\x00\x00\x4a\xfe\x83\xfe\x3e\xfe\x00\x00\x3d\xfe\xd5\xfe\xed\xff\xa6\xff\x3e\xfe\x3e\xfe\xb7\xfe\xf3\xff\x00\x00\x00\x00\x00\x00\x3e\xfe\xf7\xfe\xfe\xfe\x03\xff\x07\xff\x0a\xff\x06\xff\xf9\xfe\x00\x00\x00\x00\x00\x00\x05\xff\x02\xff\xf6\xfe\x00\x00\x00\x00\xfd\xfe\x01\xff\xa2\xff\x00\x00\xec\xff\x00\x00\x00\x00\xf8\xfe\x00\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x83\xfe\xd4\xfe\x00\x00\x00\x00\x4a\xfe\x83\xfe\xa4\xff\xe8\xff\x3e\xfe\xb7\xfe\xee\xff\x00\x00\x00\x00\x9e\xff\xea\xff\x00\x00\x00\x00\x00\x00\x3e\xfe\x00\x00\x10\xff\x1b\xff\x00\x00\x1e\xff\x1d\xff\x12\xff\x00\x00\x00\x00\xa5\xff\xe9\xff\x00\x00\x00\x00\x00\x00\xa0\xff\x9f\xff\xeb\xff\x27\xff\x29\xff\x00\x00\x3e\xfe\x27\xff\x91\xfe\x5f\xfe\x4d\xfe\x00\x00\x39\xfe\x35\xfe\x36\xfe\x60\xff\x5f\xff\x00\x00\x34\xff\x32\xff\x00\x00\xb4\xfe\x00\x00\x00\x00\x00\x00\xad\xfe\xae\xfe\xba\xfe\x00\x00\x00\x00\x00\x00\xb5\xfe\x3e\xfe\x00\x00\x00\x00\x00\x00\xc2\xfe\xc3\xfe\xc1\xfe\x3e\xfe\xd7\xfe\x3e\xfe\xe3\xfe\x00\x00\xe4\xfe\xf5\xfe\xc9\xfe\x3e\xfe\x3e\xfe\xe8\xfe\xf5\xfe\xc9\xfe\x3e\xfe\xeb\xfe\x3e\xfe\x3e\xfe\xef\xfe\xc4\xfe\xc6\xfe\xc8\xfe\x3d\xfe\x3e\xfe\x4c\xff\x00\x00\x00\x00\x9f\xfe\x00\x00\xd0\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xff\x00\x00\x00\x00\xca\xff\x00\x00\xb4\xff\x00\x00\x00\x00\x27\xff\x27\xff\x00\x00\x27\xff\x00\x00\x00\x00\xc6\xff\xc4\xff\xc3\xff\x00\x00\x4c\xfe\x4c\xfe\x27\xff\x00\x00\xdb\xff\x00\x00\xb3\xff\xb2\xff\x00\x00\x00\x00\xba\xff\xd9\xff\xc9\xff\xcf\xff\xcd\xff\xce\xff\x00\x00\xcc\xff\xa0\xfe\xa1\xfe\x00\x00\x00\x00\xa2\xfe\x3e\xfe\x41\xff\x4a\xff\x00\x00\x00\x00\x3e\xfe\x3d\xfe\x4b\xff\x50\xff\x3e\xfe\xee\xfe\xed\xfe\xea\xfe\x3e\xfe\xc5\xfe\x3d\xfe\xe7\xfe\xe6\xfe\x3e\xfe\xc5\xfe\x3d\xfe\xe2\xfe\xf1\xfe\xf3\xfe\xc0\xfe\xbe\xfe\xbf\xfe\xbd\xfe\x00\x00\x00\x00\x00\x00\xaa\xfe\x00\x00\xaf\xfe\xac\xfe\xa9\xfe\xb0\xfe\xb3\xfe\x00\x00\x94\xfe\x00\x00\x00\x00\x00\x00\x39\xff\x00\x00\x00\x00\x37\xfe\xb7\xfe\x00\x00\x00\x00\x00\x00\xb7\xfe\x00\x00\x65\xff\x64\xff\x00\x00\x1c\xff\x11\xff\x00\x00\x16\xff\x1a\xff\x0e\xff\x0f\xff\x00\x00\x19\xff\x0c\xff\x5d\xff\x5c\xff\xa3\xff\xe7\xff\x00\x00\x00\x00\x83\xfe\x3e\xfe\xd2\xfe\x00\x00\xd3\xfe\xcd\xfe\x00\x00\x00\x00\xe0\xfe\x5a\xff\x59\xff\xb6\xfe\x00\xff\xf5\xff\x00\x00\xd0\xfe\xcc\xfe\x00\x00\x00\x00\xd1\xfe\xcb\xfe\x18\xff\x00\x00\x00\x00\x15\xff\x26\xff\x9d\xff\x00\x00\xa1\xff\x38\xfe\x3a\xfe\x32\xfe\x00\x00\x33\xfe\x33\xff\x38\xff\x31\xff\x00\x00\x37\xff\xb2\xfe\x00\x00\x93\xfe\xab\xfe\x00\x00\x00\x00\xb9\xfe\x57\xff\x56\xff\xbc\xfe\x3d\xfe\x3d\xfe\x47\xff\x45\xff\x3d\xff\x00\x00\x00\x00\x3d\xfe\x3e\xfe\x49\xff\x3e\xfe\x48\xff\x3e\xfe\x40\xff\x00\x00\x51\xff\x9e\xfe\x00\x00\xcb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\xff\xc2\xff\x00\x00\x00\x00\xc5\xff\x00\x00\x00\x00\x00\x00\xb9\xff\xb1\xff\x00\x00\x00\x00\x00\x00\x9d\xfe\x3f\xff\x00\x00\x43\xff\x00\x00\x00\x00\x46\xff\x3c\xff\x00\x00\x3a\xff\xb8\xfe\x00\x00\xb1\xfe\x36\xff\x34\xfe\x00\x00\x14\xff\xca\xfe\x00\x00\xcf\xfe\xce\xfe\x31\xfe\xa8\xfe\x3b\xff\x3e\xfe\x44\xff\x3e\xff\x00\x00\x00\x00\xb0\xff\x00\x00\x00\x00\xd7\xff\xc1\xff\xc0\xff\x00\x00\xad\xff\xb8\xff\x00\x00\x00\x00\x42\xff\x00\x00\x00\x00\x00\x00\x00\x00\xac\xff\xb7\xff\xae\xff\xaf\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x04\x00\x36\x00\x36\x00\x04\x00\x15\x00\x16\x00\x17\x00\x15\x00\x16\x00\x17\x00\x01\x00\x36\x00\x17\x00\x1c\x00\x18\x00\x1c\x00\x01\x00\x74\x00\x02\x00\x02\x00\x35\x00\x19\x00\x0d\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x0d\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\x01\x00\x39\x00\x09\x00\x39\x00\x2e\x00\x36\x00\x33\x00\x79\x00\x5c\x00\x1c\x00\x37\x00\x21\x00\x0d\x00\x23\x00\x02\x00\x03\x00\x04\x00\x01\x00\x01\x00\x74\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x79\x00\x79\x00\x0d\x00\x0d\x00\x01\x00\x36\x00\x03\x00\x0d\x00\x34\x00\x35\x00\x19\x00\x39\x00\x1b\x00\x74\x00\x1d\x00\x1e\x00\x1f\x00\x76\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\x04\x00\x74\x00\x03\x00\x5c\x00\x74\x00\x5e\x00\x33\x00\x74\x00\x74\x00\x5c\x00\x37\x00\x5e\x00\x5e\x00\x5e\x00\x36\x00\x79\x00\x5e\x00\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x43\x00\x36\x00\x21\x00\x2a\x00\x23\x00\x48\x00\x2d\x00\x5c\x00\x5d\x00\x5e\x00\x21\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x79\x00\x01\x00\x76\x00\x03\x00\x56\x00\x33\x00\x01\x00\x14\x00\x36\x00\x5c\x00\x5c\x00\x5d\x00\x5e\x00\x0d\x00\x5c\x00\x5d\x00\x36\x00\x01\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x79\x00\x20\x00\x21\x00\x0d\x00\x23\x00\x23\x00\x77\x00\x78\x00\x79\x00\x20\x00\x21\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x36\x00\x02\x00\x01\x00\x54\x00\x02\x00\x33\x00\x01\x00\x5b\x00\x36\x00\x36\x00\x77\x00\x78\x00\x79\x00\x36\x00\x0d\x00\x02\x00\x36\x00\x01\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x43\x00\x54\x00\x21\x00\x0d\x00\x23\x00\x48\x00\x2a\x00\x78\x00\x79\x00\x2d\x00\x01\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x2a\x00\x79\x00\x5b\x00\x2a\x00\x56\x00\x33\x00\x7b\x00\x0d\x00\x36\x00\x76\x00\x5c\x00\x5d\x00\x5e\x00\x02\x00\x2a\x00\x5c\x00\x5d\x00\x5e\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5c\x00\x5d\x00\x21\x00\x76\x00\x23\x00\x43\x00\x37\x00\x07\x00\x79\x00\x79\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x1e\x00\x79\x00\x2d\x00\x0a\x00\x04\x00\x33\x00\x01\x00\x0e\x00\x03\x00\x56\x00\x02\x00\x5c\x00\x5d\x00\x5e\x00\x07\x00\x5c\x00\x5d\x00\x5e\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5c\x00\x5d\x00\x21\x00\x01\x00\x23\x00\x03\x00\x20\x00\x21\x00\x79\x00\x23\x00\x01\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x0d\x00\x2a\x00\x2b\x00\x2c\x00\x5c\x00\x33\x00\x5e\x00\x0d\x00\x36\x00\x2a\x00\x33\x00\x02\x00\x07\x00\x36\x00\x77\x00\x78\x00\x79\x00\x01\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x21\x00\x0d\x00\x23\x00\x43\x00\x34\x00\x35\x00\x79\x00\x1c\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x01\x00\x36\x00\x2a\x00\x1c\x00\x07\x00\x2d\x00\x33\x00\x1c\x00\x1c\x00\x36\x00\x56\x00\x2a\x00\x0d\x00\x07\x00\x43\x00\x05\x00\x06\x00\x07\x00\x5e\x00\x48\x00\x41\x00\x42\x00\x43\x00\x44\x00\x39\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x21\x00\x39\x00\x56\x00\x78\x00\x79\x00\x39\x00\x39\x00\x1e\x00\x5c\x00\x79\x00\x5e\x00\x0d\x00\x20\x00\x21\x00\x21\x00\x5c\x00\x5d\x00\x5e\x00\x05\x00\x06\x00\x07\x00\x36\x00\x09\x00\x2e\x00\x0b\x00\x0c\x00\x0d\x00\x76\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x76\x00\x36\x00\x36\x00\x1c\x00\x5c\x00\x19\x00\x5e\x00\x1b\x00\x74\x00\x1d\x00\x1e\x00\x1f\x00\x79\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\x54\x00\x2c\x00\x5c\x00\x5d\x00\x5e\x00\x30\x00\x33\x00\x39\x00\x54\x00\x1c\x00\x37\x00\x5a\x00\x01\x00\x5c\x00\x03\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\x79\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x1c\x00\x73\x00\x74\x00\x39\x00\x76\x00\x42\x00\x43\x00\x44\x00\x79\x00\x79\x00\x5a\x00\x54\x00\x5c\x00\x1a\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\x39\x00\x6e\x00\x41\x00\x42\x00\x43\x00\x44\x00\x73\x00\x74\x00\x2c\x00\x76\x00\x77\x00\x78\x00\x79\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x09\x00\x07\x00\x0b\x00\x0c\x00\x0d\x00\x54\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x54\x00\x78\x00\x79\x00\x1c\x00\x19\x00\x02\x00\x1b\x00\x54\x00\x1d\x00\x1e\x00\x1f\x00\x0d\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\x07\x00\x58\x00\x59\x00\x5c\x00\x5d\x00\x79\x00\x33\x00\x79\x00\x39\x00\x1e\x00\x37\x00\x5c\x00\x5d\x00\x01\x00\x1c\x00\x2d\x00\x3c\x00\x3d\x00\x02\x00\x01\x00\x4b\x00\x03\x00\x42\x00\x43\x00\x44\x00\x0d\x00\x01\x00\x22\x00\x23\x00\x01\x00\x25\x00\x0d\x00\x27\x00\x74\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x0d\x00\x2a\x00\x4b\x00\x0d\x00\x2d\x00\x39\x00\x33\x00\x5a\x00\x1e\x00\x5c\x00\x37\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\x0a\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x4c\x00\x73\x00\x74\x00\x76\x00\x76\x00\x77\x00\x78\x00\x79\x00\x79\x00\x00\x00\x01\x00\x42\x00\x43\x00\x44\x00\x5a\x00\x79\x00\x5c\x00\x76\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\x07\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x1a\x00\x73\x00\x74\x00\x5c\x00\x5d\x00\x77\x00\x78\x00\x79\x00\x01\x00\x79\x00\x5c\x00\x5d\x00\x5e\x00\x5c\x00\x50\x00\x5e\x00\x20\x00\x21\x00\x07\x00\x23\x00\x0d\x00\x1a\x00\x22\x00\x23\x00\x01\x00\x25\x00\x2d\x00\x27\x00\x79\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x36\x00\x07\x00\x0d\x00\x1e\x00\x36\x00\x33\x00\x01\x00\x1a\x00\x03\x00\x37\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x20\x00\x21\x00\x03\x00\x0d\x00\x1e\x00\x06\x00\x41\x00\x42\x00\x43\x00\x44\x00\x07\x00\x22\x00\x23\x00\x1a\x00\x25\x00\x4c\x00\x27\x00\x2d\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x36\x00\x07\x00\x5c\x00\x5d\x00\x7a\x00\x7b\x00\x33\x00\x5a\x00\x1f\x00\x5c\x00\x37\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\x1a\x00\x6e\x00\x5c\x00\x5d\x00\x79\x00\x4c\x00\x73\x00\x74\x00\x79\x00\x07\x00\x77\x00\x78\x00\x79\x00\x78\x00\x79\x00\x74\x00\x5c\x00\x5d\x00\x5c\x00\x5a\x00\x1a\x00\x5c\x00\x07\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\x07\x00\x6e\x00\x76\x00\x79\x00\x2a\x00\x2b\x00\x73\x00\x74\x00\x36\x00\x36\x00\x77\x00\x78\x00\x79\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x76\x00\x41\x00\x42\x00\x43\x00\x44\x00\x07\x00\x46\x00\x47\x00\x76\x00\x22\x00\x23\x00\x08\x00\x25\x00\x75\x00\x27\x00\x76\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x02\x00\x03\x00\x6d\x00\x19\x00\x06\x00\x1b\x00\x33\x00\x1d\x00\x1e\x00\x1f\x00\x37\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\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x33\x00\x01\x00\x4c\x00\x5b\x00\x37\x00\x2a\x00\x2b\x00\x78\x00\x79\x00\x03\x00\x5c\x00\x5d\x00\x06\x00\x77\x00\x78\x00\x79\x00\x5a\x00\x2b\x00\x5c\x00\x02\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\x02\x00\x6e\x00\x1f\x00\x79\x00\x5c\x00\x5d\x00\x73\x00\x74\x00\x2a\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x21\x00\x5b\x00\x23\x00\x5c\x00\x5d\x00\x07\x00\x2a\x00\x2b\x00\x23\x00\x2a\x00\x2b\x00\x2c\x00\x77\x00\x78\x00\x79\x00\x2a\x00\x2b\x00\x2c\x00\x33\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x19\x00\x33\x00\x1b\x00\x01\x00\x1d\x00\x1e\x00\x1f\x00\x32\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\x07\x00\x01\x00\x41\x00\x42\x00\x43\x00\x44\x00\x33\x00\x77\x00\x78\x00\x79\x00\x37\x00\x5e\x00\x42\x00\x43\x00\x44\x00\x04\x00\x46\x00\x47\x00\x19\x00\x04\x00\x1b\x00\x5e\x00\x1d\x00\x1e\x00\x1f\x00\x5b\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\x5a\x00\x02\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x33\x00\x79\x00\x02\x00\x21\x00\x37\x00\x23\x00\x2b\x00\x79\x00\x04\x00\x23\x00\x17\x00\x18\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\x33\x00\x78\x00\x79\x00\x36\x00\x33\x00\x11\x00\x12\x00\x36\x00\x04\x00\x77\x00\x78\x00\x79\x00\x19\x00\x04\x00\x1b\x00\x1e\x00\x1d\x00\x1e\x00\x1f\x00\x5e\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\x07\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x33\x00\x42\x00\x43\x00\x44\x00\x37\x00\x46\x00\x47\x00\x0b\x00\x0c\x00\x77\x00\x78\x00\x79\x00\x19\x00\x1e\x00\x1b\x00\x5e\x00\x1d\x00\x1e\x00\x1f\x00\x5e\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\x79\x00\x04\x00\x77\x00\x78\x00\x79\x00\x04\x00\x33\x00\x3c\x00\x3d\x00\x04\x00\x37\x00\x23\x00\x04\x00\x42\x00\x43\x00\x44\x00\x32\x00\x04\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x04\x00\x78\x00\x79\x00\x2a\x00\x2b\x00\x33\x00\x2a\x00\x2b\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x02\x00\x77\x00\x78\x00\x79\x00\x19\x00\x1f\x00\x1b\x00\x02\x00\x1d\x00\x1e\x00\x1f\x00\x02\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\x07\x00\x01\x00\x2c\x00\x03\x00\x5c\x00\x5d\x00\x33\x00\x02\x00\x78\x00\x79\x00\x37\x00\x1c\x00\x1d\x00\x0d\x00\x01\x00\x77\x00\x78\x00\x79\x00\x19\x00\x2a\x00\x1b\x00\x2b\x00\x1d\x00\x1e\x00\x1f\x00\x3c\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\x79\x00\x05\x00\x06\x00\x07\x00\x17\x00\x18\x00\x33\x00\x36\x00\x11\x00\x12\x00\x37\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x36\x00\x21\x00\x30\x00\x23\x00\x43\x00\x41\x00\x42\x00\x43\x00\x44\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x43\x00\x05\x00\x06\x00\x07\x00\x2b\x00\x48\x00\x33\x00\x77\x00\x78\x00\x79\x00\x56\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x0b\x00\x0c\x00\x5e\x00\x56\x00\x2b\x00\x42\x00\x43\x00\x44\x00\x30\x00\x5c\x00\x5d\x00\x5e\x00\x05\x00\x06\x00\x07\x00\x2d\x00\x02\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x37\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x13\x00\x14\x00\x15\x00\x16\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5a\x00\x02\x00\x5c\x00\x02\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\x79\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x5e\x00\x73\x00\x74\x00\x02\x00\x76\x00\x5a\x00\x02\x00\x5c\x00\x1e\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\x1f\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x01\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x30\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\x5b\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x36\x00\x73\x00\x74\x00\x02\x00\x76\x00\x02\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x1f\x00\x43\x00\x04\x00\x02\x00\x36\x00\x02\x00\x48\x00\x02\x00\x4d\x00\x3b\x00\x3c\x00\x3d\x00\x05\x00\x06\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x04\x00\x56\x00\x04\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x3b\x00\x3c\x00\x3d\x00\x4e\x00\x4f\x00\x50\x00\x41\x00\x42\x00\x43\x00\x44\x00\x04\x00\x5c\x00\x05\x00\x06\x00\x07\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x38\x00\x02\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x2b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5a\x00\x79\x00\x5c\x00\x02\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\x79\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x02\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x1f\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\x5e\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x04\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x1f\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\x2c\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x02\x00\x73\x00\x74\x00\x1f\x00\x76\x00\x02\x00\x1f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x5e\x00\x01\x00\x04\x00\x4e\x00\x4f\x00\x50\x00\x4e\x00\x4f\x00\x50\x00\x3b\x00\x3c\x00\x3d\x00\x05\x00\x06\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x4e\x00\x4f\x00\x50\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x77\x00\x78\x00\x79\x00\x77\x00\x78\x00\x79\x00\x05\x00\x06\x00\x07\x00\x77\x00\x78\x00\x79\x00\x77\x00\x78\x00\x79\x00\x1f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x38\x00\x02\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5a\x00\x79\x00\x5c\x00\x02\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\x01\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x02\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x02\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\x08\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x2a\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x02\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\x2c\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x73\x00\x74\x00\x1e\x00\x76\x00\x5c\x00\x2d\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x1e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x02\x00\x42\x00\x43\x00\x44\x00\x02\x00\x02\x00\x05\x00\x06\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x77\x00\x78\x00\x79\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x4e\x00\x4f\x00\x50\x00\x2b\x00\x2b\x00\x5a\x00\x01\x00\x5c\x00\x46\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\x5b\x00\x6e\x00\x5c\x00\x70\x00\x78\x00\x79\x00\x73\x00\x74\x00\x4e\x00\x4f\x00\x50\x00\x2a\x00\x2a\x00\x5a\x00\x79\x00\x5c\x00\x2a\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\x02\x00\x6e\x00\x4e\x00\x4f\x00\x50\x00\x02\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x02\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\x5e\x00\x6e\x00\x0c\x00\x0d\x00\x01\x00\x2a\x00\x73\x00\x74\x00\x1b\x00\x76\x00\x01\x00\x1a\x00\x03\x00\x1e\x00\x19\x00\x19\x00\x10\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x0d\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\x4e\x00\x4f\x00\x50\x00\x5e\x00\x20\x00\x21\x00\x33\x00\x23\x00\x30\x00\x01\x00\x37\x00\x4e\x00\x4f\x00\x50\x00\x2a\x00\x2b\x00\x2c\x00\x77\x00\x78\x00\x79\x00\x4e\x00\x4f\x00\x50\x00\x33\x00\x2c\x00\x2c\x00\x36\x00\x01\x00\x36\x00\x36\x00\x01\x00\x4e\x00\x4f\x00\x50\x00\x4e\x00\x4f\x00\x50\x00\x41\x00\x42\x00\x43\x00\x44\x00\x43\x00\x0d\x00\x30\x00\x2c\x00\x5a\x00\x48\x00\x5c\x00\x2c\x00\x5e\x00\x5f\x00\x60\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x2c\x00\x03\x00\x56\x00\x4e\x00\x4f\x00\x50\x00\x01\x00\x2c\x00\x5c\x00\x5d\x00\x5e\x00\x02\x00\x73\x00\x74\x00\x2b\x00\x02\x00\x77\x00\x78\x00\x79\x00\x30\x00\x31\x00\x5b\x00\x33\x00\x01\x00\x35\x00\x2c\x00\x01\x00\x38\x00\x01\x00\x5e\x00\x3b\x00\x02\x00\x3d\x00\x3e\x00\x3f\x00\x79\x00\x77\x00\x78\x00\x79\x00\x44\x00\x45\x00\x5e\x00\x47\x00\x04\x00\x02\x00\x4a\x00\x4b\x00\x02\x00\x4d\x00\x4e\x00\x5b\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x4e\x00\x4f\x00\x50\x00\x77\x00\x78\x00\x79\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x01\x00\x4e\x00\x4f\x00\x50\x00\x5e\x00\x65\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x46\x00\x01\x00\x10\x00\x77\x00\x78\x00\x79\x00\x5a\x00\x57\x00\x5c\x00\x2b\x00\x5e\x00\x5f\x00\x60\x00\x1b\x00\x2b\x00\x38\x00\x65\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x1e\x00\x41\x00\x42\x00\x43\x00\x44\x00\x01\x00\x2b\x00\x2c\x00\x73\x00\x74\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\x01\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x01\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x01\x00\x77\x00\x78\x00\x79\x00\x01\x00\x1e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2b\x00\x31\x00\x10\x00\x2b\x00\x1e\x00\x5a\x00\x36\x00\x5c\x00\x2b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x1b\x00\x3e\x00\x77\x00\x78\x00\x79\x00\x65\x00\x43\x00\x4e\x00\x4f\x00\x50\x00\x47\x00\x48\x00\x4e\x00\x4f\x00\x50\x00\x01\x00\x4d\x00\x73\x00\x74\x00\x50\x00\x2f\x00\x52\x00\x31\x00\x01\x00\x33\x00\x56\x00\x35\x00\x36\x00\x01\x00\x38\x00\x2a\x00\x5b\x00\x3b\x00\x5e\x00\x3d\x00\x3e\x00\x3f\x00\x77\x00\x78\x00\x79\x00\x43\x00\x44\x00\x45\x00\x1b\x00\x47\x00\x48\x00\x65\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x1a\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x19\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\x01\x00\x77\x00\x78\x00\x79\x00\x10\x00\x36\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x46\x00\x47\x00\x19\x00\xff\xff\x1b\x00\x1b\x00\x1d\x00\x1e\x00\x1f\x00\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\x77\x00\x78\x00\x79\x00\x2f\x00\xff\xff\x31\x00\x33\x00\x33\x00\xff\xff\x35\x00\x37\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x01\x00\x02\x00\x03\x00\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\x78\x00\x79\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\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\x01\x00\x01\x00\x02\x00\x03\x00\xff\xff\x37\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x77\x00\x78\x00\x79\x00\x01\x00\x02\x00\x03\x00\x01\x00\x02\x00\x03\x00\x1b\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x01\x00\xff\xff\x03\x00\xff\xff\x05\x00\x06\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\x01\x00\x02\x00\x03\x00\x33\x00\x01\x00\x35\x00\x03\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x0d\x00\xff\xff\xff\xff\x01\x00\x44\x00\x45\x00\x77\x00\x78\x00\x79\x00\xff\xff\x4a\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x0d\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\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\x01\x00\x01\x00\x02\x00\x03\x00\x36\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x43\x00\xff\xff\x36\x00\xff\xff\xff\xff\x48\x00\x5a\x00\xff\xff\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x43\x00\x0d\x00\x0e\x00\x0f\x00\x56\x00\x48\x00\x01\x00\x02\x00\x03\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x2f\x00\xff\xff\x73\x00\x74\x00\x33\x00\x56\x00\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\x5c\x00\x3b\x00\x5e\x00\x3d\x00\xff\xff\x3f\x00\x0d\x00\x0e\x00\x0f\x00\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\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\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\x1b\x00\x1e\x00\x1f\x00\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\x2b\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\x30\x00\x33\x00\x32\x00\xff\xff\x34\x00\x37\x00\xff\xff\x37\x00\xff\xff\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\x42\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x49\x00\xff\xff\xff\xff\x4c\x00\x78\x00\x79\x00\x4f\x00\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x0d\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x77\x00\x78\x00\x79\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x1b\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x73\x00\x74\x00\x2f\x00\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\x36\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x43\x00\x01\x00\xff\xff\x03\x00\xff\xff\x48\x00\x5c\x00\x5d\x00\x5e\x00\x4c\x00\x4d\x00\xff\xff\x5a\x00\x0d\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x1b\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\x2f\x00\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x43\x00\x03\x00\xff\xff\x01\x00\xff\xff\x48\x00\x01\x00\xff\xff\xff\xff\x4c\x00\x4d\x00\x0d\x00\x5a\x00\xff\xff\x5c\x00\x0d\x00\x5e\x00\x5f\x00\x0d\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x37\x00\x36\x00\x5a\x00\xff\xff\x5c\x00\x36\x00\x5e\x00\x5f\x00\x36\x00\x1b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x43\x00\x46\x00\x47\x00\xff\xff\x43\x00\x48\x00\xff\xff\x43\x00\xff\xff\x48\x00\xff\xff\xff\xff\x48\x00\x73\x00\x74\x00\x2f\x00\x5a\x00\xff\xff\x5c\x00\x56\x00\x5e\x00\x5f\x00\x36\x00\x56\x00\xff\xff\x5c\x00\x56\x00\x5e\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5c\x00\x5d\x00\x5e\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x73\x00\x74\x00\xff\xff\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x01\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\x03\x00\xff\xff\x0d\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x1b\x00\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x36\x00\x2c\x00\x2d\x00\x36\x00\x2f\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\x1b\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x5a\x00\x56\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x5c\x00\xff\xff\x5e\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\x1b\x00\x46\x00\x47\x00\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x00\x36\x00\xff\xff\x5a\x00\x1b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x2c\x00\xff\xff\x4c\x00\x2f\x00\x78\x00\x79\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x4c\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\x1b\x00\x46\x00\x47\x00\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x5a\x00\x1b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x2c\x00\xff\xff\x4c\x00\x2f\x00\x78\x00\x79\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x4c\x00\x42\x00\x43\x00\x44\x00\xff\xff\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\x1b\x00\x01\x00\x02\x00\xff\xff\x78\x00\x79\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x1b\x00\x42\x00\x43\x00\x44\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2f\x00\xff\xff\x4c\x00\x78\x00\x79\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x1b\x00\x42\x00\x43\x00\x44\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x2c\x00\xff\xff\x4c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2c\x00\xff\xff\x37\x00\x2f\x00\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\xff\xff\x1b\x00\x01\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\x1e\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x2f\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\x4c\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x01\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\x2f\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x1b\x00\x5a\x00\xff\xff\x5c\x00\x01\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x73\x00\x74\x00\x10\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x73\x00\x74\x00\xff\xff\x5a\x00\x1b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\x01\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x78\x00\x79\x00\x10\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\x2f\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x73\x00\x74\x00\x10\x00\x2f\x00\x37\x00\xff\xff\xff\xff\x4c\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x1b\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x0d\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x0d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x1b\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x56\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\x5e\x00\xff\xff\x2f\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x4c\x00\x5a\x00\x0d\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x31\x00\xff\xff\x33\x00\x0d\x00\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x5d\x00\x5e\x00\x38\x00\x23\x00\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\x32\x00\x33\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x21\x00\x38\x00\x23\x00\x01\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x44\x00\x45\x00\x0d\x00\x47\x00\xff\xff\x33\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x01\x00\x1e\x00\x03\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x79\x00\xff\xff\x0d\x00\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x21\x00\x38\x00\x23\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\x33\x00\x4a\x00\x4b\x00\x36\x00\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\x36\x00\x53\x00\x54\x00\x55\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x43\x00\xff\xff\xff\xff\x1e\x00\x1f\x00\x48\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\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x5e\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x79\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x1e\x00\x1f\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x1e\x00\x1f\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x1e\x00\x1f\x00\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\xff\xff\x20\x00\x21\x00\xff\xff\x23\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x21\x00\x36\x00\x23\x00\xff\xff\x77\x00\x78\x00\x79\x00\x4a\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\x21\x00\xff\xff\x23\x00\xff\xff\x21\x00\xff\xff\x23\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x79\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\x78\x00\x79\x00\x42\x00\x43\x00\x44\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x21\x00\x36\x00\x23\x00\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x2a\x00\x2b\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\x79\x00\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\x4c\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x79\x00\x33\x00\xff\xff\xff\xff\x5a\x00\x37\x00\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\x4c\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x5a\x00\x37\x00\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x33\x00\x25\x00\xff\xff\x27\x00\x37\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\x22\x00\x23\x00\xff\xff\x25\x00\x4c\x00\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\x33\x00\x5a\x00\xff\xff\x5c\x00\x37\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\x33\x00\xff\xff\xff\xff\x4c\x00\x37\x00\xff\xff\xff\xff\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\x23\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\xff\xff\x33\x00\x4c\x00\xff\xff\xff\xff\x37\x00\x33\x00\xff\xff\xff\xff\x36\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x4c\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x36\x00\xff\xff\x3b\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x77\x00\x78\x00\x79\x00\x43\x00\x44\x00\x45\x00\x78\x00\x79\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\x36\x00\x77\x00\x78\x00\x79\x00\x5a\x00\x5e\x00\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\x36\x00\x71\x00\xff\xff\x73\x00\x74\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\x79\x00\x37\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x77\x00\x78\x00\x79\x00\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x79\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x46\x00\x47\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x5d\x00\x5e\x00\x5f\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\x2b\x00\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x2b\x00\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\x31\x00\xff\xff\x43\x00\xff\xff\xff\xff\x36\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x3e\x00\xff\xff\x50\x00\xff\xff\x52\x00\x43\x00\xff\xff\xff\xff\x56\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x5e\x00\xff\xff\x50\x00\xff\xff\x52\x00\x2c\x00\xff\xff\xff\xff\x56\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x5d\x00\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x5d\x00\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\xff\xff\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\x52\x00\xff\xff\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x5f\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x53\x00\xff\xff\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x53\x00\x76\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x53\x00\x76\x00\xff\xff\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\xff\xff\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x79\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\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\x6f\x00\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\xff\xff\x73\x00\x74\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x31\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\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"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\xe1\x00\xbd\x00\xbe\x00\xb8\x01\x05\x01\x21\x03\x46\x03\x9d\x02\x9e\x02\x9c\x02\x9d\x02\x9e\x02\x2d\x02\x4a\x02\x48\x03\x24\x02\x6f\x03\xd2\x01\xfe\x01\x79\x03\xc8\x02\x61\x02\x18\x03\xbf\x00\x2e\x02\xc0\x00\x3e\xfe\xc1\x00\xc2\x00\xc3\x00\xff\x01\xc4\x00\xc5\x00\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xe1\x02\xcd\x01\x6e\x03\xcd\x01\x22\x03\x0c\x01\x7d\x00\x55\x03\x4b\x02\xea\x01\xcc\x00\x12\x01\x43\x02\x13\x01\xbc\x00\xbd\x00\xbe\x00\xfe\x01\x2d\x02\x67\x03\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xf1\x00\x06\x01\xff\x01\x2e\x02\xd6\x01\x14\x01\xfa\x00\x52\x00\xd6\x02\x4e\x02\xbf\x00\xcd\x01\xc0\x00\x68\x03\xc1\x00\xc2\x00\xc3\x00\x4f\x02\xc4\x00\xc5\x00\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xfa\x00\x9f\x02\xa1\x02\xe0\x00\x9f\x02\x95\x00\x7d\x00\x9f\x02\x70\x03\xe0\x00\xcc\x00\x95\x00\x95\x00\x95\x00\x5e\x00\x0d\x01\x95\x00\x81\x00\xd4\x00\x83\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\x5f\x00\xfe\x00\xfb\x00\x1c\x03\xfc\x00\x60\x00\x1d\x03\xe0\x00\xe1\x01\x95\x00\x0b\x01\xfd\x00\x7b\x00\x7c\x00\x26\x01\x15\x01\x6f\x02\x4f\x02\xfa\x00\x61\x00\x7d\x00\xe0\x02\x5b\x00\xfe\x00\xe0\x00\xe0\x00\x26\x01\x95\x00\x70\x02\x53\x00\x4a\x00\x0c\x01\x42\x02\x43\x02\xff\x00\xce\x00\xcf\x00\xd0\x00\x00\x01\xd2\x00\xd3\x00\x55\x03\x27\x01\x08\x01\x43\x02\x28\x01\x13\x01\x81\x00\xd4\x00\x83\x00\x0f\x01\x08\x01\x29\x01\x7b\x00\x7c\x00\xe5\x01\x5c\x00\x78\x03\xe1\x02\x10\x03\x5b\x03\x7d\x00\x12\x03\x29\x00\x09\x01\x14\x01\xfd\x02\x78\x02\x83\x00\x3d\xfe\x43\x02\xdc\x02\x09\x01\x24\x01\x43\x02\x2a\x01\xce\x00\xcf\x00\xd0\x00\x2b\x01\xd2\x00\xd3\x00\x3d\xfe\x12\x03\xe6\x01\x25\x01\xb6\x01\x3d\xfe\x23\x03\x01\x01\x83\x00\x24\x03\x2d\x02\xb7\x01\x7b\x00\x7c\x00\xeb\x00\x79\x03\x0d\x01\x7c\x02\x5c\x03\x3d\xfe\x7d\x00\x13\x03\x2e\x02\xb8\x01\x37\x03\xe0\x00\x26\x01\x95\x00\x6b\x03\xdd\x02\xe0\x00\x26\x01\x95\x00\x5e\x00\xe7\x01\xce\x00\xcf\x00\xd0\x00\xe8\x01\xd2\x00\xd3\x00\xe0\x00\x26\x01\xec\x00\x7d\x02\xed\x00\x5f\x00\x17\x02\x39\x03\x2c\x01\x15\x01\x60\x00\xee\x00\x7b\x00\x7c\x00\x80\x02\x6c\x03\x10\x01\xae\x02\x6e\x01\x83\x02\x7d\x00\x62\x01\x6f\x01\xfa\x00\x61\x00\x16\x02\xe0\x00\xe1\x01\x95\x00\xa4\x02\xe0\x00\x26\x01\x95\x00\x63\x01\xef\x00\xce\x00\xcf\x00\xd0\x00\xf0\x00\xd2\x00\xd3\x00\xe0\x00\x26\x01\xfb\x00\x6a\x02\xfc\x00\xfa\x00\x27\x01\x08\x01\xf1\x00\x28\x01\xe0\x01\xfd\x00\x7b\x00\x7c\x00\xa7\x02\x6b\x02\x29\x01\x7b\x00\x7c\x00\xe0\x00\x7d\x00\x95\x00\x25\x01\xfe\x00\x17\x02\x7d\x00\xc7\x01\xa5\x02\x09\x01\x18\x02\x57\x01\x83\x00\xfe\x01\x3d\xfe\xff\x00\xce\x00\xcf\x00\x03\x02\xbb\x01\x2a\x01\xce\x00\xcf\x00\x03\x02\xe6\x01\xff\x01\xb6\x01\x3d\xfe\x4d\x02\x4e\x02\xf1\x00\xf9\x01\x3d\xfe\xb7\x01\x7b\x00\x7c\x00\x2d\x02\x3d\xfe\xd5\x02\xdd\x02\xa6\x02\xd6\x02\x7d\x00\xe1\x02\x24\x02\xb8\x01\x3d\xfe\xc8\x01\x2e\x02\xa8\x02\x3d\xfe\x6c\x03\x31\x00\x32\x00\x95\x00\x3d\xfe\xe7\x01\xce\x00\xcf\x00\x03\x02\xcd\x01\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xe0\x01\x04\x01\xcd\x01\x3d\xfe\x81\x02\x83\x00\xcd\x01\xcd\x01\x73\x01\xe0\x00\x2c\x01\x95\x00\x25\x01\x07\x01\x08\x01\x0b\x01\xe0\x00\xe1\x01\x95\x00\x91\x01\x31\x00\x32\x00\x05\x01\x87\x02\x74\x01\x93\x01\x94\x01\x95\x01\x4f\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xcd\x02\x09\x01\x0c\x01\xcc\x01\xe0\x00\x96\x01\x95\x00\xc0\x00\xe2\x02\xc1\x00\x97\x01\x98\x01\xf1\x00\xc4\x00\x99\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xf2\x02\xe6\xff\xe0\x00\x26\x01\x95\x00\xcf\x01\x7d\x00\xcd\x01\x10\x02\xd2\x01\x9a\x01\x05\x00\xf9\x00\x06\x00\xfa\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\x06\x01\x38\x00\xe0\x00\xe1\x01\x95\x00\xe2\x01\x17\x00\x18\x00\xcd\x01\x39\x00\xe7\x00\xcf\x00\x0d\x02\x0a\x01\x0d\x01\x05\x00\x21\x02\x06\x00\x23\x02\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\xcd\x01\x38\x00\x02\x02\xce\x00\xcf\x00\x03\x02\x17\x00\x18\x00\xa6\x01\x39\x00\x81\x00\x88\x01\x83\x00\x91\x01\x31\x00\x32\x00\xc0\x01\x92\x01\x25\x02\x93\x01\x94\x01\x95\x01\x28\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x2d\x02\x37\x02\xea\x00\x83\x00\xea\x01\x96\x01\x3f\x03\xc0\x00\x3d\x02\xc1\x00\x97\x01\x98\x01\x2e\x02\xc4\x00\x99\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x74\x00\xd0\x02\xd1\x02\x53\x00\x4a\x00\xf1\x00\x7d\x00\xbb\x01\xcd\x01\x40\x03\x9a\x01\x53\x00\x4a\x00\xdb\x01\xf9\x01\x79\x02\x2b\x02\x1e\x01\x8a\x02\x6f\x02\x86\x02\xfa\x00\xfb\x01\xcf\x00\xfc\x01\x25\x01\xe0\x01\x75\x00\x76\x00\xd6\x00\x77\x00\x70\x02\x78\x00\x8c\x01\x79\x00\x7a\x00\x7b\x00\x7c\x00\x25\x01\xd9\x02\x8d\x01\xd7\x00\xda\x02\xcd\x01\x7d\x00\x05\x00\x8b\x02\x06\x00\x7e\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\x8f\x01\x38\x00\xe0\x00\x26\x01\x95\x00\x66\x01\x17\x00\x18\x00\xa4\x01\x39\x00\x81\x00\x88\x01\x83\x00\xf1\x00\x4a\x00\x04\x00\xfb\x01\xcf\x00\xfc\x01\x05\x00\xbb\x01\x06\x00\xbe\x01\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\x74\x00\x80\x00\xe0\x00\x26\x01\x95\x00\xcb\x01\x17\x00\x18\x00\xe0\x00\x26\x01\x81\x00\x82\x00\x83\x00\x42\x02\xf1\x00\xe0\x00\xe1\x01\x95\x00\xe0\x00\xf4\x01\x95\x00\x16\x01\x08\x01\xcf\x01\x17\x01\x43\x02\xd1\x01\x75\x00\x76\x00\xfe\x01\x77\x00\x5a\x03\x78\x00\xf1\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x74\x00\xb8\x01\xd3\x01\xff\x01\x36\x03\x09\x01\x7d\x00\x62\x01\xe1\x01\xfa\x00\x7e\x00\xfe\x00\x09\x02\xce\x00\xcf\x00\x03\x02\x0f\x01\x08\x01\xa9\xfe\x63\x01\x2d\x03\xa9\xfe\x04\x02\xce\x00\xcf\x00\x03\x02\xe3\x01\x75\x00\x76\x00\xe9\x01\x77\x00\x67\x01\x78\x00\x1a\x03\x79\x00\x7a\x00\x7b\x00\x7c\x00\x09\x01\xeb\x01\x53\x00\x4a\x00\x47\x02\x48\x02\x7d\x00\x05\x00\xa9\xfe\x06\x00\x7e\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\xf8\x01\x80\x00\xe0\x00\x26\x01\xf1\x00\x69\x01\x17\x00\x18\x00\x18\x01\xfa\x01\x81\x00\x82\x00\x83\x00\x06\x02\x83\x00\x07\x02\x53\x00\x4a\x00\xe0\x00\x05\x00\xf4\x00\x06\x00\x36\x01\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\x74\x00\x80\x00\x37\x01\x10\x01\x30\x03\x31\x03\x17\x00\x18\x00\xfe\x00\x58\x01\x81\x00\x82\x00\x83\x00\x33\x02\x1d\x01\x1e\x01\x34\x02\x20\x01\x38\x01\x04\x02\xce\x00\xcf\x00\xd0\x00\xf3\x02\x05\x02\xd3\x00\x50\x00\x75\x00\x76\x00\x61\x00\x77\x00\x6b\x00\x78\x00\x71\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\xab\x02\xac\x02\xaa\x00\xf6\x01\xad\x02\xc0\x00\x7d\x00\xc1\x00\x84\x01\x85\x01\x7e\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x75\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x7d\x00\x04\x00\x7f\x00\x29\x00\x87\x01\x32\x03\x33\x03\x35\x02\x83\x00\x5a\x02\x53\x00\x4a\x00\x5b\x02\x74\x03\x57\x01\x83\x00\x05\x00\x7b\x03\x06\x00\x7c\x03\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\x7d\x03\x80\x00\xd3\x02\xf1\x00\x3b\x03\x3c\x03\x17\x00\x18\x00\x17\x02\xa4\x02\x81\x00\x82\x00\x83\x00\xec\x00\x29\x00\xed\x00\x53\x00\x4a\x00\x12\x02\x17\x02\x89\x02\xed\x00\xee\x00\x7b\x00\x7c\x00\x4f\x03\x57\x01\x83\x00\xee\x00\x7b\x00\x7c\x00\x7d\x00\x72\x03\x81\x00\x88\x01\x83\x00\xf6\x01\x7d\x00\xc0\x00\x73\x03\xc1\x00\x84\x01\x85\x01\x65\x03\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x22\x02\x74\x03\x2b\x03\xce\x00\xcf\x00\x03\x02\x7d\x00\x50\x03\x57\x01\x83\x00\x87\x01\x95\x00\xe7\x00\xcf\x00\xe8\x00\x61\x03\xe9\x00\xd3\x00\xf6\x01\x63\x03\xc0\x00\x95\x00\xc1\x00\x84\x01\x85\x01\x29\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x05\x00\x6a\x03\x06\x00\x45\x03\x67\x00\x08\x00\x7d\x00\xf1\x00\x46\x03\xe6\x01\x87\x01\xb6\x01\x48\x03\xf1\x00\x4b\x03\xfc\x00\x9d\x00\x9e\x00\xb7\x01\x7b\x00\x7c\x00\x29\x02\xfd\x00\x7b\x00\x7c\x00\x17\x00\x18\x00\x7d\x00\xea\x00\x83\x00\xb8\x01\x7d\x00\xa3\x00\xa4\x00\xfe\x00\x4c\x03\x81\x00\x88\x01\x83\x00\xf6\x01\x4d\x03\xc0\x00\x4f\x03\xc1\x00\x84\x01\x85\x01\x95\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x38\x02\xdb\x01\x1e\x01\xdc\x01\x20\x01\xe5\x02\x7d\x00\xe7\x00\xcf\x00\xe8\x00\x87\x01\xe9\x00\xd3\x00\xa5\x00\xa6\x00\x81\x00\x88\x01\x83\x00\xf6\x01\x55\x03\xc0\x00\x95\x00\xc1\x00\x84\x01\x85\x01\x95\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xf1\x00\x5e\x03\x2d\x03\x2e\x03\x83\x00\x60\x03\x7d\x00\xdb\x01\x1e\x01\x06\x03\x87\x01\xb6\x01\x07\x03\xe7\x00\xcf\x00\x0d\x02\x52\x03\x0a\x03\xb7\x01\x7b\x00\x7c\x00\x3e\x02\x0b\x03\xde\x01\x83\x00\x33\x01\x34\x01\x7d\x00\x35\x01\x36\x01\xb8\x01\x2b\x03\xce\x00\xcf\x00\x03\x02\x10\x03\x81\x00\x88\x01\x83\x00\xf6\x01\x12\x02\xc0\x00\x15\x03\xc1\x00\x84\x01\x85\x01\x25\x03\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xf5\x01\x6f\x02\x3c\x00\xfa\x00\x53\x00\x4a\x00\x7d\x00\x26\x03\xde\x01\x83\x00\x87\x01\x97\x00\x98\x00\x70\x02\x3d\x03\x81\x00\x88\x01\x83\x00\xf6\x01\x3e\x03\xc0\x00\x41\x03\xc1\x00\x84\x01\x85\x01\x97\x02\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xf1\x00\x6d\x03\x31\x00\x32\x00\x9d\x00\x9e\x00\x7d\x00\x5e\x00\xa3\x00\xa4\x00\x87\x01\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x5e\x00\xec\x00\xcf\x01\xed\x00\x5f\x00\x43\x02\xce\x00\xcf\x00\x03\x02\x60\x00\xee\x00\x7b\x00\x7c\x00\x5f\x00\x43\x03\x31\x00\x32\x00\x98\x02\x60\x00\x7d\x00\x81\x00\x88\x01\x83\x00\x61\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xa5\x00\xa6\x00\x95\x00\x61\x00\x99\x02\xfb\x01\xcf\x00\xfc\x01\xcf\x01\xe0\x00\x26\x01\x95\x00\x9b\x02\x31\x00\x32\x00\xa3\x02\x9b\x02\x5d\x02\xf6\x00\xf7\x00\x5e\x02\x5f\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0c\x02\xa2\x02\x81\x00\x88\x01\x83\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\x3c\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x05\x00\xaa\x02\x06\x00\xae\x02\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\xf1\x00\x38\x00\x51\x03\x57\x01\x83\x00\x95\x00\x17\x00\x18\x00\xc9\x02\x39\x00\x05\x00\xca\x02\x06\x00\xd0\x02\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\xd8\x02\x38\x00\x81\x00\xe6\x00\x83\x00\xdb\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\xcf\x01\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\x29\x00\x38\x00\x93\x02\x31\x00\x32\x00\x5e\x00\x17\x00\x18\x00\xe4\x02\x39\x00\xe5\x02\xed\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x12\x02\x5f\x00\x19\x01\xef\x02\xb8\x01\xf1\x02\x60\x00\xf2\x02\xf8\x02\xe6\x02\x1d\x01\x1e\x01\x94\x02\x31\x00\x32\x00\x09\x02\xce\x00\xcf\x00\x03\x02\xf9\x02\x61\x00\xfb\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x32\x02\x1d\x01\x1e\x01\x2e\x02\xf6\x00\xf7\x00\x02\x02\xce\x00\xcf\x00\x03\x02\xfc\x02\xff\x02\x95\x02\x31\x00\x32\x00\x64\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x03\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x1a\x01\x01\x03\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x04\x03\x21\x01\xce\x00\xcf\x00\xd0\x00\x22\x01\xd2\x00\xd3\x00\x05\x00\xf1\x00\x06\x00\x09\x02\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\xf1\x00\x38\x00\x07\x03\x57\x01\x83\x00\x10\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\x12\x02\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\x95\x00\x38\x00\x08\x03\x57\x01\x83\x00\x1d\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\x12\x02\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\x3c\x00\x38\x00\x8b\x01\x31\x00\x32\x00\x30\x02\x17\x00\x18\x00\x12\x02\x39\x00\x31\x02\x12\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x95\x00\x3c\x02\x2f\x01\x0b\x03\xf6\x00\xf7\x00\x2e\x02\xf6\x00\xf7\x00\x32\x02\x1d\x01\x1e\x01\x9d\x01\x31\x00\x32\x00\x02\x02\xce\x00\xcf\x00\x03\x02\x26\x03\xf6\x00\xf7\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x75\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xb8\x02\x57\x01\x83\x00\xb9\x02\x57\x01\x83\x00\x74\x01\x31\x00\x32\x00\xba\x02\x57\x01\x83\x00\xbe\x02\x57\x01\x83\x00\x12\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x01\x4c\x02\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x51\x02\x21\x01\xce\x00\xcf\x00\xd0\x00\x31\x01\xd2\x00\xd3\x00\x05\x00\xf1\x00\x06\x00\x4d\x02\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\x5d\x02\x38\x00\xbf\x02\x57\x01\x83\x00\x62\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\x63\x02\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\x76\x01\x38\x00\xc3\x02\x57\x01\x83\x00\x64\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\x65\x02\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\x7b\x02\x38\x00\x54\x00\x31\x00\x32\x00\xbe\x01\x17\x00\x18\x00\x3f\xfe\x39\x00\x8f\x01\x86\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x8c\x02\xdb\x01\x1e\x01\xdc\x01\x20\x01\xe5\x02\x7f\x01\xe7\x00\xcf\x00\x0d\x02\x80\x01\x81\x01\x30\x00\x31\x00\x32\x00\x02\x02\xce\x00\xcf\x00\x03\x02\xf4\x02\x57\x01\x83\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x75\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xc6\x02\xf6\x00\xf7\x00\x82\x01\x83\x01\x05\x00\x8a\x01\x06\x00\x91\x01\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\x29\x00\x4d\x00\x8f\x01\x77\x01\xde\x01\x83\x00\x17\x00\x18\x00\x2e\x02\xf6\x00\xf7\x00\x9f\x01\xa0\x01\x05\x00\xf1\x00\x06\x00\xa1\x01\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\xa2\x01\x38\x00\xea\x02\xf6\x00\xf7\x00\xa3\x01\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\xa4\x01\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\x95\x00\x38\x00\x7f\x02\x95\x01\xc3\x01\xc4\x01\x17\x00\x18\x00\x99\x00\x39\x00\x6f\x02\x9a\x00\xfa\x00\xc6\x01\x9b\x00\x96\x01\x9c\x00\xc0\x00\xc9\x01\xc1\x00\x97\x01\x98\x01\x70\x02\xc4\x00\x99\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xeb\x02\xf6\x00\xf7\x00\x95\x00\x27\x01\x08\x01\x7d\x00\x28\x01\xcf\x01\xd1\x01\x9a\x01\x2e\x02\xf6\x00\xf7\x00\x29\x01\x7b\x00\x7c\x00\xf9\x02\x57\x01\x83\x00\x02\x03\xf6\x00\xf7\x00\x7d\x00\x3c\x00\x3c\x00\x09\x01\xe5\x01\x3e\xfe\xfe\x00\xd6\x00\xf5\x00\xf6\x00\xf7\x00\x0a\x02\xf6\x00\xf7\x00\x90\x02\xce\x00\xcf\x00\x03\x02\x3e\xfe\xd7\x00\xcf\x01\xe6\xff\x05\x00\x3e\xfe\x06\x00\x3c\x00\x57\x00\x08\x00\x6a\x00\x76\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x3c\x00\xfa\x00\x3e\xfe\x0b\x02\xf6\x00\xf7\x00\xf8\x01\x3c\x00\xe0\x00\x26\x01\x95\x00\x00\x02\x17\x00\x18\x00\xd8\x00\x02\x02\x81\x00\x88\x01\x83\x00\xd9\x00\xda\x00\x29\x00\x85\x00\xe3\x00\x86\x00\x3c\x00\x55\x01\x87\x00\x56\x01\x95\x00\x88\x00\x5a\x01\x89\x00\xdb\x00\x8a\x00\x2c\x01\x77\x02\x78\x02\x83\x00\x8b\x00\x8c\x00\x95\x00\xdc\x00\x82\x02\x5b\x01\x8d\x00\x8e\x00\x66\x01\xdd\x00\x8f\x00\x69\x01\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\xf5\x00\xf6\x00\xf7\x00\x19\x02\x57\x01\x83\x00\xe0\x00\x94\x00\x95\x00\xe1\x00\x1a\x00\x2e\x02\xf6\x00\xf7\x00\x95\x00\xfc\xff\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x71\x01\x72\x01\x22\x00\x3c\x02\x57\x01\x83\x00\x05\x00\x76\x01\x06\x00\x7a\x01\x57\x00\x08\x00\xbc\x01\x23\x00\x7c\x01\x1a\x01\xff\xff\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x40\xfe\x21\x01\xce\x00\xcf\x00\x03\x02\x4c\x00\x3b\x00\x3c\x00\x17\x00\x18\x00\x24\x00\x3d\x00\xda\x00\x3e\x00\x85\x00\x3f\x00\x86\x00\x3e\xfe\x40\x00\x87\x00\x41\x00\x42\x00\x88\x00\x4d\x00\x89\x00\xdb\x00\x8a\x00\x43\x00\x44\x00\x45\x00\x3e\xfe\x8b\x00\x8c\x00\x50\x00\xdc\x00\x3e\xfe\x46\x00\x8d\x00\x8e\x00\x25\x00\xdd\x00\x8f\x00\x47\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x48\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x9c\x01\x95\x00\x9d\x01\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\xc9\x01\x57\x01\x83\x00\x54\x00\x56\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x57\x00\xda\x00\x22\x00\x5b\x00\x63\x00\x05\x00\x5e\x00\x06\x00\x64\x00\x57\x00\x08\x00\x09\x00\x41\x01\x23\x00\xdb\x00\xca\x01\x57\x01\x83\x00\xff\xff\x5f\x00\xd4\x01\xf6\x00\xf7\x00\xdc\x00\x60\x00\xf5\x00\xf6\x00\xf7\x00\x65\x00\xdd\x00\x17\x00\x18\x00\xde\x00\x24\x00\xdf\x00\xd8\xff\x66\x00\xd8\xff\x61\x00\xd8\xff\xd8\xff\x67\x00\xd8\xff\x96\x00\x6d\x00\xd8\xff\x95\x00\xd8\xff\xd8\xff\xd8\xff\x56\x01\x57\x01\x83\x00\xd8\xff\xd8\xff\xd8\xff\x99\x00\xd8\xff\xd8\xff\xff\xff\xd8\xff\xd8\xff\x25\x00\xd8\xff\xd8\xff\x9a\x00\xd8\xff\xd8\xff\xd8\xff\xd8\xff\xd8\xff\xd8\xff\xd8\xff\x9b\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd8\xff\xd8\xff\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x63\x01\x57\x01\x83\x00\x9c\x00\xfe\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x04\x02\xce\x00\xcf\x00\xd0\x00\x00\x00\x05\x02\xd3\x00\x83\x01\x00\x00\xc0\x00\x23\x00\xc1\x00\x84\x01\x85\x01\x00\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x6d\x01\x57\x01\x83\x00\x24\x00\x00\x00\xda\x00\x7d\x00\x85\x00\x00\x00\x86\x00\x87\x01\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\xd6\x01\x5d\x03\xfa\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x06\x02\x83\x00\x8d\x00\x8e\x00\x25\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x94\x00\x95\x00\x9d\x01\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\xd6\x01\x0f\x03\xfa\x00\x00\x00\xa6\x01\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x81\x00\x88\x01\x83\x00\xd6\x01\xea\x02\xfa\x00\xd6\x01\xf0\x02\xfa\x00\x23\x00\xa7\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xb7\x00\x00\x00\xb8\x00\x00\x00\xb9\x00\xba\x00\x00\x00\x00\x00\xbb\x00\xbc\x00\x3c\x00\x00\x00\x00\x00\x24\x00\xd6\x01\x01\x02\xfa\x00\x85\x00\x6a\x02\x86\x00\xfa\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x6b\x02\x00\x00\x00\x00\xfe\x01\x8b\x00\x8c\x00\x81\x00\xa8\x01\x83\x00\x00\x00\x8d\x00\x8e\x00\x25\x00\x00\x00\x8f\x00\xff\x01\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x94\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\xd6\x01\x0f\x02\xfa\x00\x5e\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x5f\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x60\x00\x05\x00\x00\x00\x06\x00\x23\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x43\x01\x5f\x00\xa7\x00\xa8\x00\xa9\x00\x61\x00\x60\x00\xf9\x00\x01\x02\xfa\x00\x00\x00\xe0\x00\x00\x00\x95\x00\x00\x00\x24\x00\x00\x00\x17\x00\x18\x00\x85\x00\x61\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\xe0\x00\x88\x00\x95\x00\x89\x00\x00\x00\x8a\x00\xa7\x00\xa8\x00\xa9\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x25\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x94\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x0d\x03\x00\x00\xe7\x00\xcf\x00\x0d\x02\x00\x00\x23\x00\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x24\x00\x3d\x00\x7d\x00\x3e\x00\x00\x00\x3f\x00\xae\x01\x00\x00\x40\x00\x00\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x44\x00\x45\x00\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\x46\x00\x00\x00\x00\x00\x25\x00\xde\x01\x83\x00\x47\x00\x00\x00\x00\x00\x6a\x02\x00\x00\xfa\x00\x00\x00\x00\x00\x48\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x6b\x02\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xf7\x02\x00\x00\x00\x00\x22\x00\x81\x00\xf3\x01\x83\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x3e\x01\x23\x00\x00\x00\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x17\x00\x18\x00\x24\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x5e\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x5f\x00\x62\x01\x00\x00\xfa\x00\x00\x00\x60\x00\xe0\x00\xf4\x00\x95\x00\x25\x00\x3d\xfe\x00\x00\x05\x00\x63\x01\x06\x00\x00\x00\x57\x00\x08\x00\x3f\x01\x61\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x02\x00\x00\x00\x00\x22\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x23\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x24\x00\x03\x01\x00\x00\x91\x00\x92\x00\x93\x00\x61\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x02\x5f\x00\xfa\x00\x00\x00\xe9\x02\x00\x00\x60\x00\x37\x02\x00\x00\x00\x00\x25\x00\x3e\xfe\x6b\x02\x05\x00\x00\x00\x06\x00\x43\x02\x69\x00\x08\x00\x25\x01\x61\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xf1\x01\x00\x00\x00\x00\x22\x00\x00\x00\xe3\x00\x3e\xfe\x05\x00\x00\x00\x06\x00\x5e\x00\x6d\x00\x08\x00\x5e\x00\x23\x00\xe4\x00\xce\x00\xcf\x00\xd0\x00\x3e\xfe\xe5\x00\xd3\x00\x00\x00\x5f\x00\x3e\xfe\x00\x00\x5f\x00\x00\x00\x60\x00\x00\x00\x00\x00\x60\x00\x17\x00\x18\x00\x24\x00\x05\x00\x00\x00\x06\x00\x3e\xfe\x6f\x00\x08\x00\x3e\xfe\x61\x00\x00\x00\xe0\x00\x61\x00\x95\x00\x00\x00\xe0\x00\x26\x01\x95\x00\xe0\x00\x26\x01\x95\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x17\x00\x18\x00\x00\x00\x25\x00\xf2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xe6\x00\x83\x00\x00\x00\x3e\xfe\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd6\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x5a\x02\x00\x00\xd7\x00\x5b\x02\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x23\x00\x5a\x02\x00\x00\x00\x00\x5b\x02\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\xfe\x00\x5c\x02\x57\x03\x5e\x00\x24\x00\x33\x02\x1d\x01\x1e\x01\x00\x00\x23\x00\x00\x00\x04\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x02\x20\x03\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x25\x00\x05\x00\x61\x00\x06\x00\x00\x00\x57\x00\x08\x00\x40\x01\xe0\x00\x00\x00\x95\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x25\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x03\x83\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x1c\x02\x00\x00\x00\x00\x22\x00\x00\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x2a\x02\x00\x00\xe7\x00\xcf\x00\xe8\x00\x23\x00\xe9\x00\xd3\x00\x00\x00\x1a\x00\x00\x00\x5a\x02\x00\x00\x00\x00\x5b\x02\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x02\x3d\xfe\x00\x00\x05\x00\x23\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x49\x01\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x5c\x02\x00\x00\x25\x00\x24\x00\xde\x01\x83\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x01\x25\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x21\x01\xce\x00\xcf\x00\x03\x02\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x31\x02\x00\x00\xe7\x00\xcf\x00\xe8\x00\x23\x00\xe9\x00\xd3\x00\x00\x00\x1a\x00\x00\x00\x5a\x02\x00\x00\x00\x00\x5b\x02\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x05\x00\x23\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x4a\x01\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x5c\x02\x00\x00\x25\x00\x24\x00\xde\x01\x83\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\xdd\x01\x25\x00\xe7\x00\xcf\x00\xe8\x00\x00\x00\xe9\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x2a\x02\x00\x00\xe7\x00\xcf\x00\x0d\x02\x00\x00\x23\x00\x1a\x00\x18\x03\x00\x00\xde\x01\x83\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x5c\x02\x00\x00\x00\x00\x24\x00\x00\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x31\x02\x23\x00\xe7\x00\xcf\x00\x0d\x02\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x24\x00\x00\x00\x25\x00\xde\x01\x83\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\xdd\x01\x23\x00\xe7\x00\xcf\x00\x0d\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x5c\x02\x00\x00\x25\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x01\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x01\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x1a\x00\x3d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\xbe\x01\x00\x00\xed\x02\x24\x00\x00\x00\x00\x00\xd7\x01\x1d\x01\x1e\x01\x00\x00\x23\x00\x1a\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x51\x01\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x24\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xd9\x01\x83\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x25\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x45\x01\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x44\x01\x69\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x24\x00\x57\x00\x08\x00\x09\x00\x42\x01\x23\x00\x05\x00\x00\x00\x06\x00\x1a\x00\x57\x00\x08\x00\x6a\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x17\x00\x18\x00\x22\x00\x24\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x17\x00\x18\x00\x00\x00\x05\x00\x23\x00\x06\x00\x00\x00\x57\x00\x08\x00\xa9\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x25\x00\x24\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x25\x00\x00\x00\x33\x02\x1d\x01\x1e\x01\x34\x02\x20\x01\x00\x00\x04\x02\xce\x00\xcf\x00\x03\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x05\x00\x00\x00\x06\x00\x00\x00\x72\x00\x08\x00\x00\x00\x00\x00\x00\x00\x71\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x35\x02\x83\x00\x22\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x24\x00\x73\x00\x08\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x17\x00\x18\x00\x22\x00\x24\x00\xde\x02\x00\x00\x00\x00\x25\x00\xd7\x01\x1d\x01\x1e\x01\xd8\x01\x20\x01\x23\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x25\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x01\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x63\x01\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x81\x00\xd9\x01\x83\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd7\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x23\x00\xd9\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x61\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x95\x00\x00\x00\x24\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x6f\x02\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x94\x00\x95\x00\xe1\x00\x25\x00\x05\x00\x70\x02\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x46\x01\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x02\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x6b\x02\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x94\x00\x95\x00\x6a\x02\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x6b\x02\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x94\x00\x95\x00\x6a\x02\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x6b\x02\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x03\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x04\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x2e\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x2f\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xba\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xbb\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x03\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x04\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x2e\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x2f\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x03\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x04\x01\x95\x00\x62\x01\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x63\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x2e\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x2f\x01\x95\x00\xd6\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xd7\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\xd6\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xd7\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xba\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xbb\x01\x95\x00\xd6\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xd7\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x03\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x04\x01\x95\x00\x6f\x02\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x70\x02\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x2e\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x2f\x01\x95\x00\x62\x01\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x63\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\xfe\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xf4\x00\x95\x00\x00\x00\xda\x00\x00\x00\x85\x00\xff\x01\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\xd6\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\xf4\x00\x95\x00\x87\x00\xed\x00\x00\x00\x88\x00\xd7\x00\x89\x00\xdb\x00\x8a\x00\xee\x00\x7b\x00\x7c\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x2a\x03\x7d\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x2b\x03\xce\x00\xcf\x00\x03\x02\x00\x00\xe0\x00\xf4\x00\x95\x00\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\xec\x00\x87\x00\xed\x00\xfe\x01\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\xee\x00\x7b\x00\x7c\x00\x00\x00\x8b\x00\x8c\x00\xff\x01\xdc\x00\x00\x00\x7d\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x62\x01\x2d\x03\xfa\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xf4\x00\x95\x00\x00\x00\xf1\x00\x00\x00\x63\x01\x00\x00\x5d\x02\xf6\x00\xf7\x00\x5e\x02\x5f\x02\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\xe6\x01\x87\x00\xb6\x01\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xb7\x01\x7b\x00\x7c\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x8d\x00\x8e\x00\xb8\x01\x00\x00\x8f\x00\x00\x00\x00\x00\xf3\x00\x3e\xfe\x91\x00\x92\x00\x93\x00\xf1\x00\x99\x02\xce\x00\xcf\x00\x03\x02\x00\x00\xe0\x00\xf4\x00\x95\x00\x3e\xfe\x00\x00\x00\x00\xa9\x01\xaa\x01\x3e\xfe\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x95\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x1e\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\xcf\x00\x0d\x02\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\xf1\x00\x00\x00\x00\x00\xb2\x01\xf6\x00\xf7\x00\xb3\x01\xb4\x01\x00\x00\x00\x00\x00\x00\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xbd\x02\x83\x00\xe7\x00\xcf\x00\x0d\x02\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\x00\x00\x00\x00\x00\x00\xb2\x01\xf6\x00\xf7\x00\xb3\x01\xb4\x01\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xc2\x02\x83\x00\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\x00\x00\x00\x00\x00\x00\xb2\x01\xf6\x00\xf7\x00\xb3\x01\xb4\x01\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xb5\x01\x83\x00\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\xf2\x01\x00\x00\x00\x00\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x27\x01\x08\x01\x00\x00\x28\x01\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xae\x01\x29\x01\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\xfb\x00\x09\x01\xfc\x00\x00\x00\x81\x00\xf3\x01\x83\x00\xc4\x02\x00\x00\xfd\x00\x7b\x00\x7c\x00\x70\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x71\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x00\x00\x00\x65\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x00\x00\x00\x81\x00\xf3\x01\x83\x00\x00\x00\xec\x00\x00\x00\xed\x00\x00\x00\xfb\x00\x00\x00\xfc\x00\x00\x00\x00\x00\xee\x00\x7b\x00\x7c\x00\x2c\x01\xfd\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x2b\x02\x1e\x01\x00\x00\x00\x00\x67\x02\x68\x02\xfb\x01\xcf\x00\xfc\x01\x8e\x02\xce\x00\xcf\x00\x03\x02\x00\x00\xec\x00\xfe\x00\xed\x00\x00\x00\x5d\x02\xf6\x00\xf7\x00\x5e\x02\x5f\x02\xee\x00\x7b\x00\x7c\x00\x04\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x00\x00\x00\x8d\x02\xce\x00\xcf\x00\x03\x02\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\xf1\x00\x00\x00\x00\x00\x8f\x02\x83\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\x27\x03\x83\x00\x00\x00\x00\x00\x00\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\xca\x02\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x7d\x00\x00\x00\x00\x00\x05\x00\x7e\x00\x06\x00\x00\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\x00\x00\xcb\x02\x00\x00\x13\x02\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x4d\x01\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x26\x02\x79\x00\x7a\x00\x7b\x00\x7c\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x05\x00\x7e\x00\x06\x00\x00\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\x00\x00\x27\x02\x00\x00\x39\x02\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x3a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x02\x76\x00\x7d\x00\x77\x00\x00\x00\x78\x00\x7e\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x29\x03\xb1\x02\xb2\x02\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xb3\x02\x00\x00\xaf\x02\x76\x00\x00\x00\x77\x00\xc0\x01\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\xb0\x02\xb1\x02\xb2\x02\x00\x00\x00\x00\x7d\x00\x05\x00\x00\x00\x06\x00\xb3\x02\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\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x81\x00\xb4\x02\x83\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x81\x00\xb4\x02\x83\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7b\x02\x7e\x00\x00\x00\x00\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\xfc\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\xfd\x00\x7b\x00\x7c\x00\x00\x00\x7d\x00\x7e\x02\x00\x00\x00\x00\x7e\x00\x7d\x00\x00\x00\x00\x00\xfe\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x6b\x01\x7d\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x5b\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x01\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\xfe\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x81\x00\x82\x00\x83\x00\x5f\x00\x8b\x00\x8c\x00\x5f\x01\x60\x01\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\xb8\x01\x81\x00\x82\x00\x83\x00\x05\x00\x95\x00\x06\x00\x00\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\xed\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x1e\x02\x1f\x02\x83\x00\x05\x00\x00\x00\x06\x00\x00\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\xed\x01\x00\x00\x00\x00\x00\x00\xfe\x00\xf5\x02\x00\x00\x17\x00\x18\x00\x33\x02\x1d\x01\x1e\x01\x00\x00\xf1\x00\xec\x01\x04\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xb8\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x02\x1d\x01\x1e\x01\xe7\x02\x20\x01\x00\x00\x09\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x05\x00\x00\x00\x06\x00\x00\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\xed\x01\x00\x00\x77\x02\x28\x03\x83\x00\xee\x01\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\xef\x01\x83\x00\xbb\x02\x00\x00\x00\x00\x00\x00\xd7\x01\x1d\x01\x1e\x01\x00\x00\x00\x00\x00\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\xa7\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xd6\x01\x00\x00\x00\x00\x00\x00\xd7\x01\x1d\x01\x1e\x01\xd8\x01\x20\x01\x58\x01\xe4\x00\xce\x00\xcf\x00\xd0\x00\x00\x00\xe5\x00\xd3\x00\xc0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xbc\x02\x83\x00\xa7\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x05\x00\x00\x00\x06\x00\x00\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\xfc\x02\x81\x00\xd9\x01\x83\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x37\x03\x00\x00\x00\x00\x81\x00\xc1\x02\x83\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\xb6\x02\x00\x00\xb7\x02\x00\x00\x00\x00\x94\x00\x95\x00\xb8\x02\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x0f\x01\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x94\x00\x95\x00\xb8\x02\x12\x01\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\xda\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x5e\x00\xdc\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\xdb\x00\x00\x00\xde\x00\x00\x00\xdf\x00\x5f\x00\x00\x00\x00\x00\x61\x00\xdc\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x95\x00\x00\x00\xde\x00\x00\x00\xdf\x00\x3c\x00\x00\x00\x00\x00\x61\x00\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x95\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x02\x94\x00\x95\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x01\x94\x00\x95\x00\x3c\xfe\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x00\x00\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x00\x00\x00\x00\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x3c\xfe\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xba\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x01\x95\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x94\x00\x95\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\xf4\x00\x95\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x00\x00\x00\x00\xde\x00\x00\x00\xdf\x00\x00\x00\x92\x00\x93\x00\x61\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\xb8\x02\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\xba\x01\x00\x00\x91\x00\x92\x00\x93\x00\x61\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\xbb\x01\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x03\x01\x00\x00\x91\x00\x92\x00\x93\x00\x61\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x04\x01\x95\x00\x3c\xfe\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x00\x00\x00\x00\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x00\x00\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x00\x00\x3c\xfe\x00\x00\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x3c\xfe\x3c\xfe\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\xba\x01\x00\x00\x91\x00\x92\x00\x93\x00\x61\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\xbb\x01\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x94\x00\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\xf3\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\xf4\x00\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\x51\x02\x00\x00\xcc\x02\x53\x02\x54\x02\x55\x02\x56\x02\x05\x00\x00\x00\x06\x00\x00\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\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x51\x02\x58\x02\x52\x02\x53\x02\x54\x02\x55\x02\x56\x02\x05\x00\x00\x00\x06\x00\x00\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\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x1d\x03\x58\x02\x00\x00\x1e\x03\x54\x02\x55\x02\x56\x02\x05\x00\x00\x00\x06\x00\x00\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\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x58\x02\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x03\x17\x00\x18\x00\x00\x00\x58\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x03\x05\x00\x00\x00\x06\x00\x00\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\x57\x02\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x57\x02\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\xed\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x17\x00\x18\x00\x00\x00\x05\x00\x00\x00\x06\x00\xf1\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\x00\x00\x4d\x00\x00\x00\x41\x03\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x4d\x00\x00\x00\x42\x03\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x4d\x00\x00\x00\x91\x02\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x4d\x00\x00\x00\x92\x02\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x75\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x76\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x49\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x38\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x39\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x3a\x01\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\x3b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x4f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x52\x01\x00\x00\x00\x00\x53\x01\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x78\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x7c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x7d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x5e\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x04\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x02\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x44\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x46\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x01\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x3d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\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\x6a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\x45\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\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\xc4\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x51\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x4c\x01\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4b\x01\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x47\x01\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x48\x01\x00\x00\x00\x00\x17\x00\x18\x00\x6b\x02\x1d\x01\x1e\x01\x00\x00\x00\x00\x00\x00\x6c\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x72\x02\x1d\x01\x1e\x01\x00\x00\x00\x00\x00\x00\x73\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x03\x74\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x34\x03\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x33\x03\x40\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x34\x03\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x40\x02\xce\x00\xcf\x00\x03\x02\x3f\x02\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x40\x02\xce\x00\xcf\x00\x03\x02\x1a\x01\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x40\x02\xce\x00\xcf\x00\x03\x02\x30\x01\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x40\x02\xce\x00\xcf\x00\x03\x02\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 = array (3, 462) [+	(3 , happyReduce_3),+	(4 , happyReduce_4),+	(5 , happyReduce_5),+	(6 , happyReduce_6),+	(7 , happyReduce_7),+	(8 , happyReduce_8),+	(9 , happyReduce_9),+	(10 , happyReduce_10),+	(11 , happyReduce_11),+	(12 , happyReduce_12),+	(13 , happyReduce_13),+	(14 , happyReduce_14),+	(15 , happyReduce_15),+	(16 , happyReduce_16),+	(17 , happyReduce_17),+	(18 , happyReduce_18),+	(19 , happyReduce_19),+	(20 , happyReduce_20),+	(21 , happyReduce_21),+	(22 , happyReduce_22),+	(23 , happyReduce_23),+	(24 , happyReduce_24),+	(25 , happyReduce_25),+	(26 , happyReduce_26),+	(27 , happyReduce_27),+	(28 , happyReduce_28),+	(29 , happyReduce_29),+	(30 , happyReduce_30),+	(31 , happyReduce_31),+	(32 , happyReduce_32),+	(33 , happyReduce_33),+	(34 , happyReduce_34),+	(35 , happyReduce_35),+	(36 , happyReduce_36),+	(37 , happyReduce_37),+	(38 , happyReduce_38),+	(39 , happyReduce_39),+	(40 , happyReduce_40),+	(41 , happyReduce_41),+	(42 , happyReduce_42),+	(43 , happyReduce_43),+	(44 , happyReduce_44),+	(45 , happyReduce_45),+	(46 , happyReduce_46),+	(47 , happyReduce_47),+	(48 , happyReduce_48),+	(49 , happyReduce_49),+	(50 , happyReduce_50),+	(51 , happyReduce_51),+	(52 , happyReduce_52),+	(53 , happyReduce_53),+	(54 , happyReduce_54),+	(55 , happyReduce_55),+	(56 , happyReduce_56),+	(57 , happyReduce_57),+	(58 , happyReduce_58),+	(59 , happyReduce_59),+	(60 , happyReduce_60),+	(61 , happyReduce_61),+	(62 , happyReduce_62),+	(63 , happyReduce_63),+	(64 , happyReduce_64),+	(65 , happyReduce_65),+	(66 , happyReduce_66),+	(67 , happyReduce_67),+	(68 , happyReduce_68),+	(69 , happyReduce_69),+	(70 , happyReduce_70),+	(71 , happyReduce_71),+	(72 , happyReduce_72),+	(73 , happyReduce_73),+	(74 , happyReduce_74),+	(75 , happyReduce_75),+	(76 , happyReduce_76),+	(77 , happyReduce_77),+	(78 , happyReduce_78),+	(79 , happyReduce_79),+	(80 , happyReduce_80),+	(81 , happyReduce_81),+	(82 , happyReduce_82),+	(83 , happyReduce_83),+	(84 , happyReduce_84),+	(85 , happyReduce_85),+	(86 , happyReduce_86),+	(87 , happyReduce_87),+	(88 , happyReduce_88),+	(89 , happyReduce_89),+	(90 , happyReduce_90),+	(91 , happyReduce_91),+	(92 , happyReduce_92),+	(93 , happyReduce_93),+	(94 , happyReduce_94),+	(95 , happyReduce_95),+	(96 , happyReduce_96),+	(97 , happyReduce_97),+	(98 , happyReduce_98),+	(99 , happyReduce_99),+	(100 , happyReduce_100),+	(101 , happyReduce_101),+	(102 , happyReduce_102),+	(103 , happyReduce_103),+	(104 , happyReduce_104),+	(105 , happyReduce_105),+	(106 , happyReduce_106),+	(107 , happyReduce_107),+	(108 , happyReduce_108),+	(109 , happyReduce_109),+	(110 , happyReduce_110),+	(111 , happyReduce_111),+	(112 , happyReduce_112),+	(113 , happyReduce_113),+	(114 , happyReduce_114),+	(115 , happyReduce_115),+	(116 , happyReduce_116),+	(117 , happyReduce_117),+	(118 , happyReduce_118),+	(119 , happyReduce_119),+	(120 , happyReduce_120),+	(121 , happyReduce_121),+	(122 , happyReduce_122),+	(123 , happyReduce_123),+	(124 , happyReduce_124),+	(125 , happyReduce_125),+	(126 , happyReduce_126),+	(127 , happyReduce_127),+	(128 , happyReduce_128),+	(129 , happyReduce_129),+	(130 , happyReduce_130),+	(131 , happyReduce_131),+	(132 , happyReduce_132),+	(133 , happyReduce_133),+	(134 , happyReduce_134),+	(135 , happyReduce_135),+	(136 , happyReduce_136),+	(137 , happyReduce_137),+	(138 , happyReduce_138),+	(139 , happyReduce_139),+	(140 , happyReduce_140),+	(141 , happyReduce_141),+	(142 , happyReduce_142),+	(143 , happyReduce_143),+	(144 , happyReduce_144),+	(145 , happyReduce_145),+	(146 , happyReduce_146),+	(147 , happyReduce_147),+	(148 , happyReduce_148),+	(149 , happyReduce_149),+	(150 , happyReduce_150),+	(151 , happyReduce_151),+	(152 , happyReduce_152),+	(153 , happyReduce_153),+	(154 , happyReduce_154),+	(155 , happyReduce_155),+	(156 , happyReduce_156),+	(157 , happyReduce_157),+	(158 , happyReduce_158),+	(159 , happyReduce_159),+	(160 , happyReduce_160),+	(161 , happyReduce_161),+	(162 , happyReduce_162),+	(163 , happyReduce_163),+	(164 , happyReduce_164),+	(165 , happyReduce_165),+	(166 , happyReduce_166),+	(167 , happyReduce_167),+	(168 , happyReduce_168),+	(169 , happyReduce_169),+	(170 , happyReduce_170),+	(171 , happyReduce_171),+	(172 , happyReduce_172),+	(173 , happyReduce_173),+	(174 , happyReduce_174),+	(175 , happyReduce_175),+	(176 , happyReduce_176),+	(177 , happyReduce_177),+	(178 , happyReduce_178),+	(179 , happyReduce_179),+	(180 , happyReduce_180),+	(181 , happyReduce_181),+	(182 , happyReduce_182),+	(183 , happyReduce_183),+	(184 , happyReduce_184),+	(185 , happyReduce_185),+	(186 , happyReduce_186),+	(187 , happyReduce_187),+	(188 , happyReduce_188),+	(189 , happyReduce_189),+	(190 , happyReduce_190),+	(191 , happyReduce_191),+	(192 , happyReduce_192),+	(193 , happyReduce_193),+	(194 , happyReduce_194),+	(195 , happyReduce_195),+	(196 , happyReduce_196),+	(197 , happyReduce_197),+	(198 , happyReduce_198),+	(199 , happyReduce_199),+	(200 , happyReduce_200),+	(201 , happyReduce_201),+	(202 , happyReduce_202),+	(203 , happyReduce_203),+	(204 , happyReduce_204),+	(205 , happyReduce_205),+	(206 , happyReduce_206),+	(207 , happyReduce_207),+	(208 , happyReduce_208),+	(209 , happyReduce_209),+	(210 , happyReduce_210),+	(211 , happyReduce_211),+	(212 , happyReduce_212),+	(213 , happyReduce_213),+	(214 , happyReduce_214),+	(215 , happyReduce_215),+	(216 , happyReduce_216),+	(217 , happyReduce_217),+	(218 , happyReduce_218),+	(219 , happyReduce_219),+	(220 , happyReduce_220),+	(221 , happyReduce_221),+	(222 , happyReduce_222),+	(223 , happyReduce_223),+	(224 , happyReduce_224),+	(225 , happyReduce_225),+	(226 , happyReduce_226),+	(227 , happyReduce_227),+	(228 , happyReduce_228),+	(229 , happyReduce_229),+	(230 , happyReduce_230),+	(231 , happyReduce_231),+	(232 , happyReduce_232),+	(233 , happyReduce_233),+	(234 , happyReduce_234),+	(235 , happyReduce_235),+	(236 , happyReduce_236),+	(237 , happyReduce_237),+	(238 , happyReduce_238),+	(239 , happyReduce_239),+	(240 , happyReduce_240),+	(241 , happyReduce_241),+	(242 , happyReduce_242),+	(243 , happyReduce_243),+	(244 , happyReduce_244),+	(245 , happyReduce_245),+	(246 , happyReduce_246),+	(247 , happyReduce_247),+	(248 , happyReduce_248),+	(249 , happyReduce_249),+	(250 , happyReduce_250),+	(251 , happyReduce_251),+	(252 , happyReduce_252),+	(253 , happyReduce_253),+	(254 , happyReduce_254),+	(255 , happyReduce_255),+	(256 , happyReduce_256),+	(257 , happyReduce_257),+	(258 , happyReduce_258),+	(259 , happyReduce_259),+	(260 , happyReduce_260),+	(261 , happyReduce_261),+	(262 , happyReduce_262),+	(263 , happyReduce_263),+	(264 , happyReduce_264),+	(265 , happyReduce_265),+	(266 , happyReduce_266),+	(267 , happyReduce_267),+	(268 , happyReduce_268),+	(269 , happyReduce_269),+	(270 , happyReduce_270),+	(271 , happyReduce_271),+	(272 , happyReduce_272),+	(273 , happyReduce_273),+	(274 , happyReduce_274),+	(275 , happyReduce_275),+	(276 , happyReduce_276),+	(277 , happyReduce_277),+	(278 , happyReduce_278),+	(279 , happyReduce_279),+	(280 , happyReduce_280),+	(281 , happyReduce_281),+	(282 , happyReduce_282),+	(283 , happyReduce_283),+	(284 , happyReduce_284),+	(285 , happyReduce_285),+	(286 , happyReduce_286),+	(287 , happyReduce_287),+	(288 , happyReduce_288),+	(289 , happyReduce_289),+	(290 , happyReduce_290),+	(291 , happyReduce_291),+	(292 , happyReduce_292),+	(293 , happyReduce_293),+	(294 , happyReduce_294),+	(295 , happyReduce_295),+	(296 , happyReduce_296),+	(297 , happyReduce_297),+	(298 , happyReduce_298),+	(299 , happyReduce_299),+	(300 , happyReduce_300),+	(301 , happyReduce_301),+	(302 , happyReduce_302),+	(303 , happyReduce_303),+	(304 , happyReduce_304),+	(305 , happyReduce_305),+	(306 , happyReduce_306),+	(307 , happyReduce_307),+	(308 , happyReduce_308),+	(309 , happyReduce_309),+	(310 , happyReduce_310),+	(311 , happyReduce_311),+	(312 , happyReduce_312),+	(313 , happyReduce_313),+	(314 , happyReduce_314),+	(315 , happyReduce_315),+	(316 , happyReduce_316),+	(317 , happyReduce_317),+	(318 , happyReduce_318),+	(319 , happyReduce_319),+	(320 , happyReduce_320),+	(321 , happyReduce_321),+	(322 , happyReduce_322),+	(323 , happyReduce_323),+	(324 , happyReduce_324),+	(325 , happyReduce_325),+	(326 , happyReduce_326),+	(327 , happyReduce_327),+	(328 , happyReduce_328),+	(329 , happyReduce_329),+	(330 , happyReduce_330),+	(331 , happyReduce_331),+	(332 , happyReduce_332),+	(333 , happyReduce_333),+	(334 , happyReduce_334),+	(335 , happyReduce_335),+	(336 , happyReduce_336),+	(337 , happyReduce_337),+	(338 , happyReduce_338),+	(339 , happyReduce_339),+	(340 , happyReduce_340),+	(341 , happyReduce_341),+	(342 , happyReduce_342),+	(343 , happyReduce_343),+	(344 , happyReduce_344),+	(345 , happyReduce_345),+	(346 , happyReduce_346),+	(347 , happyReduce_347),+	(348 , happyReduce_348),+	(349 , happyReduce_349),+	(350 , happyReduce_350),+	(351 , happyReduce_351),+	(352 , happyReduce_352),+	(353 , happyReduce_353),+	(354 , happyReduce_354),+	(355 , happyReduce_355),+	(356 , happyReduce_356),+	(357 , happyReduce_357),+	(358 , happyReduce_358),+	(359 , happyReduce_359),+	(360 , happyReduce_360),+	(361 , happyReduce_361),+	(362 , happyReduce_362),+	(363 , happyReduce_363),+	(364 , happyReduce_364),+	(365 , happyReduce_365),+	(366 , happyReduce_366),+	(367 , happyReduce_367),+	(368 , happyReduce_368),+	(369 , happyReduce_369),+	(370 , happyReduce_370),+	(371 , happyReduce_371),+	(372 , happyReduce_372),+	(373 , happyReduce_373),+	(374 , happyReduce_374),+	(375 , happyReduce_375),+	(376 , happyReduce_376),+	(377 , happyReduce_377),+	(378 , happyReduce_378),+	(379 , happyReduce_379),+	(380 , happyReduce_380),+	(381 , happyReduce_381),+	(382 , happyReduce_382),+	(383 , happyReduce_383),+	(384 , happyReduce_384),+	(385 , happyReduce_385),+	(386 , happyReduce_386),+	(387 , happyReduce_387),+	(388 , happyReduce_388),+	(389 , happyReduce_389),+	(390 , happyReduce_390),+	(391 , happyReduce_391),+	(392 , happyReduce_392),+	(393 , happyReduce_393),+	(394 , happyReduce_394),+	(395 , happyReduce_395),+	(396 , happyReduce_396),+	(397 , happyReduce_397),+	(398 , happyReduce_398),+	(399 , happyReduce_399),+	(400 , happyReduce_400),+	(401 , happyReduce_401),+	(402 , happyReduce_402),+	(403 , happyReduce_403),+	(404 , happyReduce_404),+	(405 , happyReduce_405),+	(406 , happyReduce_406),+	(407 , happyReduce_407),+	(408 , happyReduce_408),+	(409 , happyReduce_409),+	(410 , happyReduce_410),+	(411 , happyReduce_411),+	(412 , happyReduce_412),+	(413 , happyReduce_413),+	(414 , happyReduce_414),+	(415 , happyReduce_415),+	(416 , happyReduce_416),+	(417 , happyReduce_417),+	(418 , happyReduce_418),+	(419 , happyReduce_419),+	(420 , happyReduce_420),+	(421 , happyReduce_421),+	(422 , happyReduce_422),+	(423 , happyReduce_423),+	(424 , happyReduce_424),+	(425 , happyReduce_425),+	(426 , happyReduce_426),+	(427 , happyReduce_427),+	(428 , happyReduce_428),+	(429 , happyReduce_429),+	(430 , happyReduce_430),+	(431 , happyReduce_431),+	(432 , happyReduce_432),+	(433 , happyReduce_433),+	(434 , happyReduce_434),+	(435 , happyReduce_435),+	(436 , happyReduce_436),+	(437 , happyReduce_437),+	(438 , happyReduce_438),+	(439 , happyReduce_439),+	(440 , happyReduce_440),+	(441 , happyReduce_441),+	(442 , happyReduce_442),+	(443 , happyReduce_443),+	(444 , happyReduce_444),+	(445 , happyReduce_445),+	(446 , happyReduce_446),+	(447 , happyReduce_447),+	(448 , happyReduce_448),+	(449 , happyReduce_449),+	(450 , happyReduce_450),+	(451 , happyReduce_451),+	(452 , happyReduce_452),+	(453 , happyReduce_453),+	(454 , happyReduce_454),+	(455 , happyReduce_455),+	(456 , happyReduce_456),+	(457 , happyReduce_457),+	(458 , happyReduce_458),+	(459 , happyReduce_459),+	(460 , happyReduce_460),+	(461 , happyReduce_461),+	(462 , happyReduce_462)+	]++happy_n_terms = 102 :: Int+happy_n_nonterms = 125 :: Int++happyReduce_3 = happyMonadReduce 1# 0# happyReduction_3+happyReduction_3 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut7 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CTranslUnit (reverse happy_var_1))}+	) (\r -> happyReturn (happyIn6 r))++happyReduce_4 = happySpecReduce_0  1# happyReduction_4+happyReduction_4  =  happyIn7+		 (empty+	)++happyReduce_5 = happySpecReduce_2  1# happyReduction_5+happyReduction_5 happy_x_2+	happy_x_1+	 =  case happyOut7 happy_x_1 of { happy_var_1 -> +	happyIn7+		 (happy_var_1+	)}++happyReduce_6 = happySpecReduce_2  1# happyReduction_6+happyReduction_6 happy_x_2+	happy_x_1+	 =  case happyOut7 happy_x_1 of { happy_var_1 -> +	case happyOut8 happy_x_2 of { happy_var_2 -> +	happyIn7+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_7 = happySpecReduce_1  2# happyReduction_7+happyReduction_7 happy_x_1+	 =  case happyOut9 happy_x_1 of { happy_var_1 -> +	happyIn8+		 (CFDefExt happy_var_1+	)}++happyReduce_8 = happySpecReduce_1  2# happyReduction_8+happyReduction_8 happy_x_1+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> +	happyIn8+		 (CDeclExt happy_var_1+	)}++happyReduce_9 = happySpecReduce_2  2# happyReduction_9+happyReduction_9 happy_x_2+	happy_x_1+	 =  case happyOut8 happy_x_2 of { happy_var_2 -> +	happyIn8+		 (happy_var_2+	)}++happyReduce_10 = happyReduce 5# 2# happyReduction_10+happyReduction_10 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut122 happy_x_3 of { happy_var_3 -> +	happyIn8+		 (CAsmExt happy_var_3+	) `HappyStk` happyRest}++happyReduce_11 = happyMonadReduce 2# 3# happyReduction_11+happyReduction_11 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut10 happy_x_1 of { happy_var_1 -> +	case happyOut13 happy_x_2 of { happy_var_2 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 [] happy_var_2))}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_12 = happyMonadReduce 3# 3# happyReduction_12+happyReduction_12 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( leaveScope >> (withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 [] happy_var_3))}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_13 = happyMonadReduce 3# 3# happyReduction_13+happyReduction_13 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_14 = happyMonadReduce 3# 3# happyReduction_14+happyReduction_14 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_15 = happyMonadReduce 3# 3# happyReduction_15+happyReduction_15 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_16 = happyMonadReduce 3# 3# happyReduction_16+happyReduction_16 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_17 = happyMonadReduce 4# 3# happyReduction_17+happyReduction_17 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut10 happy_x_3 of { happy_var_3 -> +	case happyOut13 happy_x_4 of { happy_var_4 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_18 = happyMonadReduce 3# 3# happyReduction_18+happyReduction_18 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut75 happy_x_1 of { happy_var_1 -> +	case happyOut32 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 (reverse happy_var_2) happy_var_3)}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_19 = happyMonadReduce 4# 3# happyReduction_19+happyReduction_19 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOut75 happy_x_2 of { happy_var_2 -> +	case happyOut32 happy_x_3 of { happy_var_3 -> +	case happyOut13 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_20 = happyMonadReduce 4# 3# happyReduction_20+happyReduction_20 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> +	case happyOut75 happy_x_2 of { happy_var_2 -> +	case happyOut32 happy_x_3 of { happy_var_3 -> +	case happyOut13 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_21 = happyMonadReduce 4# 3# happyReduction_21+happyReduction_21 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut75 happy_x_2 of { happy_var_2 -> +	case happyOut32 happy_x_3 of { happy_var_3 -> +	case happyOut13 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_22 = happyMonadReduce 4# 3# happyReduction_22+happyReduction_22 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut75 happy_x_2 of { happy_var_2 -> +	case happyOut32 happy_x_3 of { happy_var_3 -> +	case happyOut13 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_23 = happyMonadReduce 4# 3# happyReduction_23+happyReduction_23 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut75 happy_x_2 of { happy_var_2 -> +	case happyOut32 happy_x_3 of { happy_var_3 -> +	case happyOut13 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_24 = happyMonadReduce 5# 3# happyReduction_24+happyReduction_24 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut75 happy_x_3 of { happy_var_3 -> +	case happyOut32 happy_x_4 of { happy_var_4 -> +	case happyOut13 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1  ++ liftCAttrs happy_var_2) happy_var_3 (reverse happy_var_4) happy_var_5)}}}}}+	) (\r -> happyReturn (happyIn9 r))++happyReduce_25 = happyMonadReduce 1# 4# happyReduction_25+happyReduction_25 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut71 happy_x_1 of { happy_var_1 -> +	( let declr = reverseDeclr happy_var_1 in+  	   enterScope >> doFuncParamDeclIdent declr >> return declr)}+	) (\r -> happyReturn (happyIn10 r))++happyReduce_26 = happySpecReduce_1  5# happyReduction_26+happyReduction_26 happy_x_1+	 =  case happyOut12 happy_x_1 of { happy_var_1 -> +	happyIn11+		 (happy_var_1+	)}++happyReduce_27 = happySpecReduce_1  5# happyReduction_27+happyReduction_27 happy_x_1+	 =  case happyOut13 happy_x_1 of { happy_var_1 -> +	happyIn11+		 (happy_var_1+	)}++happyReduce_28 = happySpecReduce_1  5# happyReduction_28+happyReduction_28 happy_x_1+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> +	happyIn11+		 (happy_var_1+	)}++happyReduce_29 = happySpecReduce_1  5# happyReduction_29+happyReduction_29 happy_x_1+	 =  case happyOut22 happy_x_1 of { happy_var_1 -> +	happyIn11+		 (happy_var_1+	)}++happyReduce_30 = happySpecReduce_1  5# happyReduction_30+happyReduction_30 happy_x_1+	 =  case happyOut23 happy_x_1 of { happy_var_1 -> +	happyIn11+		 (happy_var_1+	)}++happyReduce_31 = happySpecReduce_1  5# happyReduction_31+happyReduction_31 happy_x_1+	 =  case happyOut24 happy_x_1 of { happy_var_1 -> +	happyIn11+		 (happy_var_1+	)}++happyReduce_32 = happyMonadReduce 1# 5# happyReduction_32+happyReduction_32 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut25 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 (CAsm happy_var_1))}+	) (\r -> happyReturn (happyIn11 r))++happyReduce_33 = happyMonadReduce 4# 6# happyReduction_33+happyReduction_33 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut124 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	case happyOut11 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_2 $ CLabel happy_var_1 happy_var_4 happy_var_3)}}}}+	) (\r -> happyReturn (happyIn12 r))++happyReduce_34 = happyMonadReduce 4# 6# happyReduction_34+happyReduction_34 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut120 happy_x_2 of { happy_var_2 -> +	case happyOut11 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CCase happy_var_2 happy_var_4)}}}+	) (\r -> happyReturn (happyIn12 r))++happyReduce_35 = happyMonadReduce 3# 6# happyReduction_35+happyReduction_35 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut11 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CDefault happy_var_3)}}+	) (\r -> happyReturn (happyIn12 r))++happyReduce_36 = happyMonadReduce 6# 6# happyReduction_36+happyReduction_36 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut120 happy_x_2 of { happy_var_2 -> +	case happyOut120 happy_x_4 of { happy_var_4 -> +	case happyOut11 happy_x_6 of { happy_var_6 -> +	( withNodeInfo happy_var_1 $ CCases happy_var_2 happy_var_4 happy_var_6)}}}}+	) (\r -> happyReturn (happyIn12 r))++happyReduce_37 = happyMonadReduce 5# 7# happyReduction_37+happyReduction_37 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut16 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CCompound [] (reverse happy_var_3))}}+	) (\r -> happyReturn (happyIn13 r))++happyReduce_38 = happyMonadReduce 6# 7# happyReduction_38+happyReduction_38 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut20 happy_x_3 of { happy_var_3 -> +	case happyOut16 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CCompound (reverse happy_var_3) (reverse happy_var_4))}}}+	) (\r -> happyReturn (happyIn13 r))++happyReduce_39 = happyMonadReduce 0# 8# happyReduction_39+happyReduction_39 (happyRest) tk+	 = happyThen (( enterScope)+	) (\r -> happyReturn (happyIn14 r))++happyReduce_40 = happyMonadReduce 0# 9# happyReduction_40+happyReduction_40 (happyRest) tk+	 = happyThen (( leaveScope)+	) (\r -> happyReturn (happyIn15 r))++happyReduce_41 = happySpecReduce_0  10# happyReduction_41+happyReduction_41  =  happyIn16+		 (empty+	)++happyReduce_42 = happySpecReduce_2  10# happyReduction_42+happyReduction_42 happy_x_2+	happy_x_1+	 =  case happyOut16 happy_x_1 of { happy_var_1 -> +	case happyOut17 happy_x_2 of { happy_var_2 -> +	happyIn16+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_43 = happySpecReduce_1  11# happyReduction_43+happyReduction_43 happy_x_1+	 =  case happyOut11 happy_x_1 of { happy_var_1 -> +	happyIn17+		 (CBlockStmt happy_var_1+	)}++happyReduce_44 = happySpecReduce_1  11# happyReduction_44+happyReduction_44 happy_x_1+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> +	happyIn17+		 (happy_var_1+	)}++happyReduce_45 = happySpecReduce_1  12# happyReduction_45+happyReduction_45 happy_x_1+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> +	happyIn18+		 (CBlockDecl happy_var_1+	)}++happyReduce_46 = happySpecReduce_1  12# happyReduction_46+happyReduction_46 happy_x_1+	 =  case happyOut19 happy_x_1 of { happy_var_1 -> +	happyIn18+		 (CNestedFunDef happy_var_1+	)}++happyReduce_47 = happySpecReduce_2  12# happyReduction_47+happyReduction_47 happy_x_2+	happy_x_1+	 =  case happyOut18 happy_x_2 of { happy_var_2 -> +	happyIn18+		 (happy_var_2+	)}++happyReduce_48 = happyMonadReduce 3# 13# happyReduction_48+happyReduction_48 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}+	) (\r -> happyReturn (happyIn19 r))++happyReduce_49 = happyMonadReduce 3# 13# happyReduction_49+happyReduction_49 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}+	) (\r -> happyReturn (happyIn19 r))++happyReduce_50 = happyMonadReduce 3# 13# happyReduction_50+happyReduction_50 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}+	) (\r -> happyReturn (happyIn19 r))++happyReduce_51 = happyMonadReduce 3# 13# happyReduction_51+happyReduction_51 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_2 of { happy_var_2 -> +	case happyOut13 happy_x_3 of { happy_var_3 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}+	) (\r -> happyReturn (happyIn19 r))++happyReduce_52 = happyMonadReduce 4# 13# happyReduction_52+happyReduction_52 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut10 happy_x_3 of { happy_var_3 -> +	case happyOut13 happy_x_4 of { happy_var_4 -> +	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}+	) (\r -> happyReturn (happyIn19 r))++happyReduce_53 = happySpecReduce_3  14# happyReduction_53+happyReduction_53 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut81 happy_x_2 of { happy_var_2 -> +	happyIn20+		 (happy_var_2+	)}++happyReduce_54 = happyReduce 4# 14# happyReduction_54+happyReduction_54 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut20 happy_x_1 of { happy_var_1 -> +	case happyOut81 happy_x_3 of { happy_var_3 -> +	happyIn20+		 (happy_var_1 `rappendr` happy_var_3+	) `HappyStk` happyRest}}++happyReduce_55 = happyMonadReduce 1# 15# happyReduction_55+happyReduction_55 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CExpr Nothing)}+	) (\r -> happyReturn (happyIn21 r))++happyReduce_56 = happyMonadReduce 2# 15# happyReduction_56+happyReduction_56 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut116 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CExpr (Just happy_var_1))}+	) (\r -> happyReturn (happyIn21 r))++happyReduce_57 = happyMonadReduce 5# 16# happyReduction_57+happyReduction_57 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	case happyOut11 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 Nothing)}}}+	) (\r -> happyReturn (happyIn22 r))++happyReduce_58 = happyMonadReduce 7# 16# happyReduction_58+happyReduction_58 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	case happyOut11 happy_x_5 of { happy_var_5 -> +	case happyOut11 happy_x_7 of { happy_var_7 -> +	( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 (Just happy_var_7))}}}}+	) (\r -> happyReturn (happyIn22 r))++happyReduce_59 = happyMonadReduce 5# 16# happyReduction_59+happyReduction_59 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	case happyOut11 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CSwitch happy_var_3 happy_var_5)}}}+	) (\r -> happyReturn (happyIn22 r))++happyReduce_60 = happyMonadReduce 5# 17# 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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	case happyOut11 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CWhile happy_var_3 happy_var_5 False)}}}+	) (\r -> happyReturn (happyIn23 r))++happyReduce_61 = happyMonadReduce 7# 17# happyReduction_61+happyReduction_61 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut11 happy_x_2 of { happy_var_2 -> +	case happyOut116 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CWhile happy_var_5 happy_var_2 True)}}}+	) (\r -> happyReturn (happyIn23 r))++happyReduce_62 = happyMonadReduce 9# 17# happyReduction_62+happyReduction_62 (happy_x_9 `HappyStk`+	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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut118 happy_x_3 of { happy_var_3 -> +	case happyOut118 happy_x_5 of { happy_var_5 -> +	case happyOut118 happy_x_7 of { happy_var_7 -> +	case happyOut11 happy_x_9 of { happy_var_9 -> +	( withNodeInfo happy_var_1 $ CFor (Left happy_var_3) happy_var_5 happy_var_7 happy_var_9)}}}}}+	) (\r -> happyReturn (happyIn23 r))++happyReduce_63 = happyMonadReduce 10# 17# happyReduction_63+happyReduction_63 (happy_x_10 `HappyStk`+	happy_x_9 `HappyStk`+	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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut31 happy_x_4 of { happy_var_4 -> +	case happyOut118 happy_x_5 of { happy_var_5 -> +	case happyOut118 happy_x_7 of { happy_var_7 -> +	case happyOut11 happy_x_9 of { happy_var_9 -> +	( withNodeInfo happy_var_1 $ CFor (Right happy_var_4) happy_var_5 happy_var_7 happy_var_9)}}}}}+	) (\r -> happyReturn (happyIn23 r))++happyReduce_64 = happyMonadReduce 3# 18# happyReduction_64+happyReduction_64 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut124 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CGoto happy_var_2)}}+	) (\r -> happyReturn (happyIn24 r))++happyReduce_65 = happyMonadReduce 4# 18# happyReduction_65+happyReduction_65 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CGotoPtr happy_var_3)}}+	) (\r -> happyReturn (happyIn24 r))++happyReduce_66 = happyMonadReduce 2# 18# happyReduction_66+happyReduction_66 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CCont)}+	) (\r -> happyReturn (happyIn24 r))++happyReduce_67 = happyMonadReduce 2# 18# happyReduction_67+happyReduction_67 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CBreak)}+	) (\r -> happyReturn (happyIn24 r))++happyReduce_68 = happyMonadReduce 3# 18# happyReduction_68+happyReduction_68 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut118 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CReturn happy_var_2)}}+	) (\r -> happyReturn (happyIn24 r))++happyReduce_69 = happyMonadReduce 6# 19# happyReduction_69+happyReduction_69 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut26 happy_x_2 of { happy_var_2 -> +	case happyOut122 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 [] [] [])}}}+	) (\r -> happyReturn (happyIn25 r))++happyReduce_70 = happyMonadReduce 8# 19# happyReduction_70+happyReduction_70 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut26 happy_x_2 of { happy_var_2 -> +	case happyOut122 happy_x_4 of { happy_var_4 -> +	case happyOut27 happy_x_6 of { happy_var_6 -> +	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 [] [])}}}}+	) (\r -> happyReturn (happyIn25 r))++happyReduce_71 = happyMonadReduce 10# 19# happyReduction_71+happyReduction_71 (happy_x_10 `HappyStk`+	happy_x_9 `HappyStk`+	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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut26 happy_x_2 of { happy_var_2 -> +	case happyOut122 happy_x_4 of { happy_var_4 -> +	case happyOut27 happy_x_6 of { happy_var_6 -> +	case happyOut27 happy_x_8 of { happy_var_8 -> +	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 [])}}}}}+	) (\r -> happyReturn (happyIn25 r))++happyReduce_72 = happyMonadReduce 12# 19# happyReduction_72+happyReduction_72 (happy_x_12 `HappyStk`+	happy_x_11 `HappyStk`+	happy_x_10 `HappyStk`+	happy_x_9 `HappyStk`+	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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut26 happy_x_2 of { happy_var_2 -> +	case happyOut122 happy_x_4 of { happy_var_4 -> +	case happyOut27 happy_x_6 of { happy_var_6 -> +	case happyOut27 happy_x_8 of { happy_var_8 -> +	case happyOut30 happy_x_10 of { happy_var_10 -> +	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 (reverse happy_var_10))}}}}}}+	) (\r -> happyReturn (happyIn25 r))++happyReduce_73 = happySpecReduce_0  20# happyReduction_73+happyReduction_73  =  happyIn26+		 (Nothing+	)++happyReduce_74 = happySpecReduce_1  20# happyReduction_74+happyReduction_74 happy_x_1+	 =  case happyOut60 happy_x_1 of { happy_var_1 -> +	happyIn26+		 (Just happy_var_1+	)}++happyReduce_75 = happySpecReduce_0  21# happyReduction_75+happyReduction_75  =  happyIn27+		 ([]+	)++happyReduce_76 = happySpecReduce_1  21# happyReduction_76+happyReduction_76 happy_x_1+	 =  case happyOut28 happy_x_1 of { happy_var_1 -> +	happyIn27+		 (reverse happy_var_1+	)}++happyReduce_77 = happySpecReduce_1  22# happyReduction_77+happyReduction_77 happy_x_1+	 =  case happyOut29 happy_x_1 of { happy_var_1 -> +	happyIn28+		 (singleton happy_var_1+	)}++happyReduce_78 = happySpecReduce_3  22# happyReduction_78+happyReduction_78 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut28 happy_x_1 of { happy_var_1 -> +	case happyOut29 happy_x_3 of { happy_var_3 -> +	happyIn28+		 (happy_var_1 `snoc` happy_var_3+	)}}++happyReduce_79 = happyMonadReduce 4# 23# happyReduction_79+happyReduction_79 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut122 happy_x_1 of { happy_var_1 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CAsmOperand Nothing happy_var_1 happy_var_3)}}+	) (\r -> happyReturn (happyIn29 r))++happyReduce_80 = happyMonadReduce 7# 23# happyReduction_80+happyReduction_80 (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) tk+	 = happyThen (case happyOutTok happy_x_2 of { (CTokIdent  _ happy_var_2) -> +	case happyOut122 happy_x_4 of { happy_var_4 -> +	case happyOut116 happy_x_6 of { happy_var_6 -> +	( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}+	) (\r -> happyReturn (happyIn29 r))++happyReduce_81 = happyMonadReduce 7# 23# happyReduction_81+happyReduction_81 (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) tk+	 = happyThen (case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> +	case happyOut122 happy_x_4 of { happy_var_4 -> +	case happyOut116 happy_x_6 of { happy_var_6 -> +	( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}+	) (\r -> happyReturn (happyIn29 r))++happyReduce_82 = happySpecReduce_1  24# happyReduction_82+happyReduction_82 happy_x_1+	 =  case happyOut122 happy_x_1 of { happy_var_1 -> +	happyIn30+		 (singleton happy_var_1+	)}++happyReduce_83 = happySpecReduce_3  24# happyReduction_83+happyReduction_83 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> +	case happyOut122 happy_x_3 of { happy_var_3 -> +	happyIn30+		 (happy_var_1 `snoc` happy_var_3+	)}}++happyReduce_84 = happyMonadReduce 2# 25# happyReduction_84+happyReduction_84 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}+	) (\r -> happyReturn (happyIn31 r))++happyReduce_85 = happyMonadReduce 2# 25# happyReduction_85+happyReduction_85 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}+	) (\r -> happyReturn (happyIn31 r))++happyReduce_86 = happySpecReduce_2  25# happyReduction_86+happyReduction_86 happy_x_2+	happy_x_1+	 =  case happyOut35 happy_x_1 of { happy_var_1 -> +	happyIn31+		 (case happy_var_1 of+            CDecl declspecs dies at ->+              CDecl declspecs (List.reverse dies) at+	)}++happyReduce_87 = happySpecReduce_2  25# happyReduction_87+happyReduction_87 happy_x_2+	happy_x_1+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> +	happyIn31+		 (case happy_var_1 of+            CDecl declspecs dies at ->+              CDecl declspecs (List.reverse dies) at+	)}++happyReduce_88 = happySpecReduce_0  26# happyReduction_88+happyReduction_88  =  happyIn32+		 (empty+	)++happyReduce_89 = happySpecReduce_2  26# happyReduction_89+happyReduction_89 happy_x_2+	happy_x_1+	 =  case happyOut32 happy_x_1 of { happy_var_1 -> +	case happyOut31 happy_x_2 of { happy_var_2 -> +	happyIn32+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_90 = happyMonadReduce 4# 27# happyReduction_90+happyReduction_90 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	case happyOut34 happy_x_3 of { happy_var_3 -> +	case happyOut90 happy_x_4 of { happy_var_4 -> +	( let declspecs = reverse happy_var_1 in+  	   do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2+           ; doDeclIdent declspecs declr+           ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_91 = happyMonadReduce 4# 27# happyReduction_91+happyReduction_91 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	case happyOut34 happy_x_3 of { happy_var_3 -> +	case happyOut90 happy_x_4 of { happy_var_4 -> +	( let declspecs = liftTypeQuals happy_var_1 in+  	   do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2+           ; doDeclIdent declspecs declr+           ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_92 = happyMonadReduce 5# 27# happyReduction_92+happyReduction_92 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut71 happy_x_3 of { happy_var_3 -> +	case happyOut34 happy_x_4 of { happy_var_4 -> +	case happyOut90 happy_x_5 of { happy_var_5 -> +	( let declspecs = liftTypeQuals happy_var_1 in+  	   do{ declr <- withAsmNameAttrs happy_var_4 happy_var_3+           ; doDeclIdent declspecs declr+           ; withNodeInfo happy_var_1 $ CDecl (declspecs ++ liftCAttrs happy_var_2) [(Just (reverseDeclr declr), happy_var_5, Nothing)] })}}}}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_93 = happyMonadReduce 4# 27# happyReduction_93+happyReduction_93 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	case happyOut34 happy_x_3 of { happy_var_3 -> +	case happyOut90 happy_x_4 of { happy_var_4 -> +	( let declspecs = liftCAttrs happy_var_1 in+       do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2+           ; doDeclIdent declspecs declr+           ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_94 = happyMonadReduce 6# 27# happyReduction_94+happyReduction_94 (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) tk+	 = happyThen (case happyOut33 happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	case happyOut71 happy_x_4 of { happy_var_4 -> +	case happyOut34 happy_x_5 of { happy_var_5 -> +	case happyOut90 happy_x_6 of { happy_var_6 -> +	( case happy_var_1 of+             CDecl declspecs dies at -> do+               declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4+               doDeclIdent declspecs declr+               return (CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies) at))}}}}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_95 = happySpecReduce_2  28# happyReduction_95+happyReduction_95 happy_x_2+	happy_x_1+	 =  case happyOut63 happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	happyIn34+		 ((happy_var_1,happy_var_2)+	)}}++happyReduce_96 = happyMonadReduce 4# 29# happyReduction_96+happyReduction_96 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> +	case happyOut62 happy_x_2 of { happy_var_2 -> +	case happyOut34 happy_x_3 of { happy_var_3 -> +	case happyOut90 happy_x_4 of { happy_var_4 -> +	( do{+  	   declr <- withAsmNameAttrs happy_var_3 happy_var_2;+  	   doDeclIdent happy_var_1 declr;+       withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}+	) (\r -> happyReturn (happyIn35 r))++happyReduce_97 = happyMonadReduce 4# 29# happyReduction_97+happyReduction_97 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut62 happy_x_2 of { happy_var_2 -> +	case happyOut34 happy_x_3 of { happy_var_3 -> +	case happyOut90 happy_x_4 of { happy_var_4 -> +	( do{+  	   declr <- withAsmNameAttrs happy_var_3 happy_var_2;+  	   doDeclIdent happy_var_1 declr;+       withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}+	) (\r -> happyReturn (happyIn35 r))++happyReduce_98 = happyMonadReduce 6# 29# happyReduction_98+happyReduction_98 (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) tk+	 = happyThen (case happyOut35 happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	case happyOut62 happy_x_4 of { happy_var_4 -> +	case happyOut34 happy_x_5 of { happy_var_5 -> +	case happyOut90 happy_x_6 of { happy_var_6 -> +	( case happy_var_1 of+             CDecl declspecs dies at -> do+               declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4+               doDeclIdent declspecs declr+               return (CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies) at))}}}}}+	) (\r -> happyReturn (happyIn35 r))++happyReduce_99 = happySpecReduce_1  30# happyReduction_99+happyReduction_99 happy_x_1+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> +	happyIn36+		 (reverse happy_var_1+	)}++happyReduce_100 = happySpecReduce_1  30# happyReduction_100+happyReduction_100 happy_x_1+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> +	happyIn36+		 (reverse happy_var_1+	)}++happyReduce_101 = happySpecReduce_1  30# happyReduction_101+happyReduction_101 happy_x_1+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> +	happyIn36+		 (reverse happy_var_1+	)}++happyReduce_102 = happySpecReduce_1  31# happyReduction_102+happyReduction_102 happy_x_1+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> +	happyIn37+		 (singleton (CStorageSpec happy_var_1)+	)}++happyReduce_103 = happySpecReduce_2  31# happyReduction_103+happyReduction_103 happy_x_2+	happy_x_1+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOut39 happy_x_2 of { happy_var_2 -> +	happyIn37+		 (reverseList (liftCAttrs happy_var_1) `snoc` (CStorageSpec happy_var_2)+	)}}++happyReduce_104 = happySpecReduce_2  31# happyReduction_104+happyReduction_104 happy_x_2+	happy_x_1+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut39 happy_x_2 of { happy_var_2 -> +	happyIn37+		 (rmap CTypeQual happy_var_1 `snoc` CStorageSpec happy_var_2+	)}}++happyReduce_105 = happySpecReduce_3  31# happyReduction_105+happyReduction_105 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut39 happy_x_3 of { happy_var_3 -> +	happyIn37+		 ((rmap CTypeQual happy_var_1 `rappend` liftCAttrs happy_var_2) `snoc` CStorageSpec happy_var_3+	)}}}++happyReduce_106 = happySpecReduce_2  31# happyReduction_106+happyReduction_106 happy_x_2+	happy_x_1+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut38 happy_x_2 of { happy_var_2 -> +	happyIn37+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_107 = happySpecReduce_2  31# happyReduction_107+happyReduction_107 happy_x_2+	happy_x_1+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn37+		 (addTrailingAttrs happy_var_1 happy_var_2+	)}}++happyReduce_108 = happySpecReduce_1  32# happyReduction_108+happyReduction_108 happy_x_1+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> +	happyIn38+		 (CStorageSpec happy_var_1+	)}++happyReduce_109 = happySpecReduce_1  32# happyReduction_109+happyReduction_109 happy_x_1+	 =  case happyOut60 happy_x_1 of { happy_var_1 -> +	happyIn38+		 (CTypeQual happy_var_1+	)}++happyReduce_110 = happyMonadReduce 1# 33# happyReduction_110+happyReduction_110 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CTypedef)}+	) (\r -> happyReturn (happyIn39 r))++happyReduce_111 = happyMonadReduce 1# 33# happyReduction_111+happyReduction_111 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CExtern)}+	) (\r -> happyReturn (happyIn39 r))++happyReduce_112 = happyMonadReduce 1# 33# happyReduction_112+happyReduction_112 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CStatic)}+	) (\r -> happyReturn (happyIn39 r))++happyReduce_113 = happyMonadReduce 1# 33# happyReduction_113+happyReduction_113 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CAuto)}+	) (\r -> happyReturn (happyIn39 r))++happyReduce_114 = happyMonadReduce 1# 33# happyReduction_114+happyReduction_114 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CRegister)}+	) (\r -> happyReturn (happyIn39 r))++happyReduce_115 = happyMonadReduce 1# 33# happyReduction_115+happyReduction_115 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CThread)}+	) (\r -> happyReturn (happyIn39 r))++happyReduce_116 = happySpecReduce_1  34# happyReduction_116+happyReduction_116 happy_x_1+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> +	happyIn40+		 (reverse happy_var_1+	)}++happyReduce_117 = happySpecReduce_1  34# happyReduction_117+happyReduction_117 happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	happyIn40+		 (reverse happy_var_1+	)}++happyReduce_118 = happySpecReduce_1  34# happyReduction_118+happyReduction_118 happy_x_1+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> +	happyIn40+		 (reverse happy_var_1+	)}++happyReduce_119 = happyMonadReduce 1# 35# happyReduction_119+happyReduction_119 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CVoidType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_120 = happyMonadReduce 1# 35# happyReduction_120+happyReduction_120 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CCharType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_121 = happyMonadReduce 1# 35# happyReduction_121+happyReduction_121 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CShortType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_122 = happyMonadReduce 1# 35# happyReduction_122+happyReduction_122 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CIntType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_123 = happyMonadReduce 1# 35# happyReduction_123+happyReduction_123 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CLongType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_124 = happyMonadReduce 1# 35# happyReduction_124+happyReduction_124 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CFloatType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_125 = happyMonadReduce 1# 35# happyReduction_125+happyReduction_125 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CDoubleType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_126 = happyMonadReduce 1# 35# happyReduction_126+happyReduction_126 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CSignedType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_127 = happyMonadReduce 1# 35# happyReduction_127+happyReduction_127 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CUnsigType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_128 = happyMonadReduce 1# 35# happyReduction_128+happyReduction_128 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CBoolType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_129 = happyMonadReduce 1# 35# happyReduction_129+happyReduction_129 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CComplexType)}+	) (\r -> happyReturn (happyIn41 r))++happyReduce_130 = happySpecReduce_2  36# happyReduction_130+happyReduction_130 happy_x_2+	happy_x_1+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut41 happy_x_2 of { happy_var_2 -> +	happyIn42+		 (happy_var_1 `snoc` CTypeSpec happy_var_2+	)}}++happyReduce_131 = happySpecReduce_2  36# happyReduction_131+happyReduction_131 happy_x_2+	happy_x_1+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> +	case happyOut39 happy_x_2 of { happy_var_2 -> +	happyIn42+		 (happy_var_1 `snoc` CStorageSpec happy_var_2+	)}}++happyReduce_132 = happySpecReduce_2  36# happyReduction_132+happyReduction_132 happy_x_2+	happy_x_1+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> +	case happyOut38 happy_x_2 of { happy_var_2 -> +	happyIn42+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_133 = happySpecReduce_2  36# happyReduction_133+happyReduction_133 happy_x_2+	happy_x_1+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> +	case happyOut41 happy_x_2 of { happy_var_2 -> +	happyIn42+		 (happy_var_1 `snoc` CTypeSpec happy_var_2+	)}}++happyReduce_134 = happySpecReduce_2  36# happyReduction_134+happyReduction_134 happy_x_2+	happy_x_1+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn42+		 (addTrailingAttrs happy_var_1 happy_var_2+	)}}++happyReduce_135 = happySpecReduce_1  37# happyReduction_135+happyReduction_135 happy_x_1+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> +	happyIn43+		 (singleton (CTypeSpec happy_var_1)+	)}++happyReduce_136 = happySpecReduce_2  37# happyReduction_136+happyReduction_136 happy_x_2+	happy_x_1+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOut41 happy_x_2 of { happy_var_2 -> +	happyIn43+		 ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)+	)}}++happyReduce_137 = happySpecReduce_2  37# happyReduction_137+happyReduction_137 happy_x_2+	happy_x_1+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut41 happy_x_2 of { happy_var_2 -> +	happyIn43+		 (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2+	)}}++happyReduce_138 = happySpecReduce_3  37# happyReduction_138+happyReduction_138 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut41 happy_x_3 of { happy_var_3 -> +	happyIn43+		 (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3+	)}}}++happyReduce_139 = happySpecReduce_2  37# happyReduction_139+happyReduction_139 happy_x_2+	happy_x_1+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> +	case happyOut60 happy_x_2 of { happy_var_2 -> +	happyIn43+		 (happy_var_1 `snoc` CTypeQual happy_var_2+	)}}++happyReduce_140 = happySpecReduce_2  37# happyReduction_140+happyReduction_140 happy_x_2+	happy_x_1+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> +	case happyOut41 happy_x_2 of { happy_var_2 -> +	happyIn43+		 (happy_var_1 `snoc` CTypeSpec happy_var_2+	)}}++happyReduce_141 = happySpecReduce_2  37# happyReduction_141+happyReduction_141 happy_x_2+	happy_x_1+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn43+		 (addTrailingAttrs happy_var_1 happy_var_2+	)}}++happyReduce_142 = happySpecReduce_2  38# happyReduction_142+happyReduction_142 happy_x_2+	happy_x_1+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut48 happy_x_2 of { happy_var_2 -> +	happyIn44+		 (happy_var_1 `snoc` CTypeSpec happy_var_2+	)}}++happyReduce_143 = happySpecReduce_2  38# happyReduction_143+happyReduction_143 happy_x_2+	happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut39 happy_x_2 of { happy_var_2 -> +	happyIn44+		 (happy_var_1 `snoc` CStorageSpec happy_var_2+	)}}++happyReduce_144 = happySpecReduce_2  38# happyReduction_144+happyReduction_144 happy_x_2+	happy_x_1+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> +	case happyOut38 happy_x_2 of { happy_var_2 -> +	happyIn44+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_145 = happySpecReduce_2  38# happyReduction_145+happyReduction_145 happy_x_2+	happy_x_1+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn44+		 (addTrailingAttrs happy_var_1 happy_var_2+	)}}++happyReduce_146 = happySpecReduce_1  39# happyReduction_146+happyReduction_146 happy_x_1+	 =  case happyOut48 happy_x_1 of { happy_var_1 -> +	happyIn45+		 (singleton (CTypeSpec happy_var_1)+	)}++happyReduce_147 = happySpecReduce_2  39# happyReduction_147+happyReduction_147 happy_x_2+	happy_x_1+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOut48 happy_x_2 of { happy_var_2 -> +	happyIn45+		 ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)+	)}}++happyReduce_148 = happySpecReduce_2  39# happyReduction_148+happyReduction_148 happy_x_2+	happy_x_1+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut48 happy_x_2 of { happy_var_2 -> +	happyIn45+		 (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2+	)}}++happyReduce_149 = happySpecReduce_3  39# happyReduction_149+happyReduction_149 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut48 happy_x_3 of { happy_var_3 -> +	happyIn45+		 (rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3+	)}}}++happyReduce_150 = happySpecReduce_2  39# happyReduction_150+happyReduction_150 happy_x_2+	happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut60 happy_x_2 of { happy_var_2 -> +	happyIn45+		 (happy_var_1 `snoc` CTypeQual happy_var_2+	)}}++happyReduce_151 = happySpecReduce_2  39# happyReduction_151+happyReduction_151 happy_x_2+	happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn45+		 (addTrailingAttrs happy_var_1 happy_var_2+	)}}++happyReduce_152 = happySpecReduce_2  40# happyReduction_152+happyReduction_152 happy_x_2+	happy_x_1+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> +	case happyOut39 happy_x_2 of { happy_var_2 -> +	happyIn46+		 (happy_var_1 `snoc` CStorageSpec happy_var_2+	)}}++happyReduce_153 = happyMonadReduce 2# 40# happyReduction_153+happyReduction_153 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> +	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}+	) (\r -> happyReturn (happyIn46 r))++happyReduce_154 = happyMonadReduce 5# 40# happyReduction_154+happyReduction_154 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut116 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}+	) (\r -> happyReturn (happyIn46 r))++happyReduce_155 = happyMonadReduce 5# 40# happyReduction_155+happyReduction_155 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut82 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}+	) (\r -> happyReturn (happyIn46 r))++happyReduce_156 = happySpecReduce_2  40# happyReduction_156+happyReduction_156 happy_x_2+	happy_x_1+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> +	case happyOut38 happy_x_2 of { happy_var_2 -> +	happyIn46+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_157 = happySpecReduce_2  40# happyReduction_157+happyReduction_157 happy_x_2+	happy_x_1+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn46+		 (addTrailingAttrs happy_var_1 happy_var_2+	)}}++happyReduce_158 = happyMonadReduce 1# 41# happyReduction_158+happyReduction_158 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> +	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeDef happy_var_1 at)))}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_159 = happyMonadReduce 4# 41# happyReduction_159+happyReduction_159 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfExpr happy_var_3 at)))}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_160 = happyMonadReduce 4# 41# happyReduction_160+happyReduction_160 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut82 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfType happy_var_3 at)))}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_161 = happyMonadReduce 2# 41# happyReduction_161+happyReduction_161 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> +	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_162 = happyMonadReduce 5# 41# happyReduction_162+happyReduction_162 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut116 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_163 = happyMonadReduce 5# 41# happyReduction_163+happyReduction_163 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut82 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_164 = happyMonadReduce 2# 41# happyReduction_164+happyReduction_164 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> +	( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeDef happy_var_2 at)))}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_165 = happyMonadReduce 5# 41# happyReduction_165+happyReduction_165 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut116 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc`  (CTypeSpec (CTypeOfExpr happy_var_4 at)))}}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_166 = happyMonadReduce 5# 41# happyReduction_166+happyReduction_166 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut82 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc`  (CTypeSpec (CTypeOfType happy_var_4 at)))}}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_167 = happyMonadReduce 3# 41# happyReduction_167+happyReduction_167 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (CTokTyIdent _ happy_var_3) -> +	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeDef happy_var_3 at))}}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_168 = happyMonadReduce 6# 41# happyReduction_168+happyReduction_168 (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) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut116 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfExpr happy_var_5 at))}}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_169 = happyMonadReduce 6# 41# happyReduction_169+happyReduction_169 (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) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut82 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfType happy_var_5 at))}}}+	) (\r -> happyReturn (happyIn47 r))++happyReduce_170 = happySpecReduce_2  41# happyReduction_170+happyReduction_170 happy_x_2+	happy_x_1+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> +	case happyOut60 happy_x_2 of { happy_var_2 -> +	happyIn47+		 (happy_var_1 `snoc` CTypeQual happy_var_2+	)}}++happyReduce_171 = happySpecReduce_2  41# happyReduction_171+happyReduction_171 happy_x_2+	happy_x_1+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn47+		 (addTrailingAttrs happy_var_1 happy_var_2+	)}}++happyReduce_172 = happyMonadReduce 1# 42# happyReduction_172+happyReduction_172 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut49 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CSUType happy_var_1)}+	) (\r -> happyReturn (happyIn48 r))++happyReduce_173 = happyMonadReduce 1# 42# happyReduction_173+happyReduction_173 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut57 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CEnumType happy_var_1)}+	) (\r -> happyReturn (happyIn48 r))++happyReduce_174 = happyMonadReduce 6# 43# happyReduction_174+happyReduction_174 (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) tk+	 = happyThen (case happyOut50 happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	case happyOut124 happy_x_3 of { happy_var_3 -> +	case happyOut51 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}+	) (\r -> happyReturn (happyIn49 r))++happyReduce_175 = happyMonadReduce 5# 43# happyReduction_175+happyReduction_175 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut50 happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	case happyOut51 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}+	) (\r -> happyReturn (happyIn49 r))++happyReduce_176 = happyMonadReduce 3# 43# happyReduction_176+happyReduction_176 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut50 happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	case happyOut124 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) Nothing happy_var_2)}}}+	) (\r -> happyReturn (happyIn49 r))++happyReduce_177 = happySpecReduce_1  44# happyReduction_177+happyReduction_177 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn50+		 (L CStructTag (posOf happy_var_1)+	)}++happyReduce_178 = happySpecReduce_1  44# happyReduction_178+happyReduction_178 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn50+		 (L CUnionTag (posOf happy_var_1)+	)}++happyReduce_179 = happySpecReduce_0  45# happyReduction_179+happyReduction_179  =  happyIn51+		 (empty+	)++happyReduce_180 = happySpecReduce_2  45# happyReduction_180+happyReduction_180 happy_x_2+	happy_x_1+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> +	happyIn51+		 (happy_var_1+	)}++happyReduce_181 = happySpecReduce_2  45# happyReduction_181+happyReduction_181 happy_x_2+	happy_x_1+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> +	case happyOut52 happy_x_2 of { happy_var_2 -> +	happyIn51+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_182 = happySpecReduce_2  46# happyReduction_182+happyReduction_182 happy_x_2+	happy_x_1+	 =  case happyOut54 happy_x_1 of { happy_var_1 -> +	happyIn52+		 (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at+	)}++happyReduce_183 = happySpecReduce_2  46# happyReduction_183+happyReduction_183 happy_x_2+	happy_x_1+	 =  case happyOut53 happy_x_1 of { happy_var_1 -> +	happyIn52+		 (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at+	)}++happyReduce_184 = happySpecReduce_2  46# happyReduction_184+happyReduction_184 happy_x_2+	happy_x_1+	 =  case happyOut52 happy_x_2 of { happy_var_2 -> +	happyIn52+		 (happy_var_2+	)}++happyReduce_185 = happyMonadReduce 3# 47# happyReduction_185+happyReduction_185 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	case happyOut56 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ case happy_var_3 of (d,s) -> CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [(d,Nothing,s)])}}}+	) (\r -> happyReturn (happyIn53 r))++happyReduce_186 = happyMonadReduce 2# 47# happyReduction_186+happyReduction_186 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOut56 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ case happy_var_2 of (d,s) -> CDecl (liftCAttrs happy_var_1) [(d,Nothing,s)])}}+	) (\r -> happyReturn (happyIn53 r))++happyReduce_187 = happyReduce 4# 47# happyReduction_187+happyReduction_187 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut53 happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	case happyOut56 happy_x_4 of { happy_var_4 -> +	happyIn53+		 (case happy_var_1 of+            CDecl declspecs dies at ->+              case happy_var_4 of+                (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs happy_var_3 d,Nothing,s) : dies) at+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at+	) `HappyStk` happyRest}}}++happyReduce_188 = happyMonadReduce 3# 48# happyReduction_188+happyReduction_188 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut55 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ case happy_var_2 of { (Just d,s)  -> CDecl happy_var_1 [(Just $! appendObjAttrs happy_var_3 d,Nothing,s)]+                                    ; (Nothing,s) -> CDecl happy_var_1 [(Nothing,Nothing,s)]  })}}}+	) (\r -> happyReturn (happyIn54 r))++happyReduce_189 = happyReduce 5# 48# happyReduction_189+happyReduction_189 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut54 happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	case happyOut55 happy_x_4 of { happy_var_4 -> +	case happyOut125 happy_x_5 of { happy_var_5 -> +	happyIn54+		 (case happy_var_1 of+            CDecl declspecs dies attr ->+              case happy_var_4 of+                (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs (happy_var_3++happy_var_5) d,Nothing,s) : dies) attr+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr+	) `HappyStk` happyRest}}}}++happyReduce_190 = happyMonadReduce 1# 48# happyReduction_190+happyReduction_190 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}+	) (\r -> happyReturn (happyIn54 r))++happyReduce_191 = happySpecReduce_1  49# happyReduction_191+happyReduction_191 happy_x_1+	 =  case happyOut62 happy_x_1 of { happy_var_1 -> +	happyIn55+		 ((Just (reverseDeclr happy_var_1), Nothing)+	)}++happyReduce_192 = happySpecReduce_2  49# happyReduction_192+happyReduction_192 happy_x_2+	happy_x_1+	 =  case happyOut120 happy_x_2 of { happy_var_2 -> +	happyIn55+		 ((Nothing, Just happy_var_2)+	)}++happyReduce_193 = happySpecReduce_3  49# happyReduction_193+happyReduction_193 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut62 happy_x_1 of { happy_var_1 -> +	case happyOut120 happy_x_3 of { happy_var_3 -> +	happyIn55+		 ((Just (reverseDeclr happy_var_1), Just happy_var_3)+	)}}++happyReduce_194 = happySpecReduce_1  50# happyReduction_194+happyReduction_194 happy_x_1+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> +	happyIn56+		 ((Just (reverseDeclr happy_var_1), Nothing)+	)}++happyReduce_195 = happySpecReduce_2  50# happyReduction_195+happyReduction_195 happy_x_2+	happy_x_1+	 =  case happyOut120 happy_x_2 of { happy_var_2 -> +	happyIn56+		 ((Nothing, Just happy_var_2)+	)}++happyReduce_196 = happySpecReduce_3  50# happyReduction_196+happyReduction_196 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> +	case happyOut120 happy_x_3 of { happy_var_3 -> +	happyIn56+		 ((Just (reverseDeclr happy_var_1), Just happy_var_3)+	)}}++happyReduce_197 = happySpecReduce_2  50# happyReduction_197+happyReduction_197 happy_x_2+	happy_x_1+	 =  case happyOut56 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn56+		 (case happy_var_1 of {   (Nothing,expr) -> (Nothing,expr) {- FIXME -}+                    ; (Just (CDeclr name derived asmname attrs node), bsz) ->+                                        (Just (CDeclr name derived asmname (attrs++happy_var_2) node),bsz)+                  }+	)}}++happyReduce_198 = happyMonadReduce 5# 51# happyReduction_198+happyReduction_198 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	case happyOut58 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CEnum Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}+	) (\r -> happyReturn (happyIn57 r))++happyReduce_199 = happyMonadReduce 6# 51# happyReduction_199+happyReduction_199 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	case happyOut58 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CEnum Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}+	) (\r -> happyReturn (happyIn57 r))++happyReduce_200 = happyMonadReduce 6# 51# happyReduction_200+happyReduction_200 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	case happyOut124 happy_x_3 of { happy_var_3 -> +	case happyOut58 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}+	) (\r -> happyReturn (happyIn57 r))++happyReduce_201 = happyMonadReduce 7# 51# happyReduction_201+happyReduction_201 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	case happyOut124 happy_x_3 of { happy_var_3 -> +	case happyOut58 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}+	) (\r -> happyReturn (happyIn57 r))++happyReduce_202 = happyMonadReduce 3# 51# happyReduction_202+happyReduction_202 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_2 of { happy_var_2 -> +	case happyOut124 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) Nothing happy_var_2)}}}+	) (\r -> happyReturn (happyIn57 r))++happyReduce_203 = happySpecReduce_1  52# happyReduction_203+happyReduction_203 happy_x_1+	 =  case happyOut59 happy_x_1 of { happy_var_1 -> +	happyIn58+		 (singleton happy_var_1+	)}++happyReduce_204 = happySpecReduce_3  52# happyReduction_204+happyReduction_204 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut58 happy_x_1 of { happy_var_1 -> +	case happyOut59 happy_x_3 of { happy_var_3 -> +	happyIn58+		 (happy_var_1 `snoc` happy_var_3+	)}}++happyReduce_205 = happySpecReduce_1  53# happyReduction_205+happyReduction_205 happy_x_1+	 =  case happyOut124 happy_x_1 of { happy_var_1 -> +	happyIn59+		 ((happy_var_1, Nothing)+	)}++happyReduce_206 = happySpecReduce_3  53# happyReduction_206+happyReduction_206 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut124 happy_x_1 of { happy_var_1 -> +	case happyOut120 happy_x_3 of { happy_var_3 -> +	happyIn59+		 ((happy_var_1, Just happy_var_3)+	)}}++happyReduce_207 = happyMonadReduce 1# 54# happyReduction_207+happyReduction_207 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CConstQual)}+	) (\r -> happyReturn (happyIn60 r))++happyReduce_208 = happyMonadReduce 1# 54# happyReduction_208+happyReduction_208 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CVolatQual)}+	) (\r -> happyReturn (happyIn60 r))++happyReduce_209 = happyMonadReduce 1# 54# happyReduction_209+happyReduction_209 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CRestrQual)}+	) (\r -> happyReturn (happyIn60 r))++happyReduce_210 = happyMonadReduce 1# 54# happyReduction_210+happyReduction_210 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CInlineQual)}+	) (\r -> happyReturn (happyIn60 r))++happyReduce_211 = happySpecReduce_2  55# happyReduction_211+happyReduction_211 happy_x_2+	happy_x_1+	 =  case happyOut125 happy_x_1 of { happy_var_1 -> +	case happyOut60 happy_x_2 of { happy_var_2 -> +	happyIn61+		 (reverseList (map CAttrQual happy_var_1) `snoc` happy_var_2+	)}}++happyReduce_212 = happySpecReduce_2  55# happyReduction_212+happyReduction_212 happy_x_2+	happy_x_1+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut60 happy_x_2 of { happy_var_2 -> +	happyIn61+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_213 = happySpecReduce_3  55# happyReduction_213+happyReduction_213 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut60 happy_x_3 of { happy_var_3 -> +	happyIn61+		 ((happy_var_1 `rappend` map CAttrQual happy_var_2) `snoc` happy_var_3+	)}}}++happyReduce_214 = happySpecReduce_1  56# happyReduction_214+happyReduction_214 happy_x_1+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> +	happyIn62+		 (happy_var_1+	)}++happyReduce_215 = happySpecReduce_1  56# happyReduction_215+happyReduction_215 happy_x_1+	 =  case happyOut64 happy_x_1 of { happy_var_1 -> +	happyIn62+		 (happy_var_1+	)}++happyReduce_216 = happySpecReduce_0  57# happyReduction_216+happyReduction_216  =  happyIn63+		 (Nothing+	)++happyReduce_217 = happyReduce 4# 57# happyReduction_217+happyReduction_217 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut122 happy_x_3 of { happy_var_3 -> +	happyIn63+		 (Just happy_var_3+	) `HappyStk` happyRest}++happyReduce_218 = happySpecReduce_1  58# happyReduction_218+happyReduction_218 happy_x_1+	 =  case happyOut68 happy_x_1 of { happy_var_1 -> +	happyIn64+		 (happy_var_1+	)}++happyReduce_219 = happySpecReduce_1  58# happyReduction_219+happyReduction_219 happy_x_1+	 =  case happyOut65 happy_x_1 of { happy_var_1 -> +	happyIn64+		 (happy_var_1+	)}++happyReduce_220 = happyMonadReduce 1# 59# happyReduction_220+happyReduction_220 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> +	( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}+	) (\r -> happyReturn (happyIn65 r))++happyReduce_221 = happyMonadReduce 2# 59# happyReduction_221+happyReduction_221 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> +	case happyOut84 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ \at -> happy_var_2 (mkVarDeclr happy_var_1 at))}}+	) (\r -> happyReturn (happyIn65 r))++happyReduce_222 = happySpecReduce_1  59# happyReduction_222+happyReduction_222 happy_x_1+	 =  case happyOut66 happy_x_1 of { happy_var_1 -> +	happyIn65+		 (happy_var_1+	)}++happyReduce_223 = happySpecReduce_1  60# happyReduction_223+happyReduction_223 happy_x_1+	 =  case happyOut67 happy_x_1 of { happy_var_1 -> +	happyIn66+		 (happy_var_1+	)}++happyReduce_224 = happyMonadReduce 2# 60# happyReduction_224+happyReduction_224 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut65 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}+	) (\r -> happyReturn (happyIn66 r))++happyReduce_225 = happyMonadReduce 3# 60# happyReduction_225+happyReduction_225 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut65 happy_x_3 of { happy_var_3 -> +	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}+	) (\r -> happyReturn (happyIn66 r))++happyReduce_226 = happyMonadReduce 3# 60# happyReduction_226+happyReduction_226 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut65 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}+	) (\r -> happyReturn (happyIn66 r))++happyReduce_227 = happyMonadReduce 4# 60# happyReduction_227+happyReduction_227 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut126 happy_x_3 of { happy_var_3 -> +	case happyOut65 happy_x_4 of { happy_var_4 -> +	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}+	) (\r -> happyReturn (happyIn66 r))++happyReduce_228 = happySpecReduce_3  61# happyReduction_228+happyReduction_228 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut66 happy_x_2 of { happy_var_2 -> +	happyIn67+		 (happy_var_2+	)}++happyReduce_229 = happyReduce 4# 61# happyReduction_229+happyReduction_229 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut66 happy_x_2 of { happy_var_2 -> +	case happyOut84 happy_x_4 of { happy_var_4 -> +	happyIn67+		 (happy_var_4 happy_var_2+	) `HappyStk` happyRest}}++happyReduce_230 = happyReduce 4# 61# happyReduction_230+happyReduction_230 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut66 happy_x_3 of { happy_var_3 -> +	happyIn67+		 (appendDeclrAttrs happy_var_2 happy_var_3+	) `HappyStk` happyRest}}++happyReduce_231 = happyReduce 5# 61# happyReduction_231+happyReduction_231 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut66 happy_x_3 of { happy_var_3 -> +	case happyOut84 happy_x_5 of { happy_var_5 -> +	happyIn67+		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)+	) `HappyStk` happyRest}}}++happyReduce_232 = happySpecReduce_1  62# happyReduction_232+happyReduction_232 happy_x_1+	 =  case happyOut69 happy_x_1 of { happy_var_1 -> +	happyIn68+		 (happy_var_1+	)}++happyReduce_233 = happyMonadReduce 4# 62# happyReduction_233+happyReduction_233 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut70 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 [])}}+	) (\r -> happyReturn (happyIn68 r))++happyReduce_234 = happyMonadReduce 5# 62# happyReduction_234+happyReduction_234 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut70 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}+	) (\r -> happyReturn (happyIn68 r))++happyReduce_235 = happyMonadReduce 6# 62# happyReduction_235+happyReduction_235 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut126 happy_x_3 of { happy_var_3 -> +	case happyOut70 happy_x_5 of { happy_var_5 -> +	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_5 (reverse happy_var_2))}}}}+	) (\r -> happyReturn (happyIn68 r))++happyReduce_236 = happyMonadReduce 2# 62# happyReduction_236+happyReduction_236 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut68 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}+	) (\r -> happyReturn (happyIn68 r))++happyReduce_237 = happyMonadReduce 3# 62# happyReduction_237+happyReduction_237 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut68 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}+	) (\r -> happyReturn (happyIn68 r))++happyReduce_238 = happyMonadReduce 4# 62# happyReduction_238+happyReduction_238 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut126 happy_x_3 of { happy_var_3 -> +	case happyOut68 happy_x_4 of { happy_var_4 -> +	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}+	) (\r -> happyReturn (happyIn68 r))++happyReduce_239 = happySpecReduce_3  63# happyReduction_239+happyReduction_239 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut68 happy_x_2 of { happy_var_2 -> +	happyIn69+		 (happy_var_2+	)}++happyReduce_240 = happyReduce 4# 63# happyReduction_240+happyReduction_240 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut70 happy_x_2 of { happy_var_2 -> +	case happyOut84 happy_x_3 of { happy_var_3 -> +	happyIn69+		 (happy_var_3 happy_var_2+	) `HappyStk` happyRest}}++happyReduce_241 = happyReduce 4# 63# happyReduction_241+happyReduction_241 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut68 happy_x_2 of { happy_var_2 -> +	case happyOut84 happy_x_4 of { happy_var_4 -> +	happyIn69+		 (happy_var_4 happy_var_2+	) `HappyStk` happyRest}}++happyReduce_242 = happyMonadReduce 1# 64# happyReduction_242+happyReduction_242 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> +	( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}+	) (\r -> happyReturn (happyIn70 r))++happyReduce_243 = happySpecReduce_3  64# happyReduction_243+happyReduction_243 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut70 happy_x_2 of { happy_var_2 -> +	happyIn70+		 (happy_var_2+	)}++happyReduce_244 = happySpecReduce_1  65# happyReduction_244+happyReduction_244 happy_x_1+	 =  case happyOut72 happy_x_1 of { happy_var_1 -> +	happyIn71+		 (happy_var_1+	)}++happyReduce_245 = happySpecReduce_1  65# happyReduction_245+happyReduction_245 happy_x_1+	 =  case happyOut74 happy_x_1 of { happy_var_1 -> +	happyIn71+		 (happy_var_1+	)}++happyReduce_246 = happySpecReduce_1  66# happyReduction_246+happyReduction_246 happy_x_1+	 =  case happyOut73 happy_x_1 of { happy_var_1 -> +	happyIn72+		 (happy_var_1+	)}++happyReduce_247 = happyMonadReduce 2# 66# happyReduction_247+happyReduction_247 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}+	) (\r -> happyReturn (happyIn72 r))++happyReduce_248 = happyMonadReduce 3# 66# happyReduction_248+happyReduction_248 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut71 happy_x_3 of { happy_var_3 -> +	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}+	) (\r -> happyReturn (happyIn72 r))++happyReduce_249 = happyMonadReduce 3# 66# happyReduction_249+happyReduction_249 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut71 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}+	) (\r -> happyReturn (happyIn72 r))++happyReduce_250 = happyMonadReduce 4# 66# happyReduction_250+happyReduction_250 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut126 happy_x_3 of { happy_var_3 -> +	case happyOut71 happy_x_4 of { happy_var_4 -> +	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}+	) (\r -> happyReturn (happyIn72 r))++happyReduce_251 = happySpecReduce_2  67# happyReduction_251+happyReduction_251 happy_x_2+	happy_x_1+	 =  case happyOut74 happy_x_1 of { happy_var_1 -> +	case happyOut84 happy_x_2 of { happy_var_2 -> +	happyIn73+		 (happy_var_2 happy_var_1+	)}}++happyReduce_252 = happySpecReduce_3  67# happyReduction_252+happyReduction_252 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut72 happy_x_2 of { happy_var_2 -> +	happyIn73+		 (happy_var_2+	)}++happyReduce_253 = happyReduce 4# 67# happyReduction_253+happyReduction_253 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut72 happy_x_2 of { happy_var_2 -> +	case happyOut84 happy_x_4 of { happy_var_4 -> +	happyIn73+		 (happy_var_4 happy_var_2+	) `HappyStk` happyRest}}++happyReduce_254 = happyReduce 4# 67# happyReduction_254+happyReduction_254 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut72 happy_x_3 of { happy_var_3 -> +	happyIn73+		 (appendDeclrAttrs happy_var_2 happy_var_3+	) `HappyStk` happyRest}}++happyReduce_255 = happyReduce 5# 67# happyReduction_255+happyReduction_255 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut72 happy_x_3 of { happy_var_3 -> +	case happyOut84 happy_x_5 of { happy_var_5 -> +	happyIn73+		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)+	) `HappyStk` happyRest}}}++happyReduce_256 = happyMonadReduce 1# 68# happyReduction_256+happyReduction_256 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> +	( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}+	) (\r -> happyReturn (happyIn74 r))++happyReduce_257 = happySpecReduce_3  68# happyReduction_257+happyReduction_257 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut74 happy_x_2 of { happy_var_2 -> +	happyIn74+		 (happy_var_2+	)}++happyReduce_258 = happyReduce 4# 68# happyReduction_258+happyReduction_258 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut74 happy_x_3 of { happy_var_3 -> +	happyIn74+		 (appendDeclrAttrs happy_var_2 happy_var_3+	) `HappyStk` happyRest}}++happyReduce_259 = happySpecReduce_1  69# happyReduction_259+happyReduction_259 happy_x_1+	 =  case happyOut76 happy_x_1 of { happy_var_1 -> +	happyIn75+		 (reverseDeclr happy_var_1+	)}++happyReduce_260 = happySpecReduce_1  70# happyReduction_260+happyReduction_260 happy_x_1+	 =  case happyOut77 happy_x_1 of { happy_var_1 -> +	happyIn76+		 (happy_var_1+	)}++happyReduce_261 = happyMonadReduce 2# 70# happyReduction_261+happyReduction_261 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut76 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}+	) (\r -> happyReturn (happyIn76 r))++happyReduce_262 = happyMonadReduce 3# 70# happyReduction_262+happyReduction_262 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut76 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}+	) (\r -> happyReturn (happyIn76 r))++happyReduce_263 = happyMonadReduce 4# 71# happyReduction_263+happyReduction_263 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut74 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut81 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ funDeclr happy_var_1 (Left $ reverse happy_var_3) [])}}}+	) (\r -> happyReturn (happyIn77 r))++happyReduce_264 = happySpecReduce_3  71# happyReduction_264+happyReduction_264 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut76 happy_x_2 of { happy_var_2 -> +	happyIn77+		 (happy_var_2+	)}++happyReduce_265 = happyReduce 4# 71# happyReduction_265+happyReduction_265 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut76 happy_x_2 of { happy_var_2 -> +	case happyOut84 happy_x_4 of { happy_var_4 -> +	happyIn77+		 (happy_var_4 happy_var_2+	) `HappyStk` happyRest}}++happyReduce_266 = happySpecReduce_0  72# happyReduction_266+happyReduction_266  =  happyIn78+		 (([], False)+	)++happyReduce_267 = happySpecReduce_1  72# happyReduction_267+happyReduction_267 happy_x_1+	 =  case happyOut79 happy_x_1 of { happy_var_1 -> +	happyIn78+		 ((reverse happy_var_1, False)+	)}++happyReduce_268 = happySpecReduce_3  72# happyReduction_268+happyReduction_268 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut79 happy_x_1 of { happy_var_1 -> +	happyIn78+		 ((reverse happy_var_1, True)+	)}++happyReduce_269 = happySpecReduce_1  73# happyReduction_269+happyReduction_269 happy_x_1+	 =  case happyOut80 happy_x_1 of { happy_var_1 -> +	happyIn79+		 (singleton happy_var_1+	)}++happyReduce_270 = happySpecReduce_3  73# happyReduction_270+happyReduction_270 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut79 happy_x_1 of { happy_var_1 -> +	case happyOut80 happy_x_3 of { happy_var_3 -> +	happyIn79+		 (happy_var_1 `snoc` happy_var_3+	)}}++happyReduce_271 = happyMonadReduce 1# 74# happyReduction_271+happyReduction_271 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_272 = happyMonadReduce 2# 74# happyReduction_272+happyReduction_272 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_273 = happyMonadReduce 3# 74# happyReduction_273+happyReduction_273 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_274 = happyMonadReduce 3# 74# happyReduction_274+happyReduction_274 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> +	case happyOut65 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_275 = happyMonadReduce 1# 74# happyReduction_275+happyReduction_275 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_276 = happyMonadReduce 2# 74# happyReduction_276+happyReduction_276 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_277 = happyMonadReduce 3# 74# happyReduction_277+happyReduction_277 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_278 = happyMonadReduce 1# 74# happyReduction_278+happyReduction_278 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_279 = happyMonadReduce 2# 74# happyReduction_279+happyReduction_279 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_280 = happyMonadReduce 3# 74# happyReduction_280+happyReduction_280 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_281 = happyMonadReduce 3# 74# happyReduction_281+happyReduction_281 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut65 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_282 = happyMonadReduce 1# 74# happyReduction_282+happyReduction_282 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [])}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_283 = happyMonadReduce 2# 74# happyReduction_283+happyReduction_283 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_284 = happyMonadReduce 2# 74# happyReduction_284+happyReduction_284 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_285 = happyMonadReduce 3# 74# happyReduction_285+happyReduction_285 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr$ appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}+	) (\r -> happyReturn (happyIn80 r))++happyReduce_286 = happySpecReduce_1  75# happyReduction_286+happyReduction_286 happy_x_1+	 =  case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> +	happyIn81+		 (singleton happy_var_1+	)}++happyReduce_287 = happySpecReduce_3  75# happyReduction_287+happyReduction_287 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut81 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_3 of { (CTokIdent  _ happy_var_3) -> +	happyIn81+		 (happy_var_1 `snoc` happy_var_3+	)}}++happyReduce_288 = happyMonadReduce 1# 76# happyReduction_288+happyReduction_288 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}+	) (\r -> happyReturn (happyIn82 r))++happyReduce_289 = happyMonadReduce 2# 76# happyReduction_289+happyReduction_289 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}+	) (\r -> happyReturn (happyIn82 r))++happyReduce_290 = happyMonadReduce 2# 76# happyReduction_290+happyReduction_290 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}+	) (\r -> happyReturn (happyIn82 r))++happyReduce_291 = happyMonadReduce 2# 76# happyReduction_291+happyReduction_291 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}+	) (\r -> happyReturn (happyIn82 r))++happyReduce_292 = happySpecReduce_1  77# happyReduction_292+happyReduction_292 happy_x_1+	 =  case happyOut87 happy_x_1 of { happy_var_1 -> +	happyIn83+		 (happy_var_1+	)}++happyReduce_293 = happySpecReduce_1  77# happyReduction_293+happyReduction_293 happy_x_1+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> +	happyIn83+		 (happy_var_1+	)}++happyReduce_294 = happySpecReduce_1  77# happyReduction_294+happyReduction_294 happy_x_1+	 =  case happyOut84 happy_x_1 of { happy_var_1 -> +	happyIn83+		 (happy_var_1 emptyDeclr+	)}++happyReduce_295 = happySpecReduce_1  78# happyReduction_295+happyReduction_295 happy_x_1+	 =  case happyOut85 happy_x_1 of { happy_var_1 -> +	happyIn84+		 (happy_var_1+	)}++happyReduce_296 = happyMonadReduce 3# 78# happyReduction_296+happyReduction_296 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut78 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ \at declr -> case happy_var_2 of+             (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at)}}+	) (\r -> happyReturn (happyIn84 r))++happyReduce_297 = happySpecReduce_1  79# happyReduction_297+happyReduction_297 happy_x_1+	 =  case happyOut86 happy_x_1 of { happy_var_1 -> +	happyIn85+		 (happy_var_1+	)}++happyReduce_298 = happySpecReduce_2  79# happyReduction_298+happyReduction_298 happy_x_2+	happy_x_1+	 =  case happyOut85 happy_x_1 of { happy_var_1 -> +	case happyOut86 happy_x_2 of { happy_var_2 -> +	happyIn85+		 (\decl -> happy_var_2 (happy_var_1 decl)+	)}}++happyReduce_299 = happyMonadReduce 3# 80# happyReduction_299+happyReduction_299 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut119 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr [] False False happy_var_2 at)}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_300 = happyMonadReduce 4# 80# happyReduction_300+happyReduction_300 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut119 happy_x_3 of { happy_var_3 -> +	( withAttributePF happy_var_1 happy_var_2 $ \at declr -> arrDeclr declr [] False False happy_var_3 at)}}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_301 = happyMonadReduce 4# 80# happyReduction_301+happyReduction_301 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut119 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_3 at)}}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_302 = happyMonadReduce 5# 80# happyReduction_302+happyReduction_302 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut126 happy_x_3 of { happy_var_3 -> +	case happyOut119 happy_x_4 of { happy_var_4 -> +	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_4 at)}}}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_303 = happyMonadReduce 5# 80# happyReduction_303+happyReduction_303 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	case happyOut114 happy_x_4 of { happy_var_4 -> +	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] False True (Just happy_var_4) at)}}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_304 = happyMonadReduce 6# 80# happyReduction_304+happyReduction_304 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_3 of { happy_var_3 -> +	case happyOut125 happy_x_4 of { happy_var_4 -> +	case happyOut114 happy_x_5 of { happy_var_5 -> +	( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_3) False True (Just happy_var_5) at)}}}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_305 = happyMonadReduce 7# 80# happyReduction_305+happyReduction_305 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	case happyOut125 happy_x_5 of { happy_var_5 -> +	case happyOut114 happy_x_6 of { happy_var_6 -> +	( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) False True  (Just happy_var_6) at)}}}}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_306 = happyMonadReduce 4# 80# happyReduction_306+happyReduction_306 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] True False Nothing at)}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_307 = happyMonadReduce 5# 80# happyReduction_307+happyReduction_307 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_4 of { happy_var_4 -> +	( withAttributePF happy_var_1 (happy_var_2 ++ happy_var_4) $ \at declr -> arrDeclr declr [] True False Nothing at)}}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_308 = happyMonadReduce 5# 80# happyReduction_308+happyReduction_308 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_4 of { happy_var_4 -> +	( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_309 = happyMonadReduce 6# 80# happyReduction_309+happyReduction_309 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut126 happy_x_3 of { happy_var_3 -> +	case happyOut125 happy_x_5 of { happy_var_5 -> +	( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}}+	) (\r -> happyReturn (happyIn86 r))++happyReduce_310 = happyMonadReduce 1# 81# happyReduction_310+happyReduction_310 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ ptrDeclr emptyDeclr [])}+	) (\r -> happyReturn (happyIn87 r))++happyReduce_311 = happyMonadReduce 3# 81# happyReduction_311+happyReduction_311 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut125 happy_x_3 of { happy_var_3 -> +	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr emptyDeclr (reverse happy_var_2))}}}+	) (\r -> happyReturn (happyIn87 r))++happyReduce_312 = happyMonadReduce 2# 81# happyReduction_312+happyReduction_312 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}+	) (\r -> happyReturn (happyIn87 r))++happyReduce_313 = happyMonadReduce 3# 81# happyReduction_313+happyReduction_313 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_2 of { happy_var_2 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}+	) (\r -> happyReturn (happyIn87 r))++happyReduce_314 = happyMonadReduce 2# 81# happyReduction_314+happyReduction_314 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr emptyDeclr [])}}+	) (\r -> happyReturn (happyIn87 r))++happyReduce_315 = happyMonadReduce 3# 81# happyReduction_315+happyReduction_315 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}+	) (\r -> happyReturn (happyIn87 r))++happyReduce_316 = happySpecReduce_3  82# happyReduction_316+happyReduction_316 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut87 happy_x_2 of { happy_var_2 -> +	happyIn88+		 (happy_var_2+	)}++happyReduce_317 = happySpecReduce_3  82# happyReduction_317+happyReduction_317 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut88 happy_x_2 of { happy_var_2 -> +	happyIn88+		 (happy_var_2+	)}++happyReduce_318 = happySpecReduce_3  82# happyReduction_318+happyReduction_318 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut84 happy_x_2 of { happy_var_2 -> +	happyIn88+		 (happy_var_2 emptyDeclr+	)}++happyReduce_319 = happyReduce 4# 82# happyReduction_319+happyReduction_319 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut87 happy_x_2 of { happy_var_2 -> +	case happyOut84 happy_x_4 of { happy_var_4 -> +	happyIn88+		 (happy_var_4 happy_var_2+	) `HappyStk` happyRest}}++happyReduce_320 = happyReduce 4# 82# happyReduction_320+happyReduction_320 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut87 happy_x_3 of { happy_var_3 -> +	happyIn88+		 (appendDeclrAttrs happy_var_2 happy_var_3+	) `HappyStk` happyRest}}++happyReduce_321 = happyReduce 4# 82# happyReduction_321+happyReduction_321 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut88 happy_x_3 of { happy_var_3 -> +	happyIn88+		 (appendDeclrAttrs happy_var_2 happy_var_3+	) `HappyStk` happyRest}}++happyReduce_322 = happyReduce 4# 82# happyReduction_322+happyReduction_322 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut84 happy_x_3 of { happy_var_3 -> +	happyIn88+		 (appendDeclrAttrs happy_var_2 (happy_var_3 emptyDeclr)+	) `HappyStk` happyRest}}++happyReduce_323 = happyReduce 5# 82# happyReduction_323+happyReduction_323 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut126 happy_x_2 of { happy_var_2 -> +	case happyOut87 happy_x_3 of { happy_var_3 -> +	case happyOut84 happy_x_5 of { happy_var_5 -> +	happyIn88+		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)+	) `HappyStk` happyRest}}}++happyReduce_324 = happySpecReduce_2  82# happyReduction_324+happyReduction_324 happy_x_2+	happy_x_1+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn88+		 (appendDeclrAttrs happy_var_2 happy_var_1+	)}}++happyReduce_325 = happyMonadReduce 1# 83# happyReduction_325+happyReduction_325 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut114 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ CInitExpr happy_var_1)}+	) (\r -> happyReturn (happyIn89 r))++happyReduce_326 = happyMonadReduce 3# 83# happyReduction_326+happyReduction_326 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut91 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}+	) (\r -> happyReturn (happyIn89 r))++happyReduce_327 = happyMonadReduce 4# 83# happyReduction_327+happyReduction_327 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut91 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}+	) (\r -> happyReturn (happyIn89 r))++happyReduce_328 = happySpecReduce_0  84# happyReduction_328+happyReduction_328  =  happyIn90+		 (Nothing+	)++happyReduce_329 = happySpecReduce_2  84# happyReduction_329+happyReduction_329 happy_x_2+	happy_x_1+	 =  case happyOut89 happy_x_2 of { happy_var_2 -> +	happyIn90+		 (Just happy_var_2+	)}++happyReduce_330 = happySpecReduce_0  85# happyReduction_330+happyReduction_330  =  happyIn91+		 (empty+	)++happyReduce_331 = happySpecReduce_1  85# happyReduction_331+happyReduction_331 happy_x_1+	 =  case happyOut89 happy_x_1 of { happy_var_1 -> +	happyIn91+		 (singleton ([],happy_var_1)+	)}++happyReduce_332 = happySpecReduce_2  85# happyReduction_332+happyReduction_332 happy_x_2+	happy_x_1+	 =  case happyOut92 happy_x_1 of { happy_var_1 -> +	case happyOut89 happy_x_2 of { happy_var_2 -> +	happyIn91+		 (singleton (happy_var_1,happy_var_2)+	)}}++happyReduce_333 = happySpecReduce_3  85# happyReduction_333+happyReduction_333 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> +	case happyOut89 happy_x_3 of { happy_var_3 -> +	happyIn91+		 (happy_var_1 `snoc` ([],happy_var_3)+	)}}++happyReduce_334 = happyReduce 4# 85# happyReduction_334+happyReduction_334 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut91 happy_x_1 of { happy_var_1 -> +	case happyOut92 happy_x_3 of { happy_var_3 -> +	case happyOut89 happy_x_4 of { happy_var_4 -> +	happyIn91+		 (happy_var_1 `snoc` (happy_var_3,happy_var_4)+	) `HappyStk` happyRest}}}++happyReduce_335 = happySpecReduce_2  86# happyReduction_335+happyReduction_335 happy_x_2+	happy_x_1+	 =  case happyOut93 happy_x_1 of { happy_var_1 -> +	happyIn92+		 (reverse happy_var_1+	)}++happyReduce_336 = happyMonadReduce 2# 86# happyReduction_336+happyReduction_336 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut124 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ \at -> [CMemberDesig happy_var_1 at])}+	) (\r -> happyReturn (happyIn92 r))++happyReduce_337 = happySpecReduce_1  86# happyReduction_337+happyReduction_337 happy_x_1+	 =  case happyOut95 happy_x_1 of { happy_var_1 -> +	happyIn92+		 ([happy_var_1]+	)}++happyReduce_338 = happySpecReduce_1  87# happyReduction_338+happyReduction_338 happy_x_1+	 =  case happyOut94 happy_x_1 of { happy_var_1 -> +	happyIn93+		 (singleton happy_var_1+	)}++happyReduce_339 = happySpecReduce_2  87# happyReduction_339+happyReduction_339 happy_x_2+	happy_x_1+	 =  case happyOut93 happy_x_1 of { happy_var_1 -> +	case happyOut94 happy_x_2 of { happy_var_2 -> +	happyIn93+		 (happy_var_1 `snoc` happy_var_2+	)}}++happyReduce_340 = happyMonadReduce 3# 88# happyReduction_340+happyReduction_340 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut120 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CArrDesig happy_var_2)}}+	) (\r -> happyReturn (happyIn94 r))++happyReduce_341 = happyMonadReduce 2# 88# happyReduction_341+happyReduction_341 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut124 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CMemberDesig happy_var_2)}}+	) (\r -> happyReturn (happyIn94 r))++happyReduce_342 = happySpecReduce_1  88# happyReduction_342+happyReduction_342 happy_x_1+	 =  case happyOut95 happy_x_1 of { happy_var_1 -> +	happyIn94+		 (happy_var_1+	)}++happyReduce_343 = happyMonadReduce 5# 89# happyReduction_343+happyReduction_343 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut120 happy_x_2 of { happy_var_2 -> +	case happyOut120 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CRangeDesig happy_var_2 happy_var_4)}}}+	) (\r -> happyReturn (happyIn95 r))++happyReduce_344 = happyMonadReduce 1# 90# happyReduction_344+happyReduction_344 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> +	( withNodeInfo happy_var_1 $ CVar happy_var_1)}+	) (\r -> happyReturn (happyIn96 r))++happyReduce_345 = happySpecReduce_1  90# happyReduction_345+happyReduction_345 happy_x_1+	 =  case happyOut121 happy_x_1 of { happy_var_1 -> +	happyIn96+		 (CConst happy_var_1+	)}++happyReduce_346 = happySpecReduce_1  90# happyReduction_346+happyReduction_346 happy_x_1+	 =  case happyOut122 happy_x_1 of { happy_var_1 -> +	happyIn96+		 (CConst (liftStrLit happy_var_1)+	)}++happyReduce_347 = happySpecReduce_3  90# happyReduction_347+happyReduction_347 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut116 happy_x_2 of { happy_var_2 -> +	happyIn96+		 (happy_var_2+	)}++happyReduce_348 = happyMonadReduce 3# 90# happyReduction_348+happyReduction_348 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut13 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CStatExpr happy_var_2)}}+	) (\r -> happyReturn (happyIn96 r))++happyReduce_349 = happyMonadReduce 6# 90# happyReduction_349+happyReduction_349 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut114 happy_x_3 of { happy_var_3 -> +	case happyOut82 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinVaArg happy_var_3 happy_var_5)}}}+	) (\r -> happyReturn (happyIn96 r))++happyReduce_350 = happyMonadReduce 6# 90# happyReduction_350+happyReduction_350 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut82 happy_x_3 of { happy_var_3 -> +	case happyOut97 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinOffsetOf happy_var_3 (reverse happy_var_5))}}}+	) (\r -> happyReturn (happyIn96 r))++happyReduce_351 = happyMonadReduce 6# 90# happyReduction_351+happyReduction_351 (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) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut82 happy_x_3 of { happy_var_3 -> +	case happyOut82 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinTypesCompatible happy_var_3 happy_var_5)}}}+	) (\r -> happyReturn (happyIn96 r))++happyReduce_352 = happyMonadReduce 1# 91# happyReduction_352+happyReduction_352 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut124 happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ singleton . CMemberDesig happy_var_1)}+	) (\r -> happyReturn (happyIn97 r))++happyReduce_353 = happyMonadReduce 3# 91# happyReduction_353+happyReduction_353 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut97 happy_x_1 of { happy_var_1 -> +	case happyOut124 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CMemberDesig happy_var_3)}}+	) (\r -> happyReturn (happyIn97 r))++happyReduce_354 = happyMonadReduce 4# 91# happyReduction_354+happyReduction_354 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut97 happy_x_1 of { happy_var_1 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CArrDesig happy_var_3)}}+	) (\r -> happyReturn (happyIn97 r))++happyReduce_355 = happySpecReduce_1  92# happyReduction_355+happyReduction_355 happy_x_1+	 =  case happyOut96 happy_x_1 of { happy_var_1 -> +	happyIn98+		 (happy_var_1+	)}++happyReduce_356 = happyMonadReduce 4# 92# happyReduction_356+happyReduction_356 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CIndex happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn98 r))++happyReduce_357 = happyMonadReduce 3# 92# happyReduction_357+happyReduction_357 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_2 $ CCall happy_var_1 [])}}+	) (\r -> happyReturn (happyIn98 r))++happyReduce_358 = happyMonadReduce 4# 92# happyReduction_358+happyReduction_358 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut99 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CCall happy_var_1 (reverse happy_var_3))}}}+	) (\r -> happyReturn (happyIn98 r))++happyReduce_359 = happyMonadReduce 3# 92# happyReduction_359+happyReduction_359 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut124 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 False)}}}+	) (\r -> happyReturn (happyIn98 r))++happyReduce_360 = happyMonadReduce 3# 92# happyReduction_360+happyReduction_360 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut124 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 True)}}}+	) (\r -> happyReturn (happyIn98 r))++happyReduce_361 = happyMonadReduce 2# 92# happyReduction_361+happyReduction_361 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_2 $ CUnary CPostIncOp happy_var_1)}}+	) (\r -> happyReturn (happyIn98 r))++happyReduce_362 = happyMonadReduce 2# 92# happyReduction_362+happyReduction_362 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_2 $ CUnary CPostDecOp happy_var_1)}}+	) (\r -> happyReturn (happyIn98 r))++happyReduce_363 = happyMonadReduce 6# 92# happyReduction_363+happyReduction_363 (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) tk+	 = happyThen (case happyOut82 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_4 of { happy_var_4 -> +	case happyOut91 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}+	) (\r -> happyReturn (happyIn98 r))++happyReduce_364 = happyMonadReduce 7# 92# happyReduction_364+happyReduction_364 (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) tk+	 = happyThen (case happyOut82 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_4 of { happy_var_4 -> +	case happyOut91 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}+	) (\r -> happyReturn (happyIn98 r))++happyReduce_365 = happySpecReduce_1  93# happyReduction_365+happyReduction_365 happy_x_1+	 =  case happyOut114 happy_x_1 of { happy_var_1 -> +	happyIn99+		 (singleton happy_var_1+	)}++happyReduce_366 = happySpecReduce_3  93# happyReduction_366+happyReduction_366 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut99 happy_x_1 of { happy_var_1 -> +	case happyOut114 happy_x_3 of { happy_var_3 -> +	happyIn99+		 (happy_var_1 `snoc` happy_var_3+	)}}++happyReduce_367 = happySpecReduce_1  94# happyReduction_367+happyReduction_367 happy_x_1+	 =  case happyOut98 happy_x_1 of { happy_var_1 -> +	happyIn100+		 (happy_var_1+	)}++happyReduce_368 = happyMonadReduce 2# 94# happyReduction_368+happyReduction_368 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut100 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CUnary CPreIncOp happy_var_2)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_369 = happyMonadReduce 2# 94# happyReduction_369+happyReduction_369 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut100 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CUnary CPreDecOp happy_var_2)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_370 = happySpecReduce_2  94# happyReduction_370+happyReduction_370 happy_x_2+	happy_x_1+	 =  case happyOut102 happy_x_2 of { happy_var_2 -> +	happyIn100+		 (happy_var_2+	)}++happyReduce_371 = happyMonadReduce 2# 94# happyReduction_371+happyReduction_371 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut101 happy_x_1 of { happy_var_1 -> +	case happyOut102 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CUnary (unL happy_var_1) happy_var_2)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_372 = happyMonadReduce 2# 94# happyReduction_372+happyReduction_372 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut100 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CSizeofExpr happy_var_2)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_373 = happyMonadReduce 4# 94# happyReduction_373+happyReduction_373 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut82 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CSizeofType happy_var_3)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_374 = happyMonadReduce 2# 94# happyReduction_374+happyReduction_374 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut100 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CAlignofExpr happy_var_2)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_375 = happyMonadReduce 4# 94# happyReduction_375+happyReduction_375 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut82 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CAlignofType happy_var_3)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_376 = happyMonadReduce 2# 94# happyReduction_376+happyReduction_376 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut100 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CComplexReal happy_var_2)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_377 = happyMonadReduce 2# 94# happyReduction_377+happyReduction_377 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut100 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CComplexImag happy_var_2)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_378 = happyMonadReduce 2# 94# happyReduction_378+happyReduction_378 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut124 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ CLabAddrExpr happy_var_2)}}+	) (\r -> happyReturn (happyIn100 r))++happyReduce_379 = happySpecReduce_1  95# happyReduction_379+happyReduction_379 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn101+		 (L CAdrOp  (posOf happy_var_1)+	)}++happyReduce_380 = happySpecReduce_1  95# happyReduction_380+happyReduction_380 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn101+		 (L CIndOp  (posOf happy_var_1)+	)}++happyReduce_381 = happySpecReduce_1  95# happyReduction_381+happyReduction_381 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn101+		 (L CPlusOp (posOf happy_var_1)+	)}++happyReduce_382 = happySpecReduce_1  95# happyReduction_382+happyReduction_382 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn101+		 (L CMinOp  (posOf happy_var_1)+	)}++happyReduce_383 = happySpecReduce_1  95# happyReduction_383+happyReduction_383 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn101+		 (L CCompOp (posOf happy_var_1)+	)}++happyReduce_384 = happySpecReduce_1  95# happyReduction_384+happyReduction_384 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn101+		 (L CNegOp  (posOf happy_var_1)+	)}++happyReduce_385 = happySpecReduce_1  96# happyReduction_385+happyReduction_385 happy_x_1+	 =  case happyOut100 happy_x_1 of { happy_var_1 -> +	happyIn102+		 (happy_var_1+	)}++happyReduce_386 = happyMonadReduce 4# 96# happyReduction_386+happyReduction_386 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut82 happy_x_2 of { happy_var_2 -> +	case happyOut102 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_1 $ CCast happy_var_2 happy_var_4)}}}+	) (\r -> happyReturn (happyIn102 r))++happyReduce_387 = happySpecReduce_1  97# happyReduction_387+happyReduction_387 happy_x_1+	 =  case happyOut102 happy_x_1 of { happy_var_1 -> +	happyIn103+		 (happy_var_1+	)}++happyReduce_388 = happyMonadReduce 3# 97# happyReduction_388+happyReduction_388 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut102 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CMulOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn103 r))++happyReduce_389 = happyMonadReduce 3# 97# happyReduction_389+happyReduction_389 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut102 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CDivOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn103 r))++happyReduce_390 = happyMonadReduce 3# 97# happyReduction_390+happyReduction_390 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut102 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CRmdOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn103 r))++happyReduce_391 = happySpecReduce_1  98# happyReduction_391+happyReduction_391 happy_x_1+	 =  case happyOut103 happy_x_1 of { happy_var_1 -> +	happyIn104+		 (happy_var_1+	)}++happyReduce_392 = happyMonadReduce 3# 98# happyReduction_392+happyReduction_392 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut103 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CAddOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn104 r))++happyReduce_393 = happyMonadReduce 3# 98# happyReduction_393+happyReduction_393 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut103 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CSubOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn104 r))++happyReduce_394 = happySpecReduce_1  99# happyReduction_394+happyReduction_394 happy_x_1+	 =  case happyOut104 happy_x_1 of { happy_var_1 -> +	happyIn105+		 (happy_var_1+	)}++happyReduce_395 = happyMonadReduce 3# 99# happyReduction_395+happyReduction_395 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut105 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut104 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CShlOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn105 r))++happyReduce_396 = happyMonadReduce 3# 99# happyReduction_396+happyReduction_396 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut105 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut104 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CShrOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn105 r))++happyReduce_397 = happySpecReduce_1  100# happyReduction_397+happyReduction_397 happy_x_1+	 =  case happyOut105 happy_x_1 of { happy_var_1 -> +	happyIn106+		 (happy_var_1+	)}++happyReduce_398 = happyMonadReduce 3# 100# happyReduction_398+happyReduction_398 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut105 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CLeOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn106 r))++happyReduce_399 = happyMonadReduce 3# 100# happyReduction_399+happyReduction_399 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut105 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CGrOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn106 r))++happyReduce_400 = happyMonadReduce 3# 100# happyReduction_400+happyReduction_400 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut105 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CLeqOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn106 r))++happyReduce_401 = happyMonadReduce 3# 100# happyReduction_401+happyReduction_401 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut105 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CGeqOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn106 r))++happyReduce_402 = happySpecReduce_1  101# happyReduction_402+happyReduction_402 happy_x_1+	 =  case happyOut106 happy_x_1 of { happy_var_1 -> +	happyIn107+		 (happy_var_1+	)}++happyReduce_403 = happyMonadReduce 3# 101# happyReduction_403+happyReduction_403 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut106 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CEqOp  happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn107 r))++happyReduce_404 = happyMonadReduce 3# 101# happyReduction_404+happyReduction_404 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut106 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CNeqOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn107 r))++happyReduce_405 = happySpecReduce_1  102# happyReduction_405+happyReduction_405 happy_x_1+	 =  case happyOut107 happy_x_1 of { happy_var_1 -> +	happyIn108+		 (happy_var_1+	)}++happyReduce_406 = happyMonadReduce 3# 102# happyReduction_406+happyReduction_406 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut108 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut107 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CAndOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn108 r))++happyReduce_407 = happySpecReduce_1  103# happyReduction_407+happyReduction_407 happy_x_1+	 =  case happyOut108 happy_x_1 of { happy_var_1 -> +	happyIn109+		 (happy_var_1+	)}++happyReduce_408 = happyMonadReduce 3# 103# happyReduction_408+happyReduction_408 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut108 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CXorOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn109 r))++happyReduce_409 = happySpecReduce_1  104# happyReduction_409+happyReduction_409 happy_x_1+	 =  case happyOut109 happy_x_1 of { happy_var_1 -> +	happyIn110+		 (happy_var_1+	)}++happyReduce_410 = happyMonadReduce 3# 104# happyReduction_410+happyReduction_410 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut110 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut109 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary COrOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn110 r))++happyReduce_411 = happySpecReduce_1  105# happyReduction_411+happyReduction_411 happy_x_1+	 =  case happyOut110 happy_x_1 of { happy_var_1 -> +	happyIn111+		 (happy_var_1+	)}++happyReduce_412 = happyMonadReduce 3# 105# happyReduction_412+happyReduction_412 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut111 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut110 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CLndOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn111 r))++happyReduce_413 = happySpecReduce_1  106# happyReduction_413+happyReduction_413 happy_x_1+	 =  case happyOut111 happy_x_1 of { happy_var_1 -> +	happyIn112+		 (happy_var_1+	)}++happyReduce_414 = happyMonadReduce 3# 106# happyReduction_414+happyReduction_414 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut111 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CBinary CLorOp happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn112 r))++happyReduce_415 = happySpecReduce_1  107# happyReduction_415+happyReduction_415 happy_x_1+	 =  case happyOut112 happy_x_1 of { happy_var_1 -> +	happyIn113+		 (happy_var_1+	)}++happyReduce_416 = happyMonadReduce 5# 107# happyReduction_416+happyReduction_416 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut116 happy_x_3 of { happy_var_3 -> +	case happyOut113 happy_x_5 of { happy_var_5 -> +	( withNodeInfo happy_var_2 $ CCond happy_var_1 (Just happy_var_3) happy_var_5)}}}}+	) (\r -> happyReturn (happyIn113 r))++happyReduce_417 = happyMonadReduce 4# 107# happyReduction_417+happyReduction_417 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut113 happy_x_4 of { happy_var_4 -> +	( withNodeInfo happy_var_2 $ CCond happy_var_1 Nothing happy_var_4)}}}+	) (\r -> happyReturn (happyIn113 r))++happyReduce_418 = happySpecReduce_1  108# happyReduction_418+happyReduction_418 happy_x_1+	 =  case happyOut113 happy_x_1 of { happy_var_1 -> +	happyIn114+		 (happy_var_1+	)}++happyReduce_419 = happyMonadReduce 3# 108# happyReduction_419+happyReduction_419 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut100 happy_x_1 of { happy_var_1 -> +	case happyOut115 happy_x_2 of { happy_var_2 -> +	case happyOut114 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_2 $ CAssign (unL happy_var_2) happy_var_1 happy_var_3)}}}+	) (\r -> happyReturn (happyIn114 r))++happyReduce_420 = happySpecReduce_1  109# happyReduction_420+happyReduction_420 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CAssignOp (posOf happy_var_1)+	)}++happyReduce_421 = happySpecReduce_1  109# happyReduction_421+happyReduction_421 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CMulAssOp (posOf happy_var_1)+	)}++happyReduce_422 = happySpecReduce_1  109# happyReduction_422+happyReduction_422 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CDivAssOp (posOf happy_var_1)+	)}++happyReduce_423 = happySpecReduce_1  109# happyReduction_423+happyReduction_423 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CRmdAssOp (posOf happy_var_1)+	)}++happyReduce_424 = happySpecReduce_1  109# happyReduction_424+happyReduction_424 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CAddAssOp (posOf happy_var_1)+	)}++happyReduce_425 = happySpecReduce_1  109# happyReduction_425+happyReduction_425 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CSubAssOp (posOf happy_var_1)+	)}++happyReduce_426 = happySpecReduce_1  109# happyReduction_426+happyReduction_426 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CShlAssOp (posOf happy_var_1)+	)}++happyReduce_427 = happySpecReduce_1  109# happyReduction_427+happyReduction_427 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CShrAssOp (posOf happy_var_1)+	)}++happyReduce_428 = happySpecReduce_1  109# happyReduction_428+happyReduction_428 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CAndAssOp (posOf happy_var_1)+	)}++happyReduce_429 = happySpecReduce_1  109# happyReduction_429+happyReduction_429 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L CXorAssOp (posOf happy_var_1)+	)}++happyReduce_430 = happySpecReduce_1  109# happyReduction_430+happyReduction_430 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn115+		 (L COrAssOp  (posOf happy_var_1)+	)}++happyReduce_431 = happySpecReduce_1  110# happyReduction_431+happyReduction_431 happy_x_1+	 =  case happyOut114 happy_x_1 of { happy_var_1 -> +	happyIn116+		 (happy_var_1+	)}++happyReduce_432 = happyMonadReduce 3# 110# happyReduction_432+happyReduction_432 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut114 happy_x_1 of { happy_var_1 -> +	case happyOut117 happy_x_3 of { happy_var_3 -> +	( let es = reverse happy_var_3 in withNodeInfo es $ CComma (happy_var_1:es))}}+	) (\r -> happyReturn (happyIn116 r))++happyReduce_433 = happySpecReduce_1  111# happyReduction_433+happyReduction_433 happy_x_1+	 =  case happyOut114 happy_x_1 of { happy_var_1 -> +	happyIn117+		 (singleton happy_var_1+	)}++happyReduce_434 = happySpecReduce_3  111# happyReduction_434+happyReduction_434 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut117 happy_x_1 of { happy_var_1 -> +	case happyOut114 happy_x_3 of { happy_var_3 -> +	happyIn117+		 (happy_var_1 `snoc` happy_var_3+	)}}++happyReduce_435 = happySpecReduce_0  112# happyReduction_435+happyReduction_435  =  happyIn118+		 (Nothing+	)++happyReduce_436 = happySpecReduce_1  112# happyReduction_436+happyReduction_436 happy_x_1+	 =  case happyOut116 happy_x_1 of { happy_var_1 -> +	happyIn118+		 (Just happy_var_1+	)}++happyReduce_437 = happySpecReduce_0  113# happyReduction_437+happyReduction_437  =  happyIn119+		 (Nothing+	)++happyReduce_438 = happySpecReduce_1  113# happyReduction_438+happyReduction_438 happy_x_1+	 =  case happyOut114 happy_x_1 of { happy_var_1 -> +	happyIn119+		 (Just happy_var_1+	)}++happyReduce_439 = happySpecReduce_1  114# happyReduction_439+happyReduction_439 happy_x_1+	 =  case happyOut113 happy_x_1 of { happy_var_1 -> +	happyIn120+		 (happy_var_1+	)}++happyReduce_440 = happyMonadReduce 1# 115# happyReduction_440+happyReduction_440 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokILit _ i -> CIntConst i)}+	) (\r -> happyReturn (happyIn121 r))++happyReduce_441 = happyMonadReduce 1# 115# happyReduction_441+happyReduction_441 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokCLit _ c -> CCharConst c)}+	) (\r -> happyReturn (happyIn121 r))++happyReduce_442 = happyMonadReduce 1# 115# happyReduction_442+happyReduction_442 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokFLit _ f -> CFloatConst f)}+	) (\r -> happyReturn (happyIn121 r))++happyReduce_443 = happyMonadReduce 1# 116# happyReduction_443+happyReduction_443 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit s)}+	) (\r -> happyReturn (happyIn122 r))++happyReduce_444 = happyMonadReduce 2# 116# happyReduction_444+happyReduction_444 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut123 happy_x_2 of { happy_var_2 -> +	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse happy_var_2)))}}+	) (\r -> happyReturn (happyIn122 r))++happyReduce_445 = happySpecReduce_1  117# happyReduction_445+happyReduction_445 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn123+		 (case happy_var_1 of CTokSLit _ s -> singleton s+	)}++happyReduce_446 = happySpecReduce_2  117# happyReduction_446+happyReduction_446 happy_x_2+	happy_x_1+	 =  case happyOut123 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	happyIn123+		 (case happy_var_2 of CTokSLit _ s -> happy_var_1 `snoc` s+	)}}++happyReduce_447 = happySpecReduce_1  118# happyReduction_447+happyReduction_447 happy_x_1+	 =  case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> +	happyIn124+		 (happy_var_1+	)}++happyReduce_448 = happySpecReduce_1  118# happyReduction_448+happyReduction_448 happy_x_1+	 =  case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> +	happyIn124+		 (happy_var_1+	)}++happyReduce_449 = happySpecReduce_0  119# happyReduction_449+happyReduction_449  =  happyIn125+		 ([]+	)++happyReduce_450 = happySpecReduce_1  119# happyReduction_450+happyReduction_450 happy_x_1+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> +	happyIn125+		 (happy_var_1+	)}++happyReduce_451 = happySpecReduce_1  120# happyReduction_451+happyReduction_451 happy_x_1+	 =  case happyOut127 happy_x_1 of { happy_var_1 -> +	happyIn126+		 (happy_var_1+	)}++happyReduce_452 = happySpecReduce_2  120# happyReduction_452+happyReduction_452 happy_x_2+	happy_x_1+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> +	case happyOut127 happy_x_2 of { happy_var_2 -> +	happyIn126+		 (happy_var_1 ++ happy_var_2+	)}}++happyReduce_453 = happyReduce 6# 121# happyReduction_453+happyReduction_453 (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 happyOut128 happy_x_4 of { happy_var_4 -> +	happyIn127+		 (reverse happy_var_4+	) `HappyStk` happyRest}++happyReduce_454 = happySpecReduce_1  122# happyReduction_454+happyReduction_454 happy_x_1+	 =  case happyOut129 happy_x_1 of { happy_var_1 -> +	happyIn128+		 (case happy_var_1 of Nothing -> empty; Just attr -> singleton attr+	)}++happyReduce_455 = happySpecReduce_3  122# happyReduction_455+happyReduction_455 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut128 happy_x_1 of { happy_var_1 -> +	case happyOut129 happy_x_3 of { happy_var_3 -> +	happyIn128+		 ((maybe id (flip snoc) happy_var_3) happy_var_1+	)}}++happyReduce_456 = happySpecReduce_0  123# happyReduction_456+happyReduction_456  =  happyIn129+		 (Nothing+	)++happyReduce_457 = happyMonadReduce 1# 123# happyReduction_457+happyReduction_457 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> +	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1  [])}+	) (\r -> happyReturn (happyIn129 r))++happyReduce_458 = happyMonadReduce 1# 123# happyReduction_458+happyReduction_458 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	( withNodeInfo happy_var_1 $ Just . CAttr (internalIdent "const") [])}+	) (\r -> happyReturn (happyIn129 r))++happyReduce_459 = happyMonadReduce 4# 123# happyReduction_459+happyReduction_459 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> +	case happyOut130 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 (reverse happy_var_3))}}+	) (\r -> happyReturn (happyIn129 r))++happyReduce_460 = happyMonadReduce 3# 123# happyReduction_460+happyReduction_460 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> +	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 [])}+	) (\r -> happyReturn (happyIn129 r))++happyReduce_461 = happySpecReduce_1  124# happyReduction_461+happyReduction_461 happy_x_1+	 =  case happyOut120 happy_x_1 of { happy_var_1 -> +	happyIn130+		 (singleton happy_var_1+	)}++happyReduce_462 = happySpecReduce_3  124# happyReduction_462+happyReduction_462 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut130 happy_x_1 of { happy_var_1 -> +	case happyOut120 happy_x_3 of { happy_var_3 -> +	happyIn130+		 (happy_var_1 `snoc` happy_var_3+	)}}++happyNewToken action sts stk+	= lexC(\tk -> +	let cont i = happyDoAction i tk action sts stk in+	case tk of {+	CTokEof -> happyDoAction 101# tk action sts stk;+	CTokLParen	_ -> cont 1#;+	CTokRParen	_ -> cont 2#;+	CTokLBracket	_ -> cont 3#;+	CTokRBracket	_ -> cont 4#;+	CTokArrow	_ -> cont 5#;+	CTokDot	_ -> cont 6#;+	CTokExclam	_ -> cont 7#;+	CTokTilde	_ -> cont 8#;+	CTokInc	_ -> cont 9#;+	CTokDec	_ -> cont 10#;+	CTokPlus	_ -> cont 11#;+	CTokMinus	_ -> cont 12#;+	CTokStar	_ -> cont 13#;+	CTokSlash	_ -> cont 14#;+	CTokPercent	_ -> cont 15#;+	CTokAmper	_ -> cont 16#;+	CTokShiftL	_ -> cont 17#;+	CTokShiftR	_ -> cont 18#;+	CTokLess	_ -> cont 19#;+	CTokLessEq	_ -> cont 20#;+	CTokHigh	_ -> cont 21#;+	CTokHighEq	_ -> cont 22#;+	CTokEqual	_ -> cont 23#;+	CTokUnequal	_ -> cont 24#;+	CTokHat	_ -> cont 25#;+	CTokBar	_ -> cont 26#;+	CTokAnd	_ -> cont 27#;+	CTokOr	_ -> cont 28#;+	CTokQuest	_ -> cont 29#;+	CTokColon	_ -> cont 30#;+	CTokAssign	_ -> cont 31#;+	CTokPlusAss	_ -> cont 32#;+	CTokMinusAss	_ -> cont 33#;+	CTokStarAss	_ -> cont 34#;+	CTokSlashAss	_ -> cont 35#;+	CTokPercAss	_ -> cont 36#;+	CTokAmpAss	_ -> cont 37#;+	CTokHatAss	_ -> cont 38#;+	CTokBarAss	_ -> cont 39#;+	CTokSLAss	_ -> cont 40#;+	CTokSRAss	_ -> cont 41#;+	CTokComma	_ -> cont 42#;+	CTokSemic	_ -> cont 43#;+	CTokLBrace	_ -> cont 44#;+	CTokRBrace	_ -> cont 45#;+	CTokEllipsis	_ -> cont 46#;+	CTokAlignof	_ -> cont 47#;+	CTokAsm	_ -> cont 48#;+	CTokAuto	_ -> cont 49#;+	CTokBreak	_ -> cont 50#;+	CTokBool	_ -> cont 51#;+	CTokCase	_ -> cont 52#;+	CTokChar	_ -> cont 53#;+	CTokConst	_ -> cont 54#;+	CTokContinue	_ -> cont 55#;+	CTokComplex	_ -> cont 56#;+	CTokDefault	_ -> cont 57#;+	CTokDo	_ -> cont 58#;+	CTokDouble	_ -> cont 59#;+	CTokElse	_ -> cont 60#;+	CTokEnum	_ -> cont 61#;+	CTokExtern	_ -> cont 62#;+	CTokFloat	_ -> cont 63#;+	CTokFor	_ -> cont 64#;+	CTokGoto	_ -> cont 65#;+	CTokIf	_ -> cont 66#;+	CTokInline	_ -> cont 67#;+	CTokInt	_ -> cont 68#;+	CTokLong	_ -> cont 69#;+	CTokLabel	_ -> cont 70#;+	CTokRegister	_ -> cont 71#;+	CTokRestrict	_ -> cont 72#;+	CTokReturn	_ -> cont 73#;+	CTokShort	_ -> cont 74#;+	CTokSigned	_ -> cont 75#;+	CTokSizeof	_ -> cont 76#;+	CTokStatic	_ -> cont 77#;+	CTokStruct	_ -> cont 78#;+	CTokSwitch	_ -> cont 79#;+	CTokTypedef	_ -> cont 80#;+	CTokTypeof	_ -> cont 81#;+	CTokThread	_ -> cont 82#;+	CTokUnion	_ -> cont 83#;+	CTokUnsigned	_ -> cont 84#;+	CTokVoid	_ -> cont 85#;+	CTokVolatile	_ -> cont 86#;+	CTokWhile	_ -> cont 87#;+	CTokCLit   _ _ -> cont 88#;+	CTokILit   _ _ -> cont 89#;+	CTokFLit   _ _ -> cont 90#;+	CTokSLit   _ _ -> cont 91#;+	CTokIdent  _ happy_dollar_dollar -> cont 92#;+	CTokTyIdent _ happy_dollar_dollar -> cont 93#;+	CTokGnuC GnuCAttrTok _ -> cont 94#;+	CTokGnuC GnuCExtTok  _ -> cont 95#;+	CTokGnuC GnuCComplexReal _ -> cont 96#;+	CTokGnuC GnuCComplexImag _ -> cont 97#;+	CTokGnuC GnuCVaArg    _ -> cont 98#;+	CTokGnuC GnuCOffsetof _ -> cont 99#;+	CTokGnuC GnuCTyCompat _ -> cont 100#;+	_ -> happyError' tk+	})++happyError_ tk = happyError' tk++happyThen :: () => P a -> (a -> P b) -> P b+happyThen = (>>=)+happyReturn :: () => a -> P a+happyReturn = (return)+happyThen1 = happyThen+happyReturn1 :: () => a -> P a+happyReturn1 = happyReturn+happyError' :: () => CToken -> P a+happyError' tk = (\token -> happyError) tk++header = happySomeParser where+  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))++statement = happySomeParser where+  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut11 x))++expression = happySomeParser where+  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut116 x))++happySeq = happyDontSeq+++--  sometimes it is neccessary to reverse an unreversed list+reverseList :: [a] -> Reversed [a]+reverseList = Reversed . List.reverse++-- We occasionally need things to have a location when they don't naturally+-- have one built in as tokens and most AST elements do.+--+data Located a = L !a !Position++unL :: Located a -> a+unL (L a pos) = a++instance Pos (Located a) where+  posOf (L _ pos) = pos++{-# INLINE withNodeInfo #-}+withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a+withNodeInfo node mkAttributedNode = do+  name <- getNewName+  let attrs = mkNodeInfo (posOf node) name+  attrs `seq` return (mkAttributedNode attrs)++data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo+reverseDeclr :: CDeclrR -> CDeclr+reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)+    = CDeclr ide (reverse reversedDDs) asmname cattrs at++{-# INLINE withAttribute #-}+withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR+withAttribute node cattrs mkDeclrNode = do+  name <- getNewName+  let attrs = mkNodeInfo (posOf node) name+  let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs+  attrs `seq` newDeclr `seq` return newDeclr++-- postfixing variant+{-# INLINE withAttributePF #-}+withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)+withAttributePF node cattrs mkDeclrCtor = do+  name <- getNewName+  let attrs = mkNodeInfo (posOf node) name+  let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs+  attrs `seq` newDeclr `seq` return newDeclr++-- add top level attributes for a declarator.+--+-- In the following example+--+-- > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));+--+-- the attributes `a1' and `a3' are top-level attributes for y.+-- The (pseudo)-AST for the second declarator is+--+-- > CDeclr "y"+-- >        [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]+-- >        (asm "$y")+-- >        [__attribute__((a1)), __attribute__((a3)) ]+--+-- So assembler names and preceeding and trailing attributes are recorded in object declarator.+--+appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr+appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)+    = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at+appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR+appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)+    = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at++setAsmName :: Maybe CStrLit  -> CDeclrR -> P CDeclrR+setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =+    case combineName mAsmName oldName of+        Left (n1,n2)       -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]+        Right newName      -> return $ CDeclrR ident indirections newName cattrs at+  where+  combineName Nothing Nothing = Right Nothing+  combineName Nothing oldname@(Just _)  = Right oldname+  combineName newname@(Just _) Nothing  = Right newname+  combineName (Just n1) (Just n2) = Left (n1,n2)+  showName (CStrLit cstr _) = show cstr++withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR+withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)++appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)+    = CDeclrR ident empty asmname (cattrs ++ newAttrs) at+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)+    = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where+    appendAttrs (CPtrDeclr typeQuals at)           = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at+    appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at+    appendAttrs (CFunDeclr parameters cattrs at)   = CFunDeclr parameters (cattrs ++ newAttrs) at++ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR+ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at+    = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat+funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR+funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at+    = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat+arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR+arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at+    = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )+    where+    arr_sz = case size_expr_opt of+                 Just e  -> CArrSize static_size e+                 Nothing -> CNoArrSize var_sized++liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]+liftTypeQuals (Reversed tyqs) = revmap [] tyqs+  where revmap a []     = a+        revmap a (x:xs) = revmap (CTypeQual x : a) xs++-- lift CAttrs to DeclSpecs+--+liftCAttrs :: [CAttr] -> [CDeclSpec]+liftCAttrs = map (CTypeQual . CAttrQual)++-- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list+-- needs special care when @decl_spec_n@ is a SUE definition+addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]+addTrailingAttrs declspecs new_attrs =+    case viewr declspecs of+        (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))+            -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))+        (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))+            -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))+        _ -> declspecs `rappend` (liftCAttrs new_attrs)++-- convenient instance, the position of a list of things is the position of+-- the first thing in the list+--+instance Pos a => Pos [a] where+  posOf (x:_) = posOf x++instance Pos a => Pos (Reversed a) where+  posOf (Reversed x) = posOf x++emptyDeclr     = CDeclrR Nothing empty Nothing [] (mkNodeInfoOnlyPos nopos)+mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []++-- Take the identifiers and use them to update the typedef'ed identifier set+-- if the decl is defining a typedef then we add it to the set,+-- if it's a var decl then that shadows typedefed identifiers+--+doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()+doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =+  case mIdent of+    Nothing -> return ()+    Just ident | any iypedef declspecs -> addTypedef ident+               | otherwise               -> shadowTypedef ident++  where iypedef (CStorageSpec (CTypedef _)) = True+        iypedef _                           = False++doFuncParamDeclIdent :: CDeclr -> P ()+doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =+  sequence_+    [ case getCDeclrIdent declr of+        Nothing -> return ()+        Just ident -> shadowTypedef ident+    | CDecl _ dle _  <- either (const []) fst params+    , (Just declr, _, _) <- dle ]+doFuncParamDeclIdent _ = return ()++-- extract all identifiers+getCDeclrIdent :: CDeclr -> Maybe Ident+getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent++happyError :: P a+happyError = parseError++-- * public interface++-- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.+parseC :: InputStream -> Position -> Either ParseError CTranslUnit+parseC input initialPosition =+  execParser header input initialPosition builtinTypeNames (namesStartingFrom 0)+{-# LINE 1 "GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command line>" #-}+{-# LINE 1 "GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp ++{-# LINE 28 "GenericTemplate.hs" #-}+++data Happy_IntList = HappyCons Int# Happy_IntList++++++{-# LINE 49 "GenericTemplate.hs" #-}++{-# LINE 59 "GenericTemplate.hs" #-}++{-# LINE 68 "GenericTemplate.hs" #-}++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is 0#, it means we've just accepted a partial+-- parse (a %partial parser).  We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+	happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = +	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+	= {- nothing -}+++	  case action of+		0#		  -> {- nothing -}+				     happyFail i tk st+		-1# 	  -> {- nothing -}+				     happyAccept i tk st+		n | (n <# (0# :: Int#)) -> {- nothing -}++				     (happyReduceArr ! rule) i tk st+				     where rule = (I# ((negateInt# ((n +# (1# :: Int#))))))+		n		  -> {- nothing -}+++				     happyShift new_state i tk st+				     where new_state = (n -# (1# :: Int#))+   where off    = indexShortOffAddr happyActOffsets st+	 off_i  = (off +# i)+	 check  = if (off_i >=# (0# :: Int#))+			then (indexShortOffAddr happyCheck off_i ==#  i)+			else False+ 	 action | check     = indexShortOffAddr happyTable off_i+		| otherwise = indexShortOffAddr happyDefActions st++{-# LINE 127 "GenericTemplate.hs" #-}+++indexShortOffAddr (HappyA# arr) off =+#if __GLASGOW_HASKELL__ > 500+	narrow16Int# i+#elif __GLASGOW_HASKELL__ == 500+	intToInt16# i+#else+	(i `iShiftL#` 16#) `iShiftRA#` 16#+#endif+  where+#if __GLASGOW_HASKELL__ >= 503+	i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+#else+	i = word2Int# ((high `shiftL#` 8#) `or#` low)+#endif+	high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+	low  = int2Word# (ord# (indexCharOffAddr# arr off'))+	off' = off *# 2#++++++data HappyAddr = HappyA# Addr#+++++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)++{-# LINE 170 "GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =+     let i = (case unsafeCoerce# x of { (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 -# (1# :: Int#)) sts of+	 sts1@((HappyCons (st1@(action)) (_))) ->+        	let r = fn stk in  -- it doesn't hurt to always seq here...+       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+     = happyFail 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))+       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))+             drop_stk = happyDropStk k stk++happyMonad2Reduce k nt fn 0# tk st sts stk+     = happyFail 0# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))+       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))+             drop_stk = happyDropStk k stk++             off    = indexShortOffAddr happyGotoOffsets st1+             off_i  = (off +# nt)+             new_state = indexShortOffAddr happyTable off_i+++++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n -# (1# :: Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n -# (1#::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 +# nt)+ 	 new_state = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (0# is the error token)++-- parse error if we are in recovery and we fail again+happyFail  0# tk old_st _ stk =+--	trace "failing" $ +    	happyError_ tk++{-  We don't need state discarding for our restricted implementation of+    "error".  In fact, it can cause some bogus parses, so I've disabled it+    for now --SDM++-- discard a state+happyFail  0# tk old_st (HappyCons ((action)) (sts)) +						(saved_tok `HappyStk` _ `HappyStk` stk) =+--	trace ("discarding state, depth " ++ show (length stk))  $+	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+--                       save the old token and carry on.+happyFail  i tk (action) sts stk =+--      trace "entering error recovery" $+	happyDoAction 0# tk action sts ( (unsafeCoerce# (I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: 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.
+ language-c.cabal view
@@ -0,0 +1,84 @@+Name:           language-c+Version:        0.3.0+Cabal-Version:  >= 1.2+Build-Type:     Simple+License:        BSD3+License-File:   LICENSE+Copyright:      LICENSE+Author:         AUTHORS+Maintainer:     benedikt.huber@gmail.com+Stability:      experimental+Homepage:       http://www.sivity.net/projects/language.c+Synopsis:       Analysis and generation of C code+Description:    Language C is a haskell library for the analysis and generation of C code.+                It features a complete, well tested parser and pretty printer for all of C99 and a large +                set of GNU extensions.+Category:       Language++Extra-Source-Files: src/Language/C/Parser/Lexer.x+                    src/Language/C/Parser/Parser.y+Flag splitBase+    Description: Choose the new smaller, split-up base package.+Flag useByteStrings+    Description: Use ByteString as InputStream datatype+    Default: True+Library+    Extensions: CPP, DeriveDataTypeable, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables+    Build-Depends:  filepath++    if flag(splitBase)+        Build-Depends: base >= 3, process, directory, array, containers, pretty+    else+        Build-Depends: base < 3+        +    if flag(useByteStrings)+        Build-Depends: bytestring >= 0.9.0+    else+        cpp-options: -DNO_BYTESTRING+    Build-Tools:    happy, alex++    Hs-Source-Dirs: src+    Exposed-Modules:  +                      -- top-level+                      Language.C+                      -- data+                      Language.C.Data+                      Language.C.Data.Position+                      Language.C.Data.Ident+                      Language.C.Data.Error+                      Language.C.Data.Name+                      Language.C.Data.Node+                      Language.C.Data.InputStream+                      -- syntax+                      Language.C.Syntax+                      Language.C.Syntax.AST+                      Language.C.Syntax.Constants+                      Language.C.Syntax.Ops+                      -- parser+                      Language.C.Parser+                      -- pretty printer+                      Language.C.Pretty+                      -- system+                      Language.C.System.Preprocess+                      Language.C.System.GCC+                      -- analysis [experimental]+                      Language.C.Analysis+                      Language.C.Analysis.SemError+                      Language.C.Analysis.SemRep              +                      Language.C.Analysis.DefTable+                      Language.C.Analysis.TravMonad+                      Language.C.Analysis.AstAnalysis+                      Language.C.Analysis.DeclAnalysis+                      Language.C.Analysis.Debug+                      -- semrep -> code [alpha]+                      Language.C.Analysis.Export+    Other-Modules:    +                      Language.C.Analysis.NameSpaceMap+                      Language.C.Data.RList+                      -- parser implementation+                      Language.C.Parser.Builtin+                      Language.C.Parser.Lexer +                      Language.C.Parser.ParserMonad +                      Language.C.Parser.Tokens +                      Language.C.Parser.Parser+
+ src/Language/C.hs view
@@ -0,0 +1,45 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C+-- Copyright   :  (c) 2008 Benedikt Huber+--                [1995..2007]+--                   Manuel M. T. Chakravarty+--                   Duncan Coutts+--                   Betram Felgenhauer+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : ghc+--+-- Library for analysing and generating C code.+--+-- See <http://www.sivity.net/projects/language.c>+-----------------------------------------------------------------------------+module Language.C (+    parseCFile,+    module Language.C.Data,+    module Language.C.Syntax,+    module Language.C.Pretty,+    module Language.C.Parser,+)+where+import Language.C.Data+import Language.C.Syntax+import Language.C.Pretty+import Language.C.Parser+import Language.C.System.Preprocess++-- | preprocess and parse a C source file+--+--   > Synopsis: parseCFile preprocesssor tmp-dir? cpp-opts file+--   > Example:  parseCFile (newGCC "gcc") Nothing ["-I/usr/include/gtk-2.0"] my-gtk-exts.c+parseCFile :: (Preprocessor cpp) => cpp -> (Maybe FilePath) -> [String] -> FilePath -> IO (Either ParseError CTranslUnit)+parseCFile cpp tmp_dir_opt args input_file = do+    input_stream <- if not (isPreprocessed input_file)+                        then  let cpp_args = (rawCppArgs args input_file) { cppTmpDir = tmp_dir_opt }+                              in  runPreprocessor cpp cpp_args >>= handleCppError+                        else  readInputStream input_file+    return$ parseC input_stream (Position input_file 1 1)+    where+    handleCppError (Left exitCode) = fail $ "Preprocessor failed with " ++ show exitCode+    handleCppError (Right ok)      = return ok
+ src/Language/C/Analysis.hs view
@@ -0,0 +1,70 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Analysis+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  alpha+-- Portability :  ghc+--+-- Analysis of the AST.+--+-- Currently, we provide a monad for analysis and analyze declarations and types.+-- Especially note that there is no direct support for analyzing function bodies and+-- constant expressions.+--+-- /NOTE/ This is an experimental interface, and therefore the API will change in the+-- future.+--+-- DONE:+--+--  * Name analysis framework+--+--  * File-scope analysis+--+--  * Declaration analysis+--+-- TODO:+--+--  * Type checking expressions+--+--  * Constant expression evaluation (CEE)+--+--  * Typed representation of attributes (depends on CEE)+--+--  * Normalized representation of initializers+--+--  * Support for analyzing function bodies (depends on CEE)+--+--  * Normalizing expressions and statements+--+--  * Formal rules how to link back to the AST using NodeInfo fields+--+--  * Typed assembler representation++-----------------------------------------------------------------------------+module Language.C.Analysis (+    -- * Semantic representation+    module Language.C.Analysis.SemRep,+    -- * Error datatypes for the analysis+    module Language.C.Analysis.SemError,+    -- * Traversal monad+    module Language.C.Analysis.TravMonad,+    -- * Top level analysis+    module Language.C.Analysis.AstAnalysis,+    -- * Analyzing declarations+    module Language.C.Analysis.DeclAnalysis,+    -- * Debug print+    module Language.C.Analysis.Debug,+)+where+import Language.C.Analysis.SemError+import Language.C.Analysis.SemRep++import Language.C.Analysis.DefTable+import Language.C.Analysis.TravMonad++import Language.C.Analysis.AstAnalysis+import Language.C.Analysis.DeclAnalysis++import Language.C.Analysis.Debug
+ src/Language/C/Analysis/AstAnalysis.hs view
@@ -0,0 +1,238 @@+{-# LANGUAGE ScopedTypeVariables, PatternGuards #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Parser.Translation+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  alpha+-- Portability :  ghc+--+-- Analyse the parse tree+--+-- Traverses the AST, analyses declarations and invokes handlers.+-----------------------------------------------------------------------------+module Language.C.Analysis.AstAnalysis (+    analyseAST,+    analyseExt,analyseFunDef,analyseExtDecls,+)+where+import Language.C.Analysis.SemError+import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad+import Language.C.Analysis.DefTable+import Language.C.Analysis.DeclAnalysis++import Language.C.Data+import Language.C.Syntax++import Control.Monad+import Prelude hiding (reverse)+import Data.Foldable (foldrM)+import Data.List hiding (reverse)+import Data.Maybe+import Data.Map (Map)+import qualified Data.Map as Map+import Debug.Trace+++-- * analysis++-- | Analyse the given AST+--+-- @analyseAST ast@ results in global declaration dictionaries.+-- If you want to perform specific actions on declarations or definitions, you may provide+-- callbacks in the @MonadTrav@ @m@.+--+-- Returns the set of global declarations and definitions which where successfully translated.+-- It is the users responsibility to check whether any hard errors occured (@runTrav@ does this for you).+analyseAST :: (MonadTrav m) => CTranslUnit -> m GlobalDecls+analyseAST (CTranslUnit decls _file_node) = do+    mapRecoverM_ analyseExt decls+    liftM globalDefs getDefTable+    where+    mapRecoverM_ f = mapM_ (handleTravError . f)++-- | Analyse an top-level declaration+analyseExt :: (MonadTrav m) => CExtDecl -> m ()+analyseExt (CAsmExt asm)+    = handleAsmBlock asm+analyseExt (CFDefExt fundef)+    = analyseFunDef fundef+analyseExt (CDeclExt decls)+    = analyseExtDecls decls++-- | Analyse a function definition+analyseFunDef :: (MonadTrav m) => CFunDef -> m ()+analyseFunDef (CFunDef declspecs declr oldstyle_decls stmt node_info) = do+    -- analyse the declarator+    var_decl_info <- analyseVarDecl True declspecs declr oldstyle_decls+    let (VarDeclInfo name is_inline storage_spec attrs ty declr_node) = var_decl_info+    let ident = identOfVarName name+    -- compute storage+    fun_storage <- computeFunDefStorage ident storage_spec+    let var_decl = VarDecl name (DeclAttrs is_inline fun_storage attrs) ty+    -- improve incomplete type+    ty' <- improveFunDefType ty+    -- callback+    handleVarDecl (Decl var_decl node_info)+    -- translate the body+    stmt' <- analyseFunctionBody var_decl stmt+    -- define the function+    handleFunDef ident (FunDef var_decl stmt' node_info)+    where+    improveFunDefType (FunctionType (FunTypeIncomplete return_ty attrs)) =+      return . FunctionType $ FunType return_ty [] False attrs+    improveFunDefType ty = return $ ty++-- | Analyse a top-level declaration other than a function definition+analyseExtDecls :: (MonadTrav m) => CDecl -> m ()+analyseExtDecls decl@(CDecl declspecs declrs node)+    | (Just declspecs') <- hasTypeDef declspecs =+        case declrs of+            [(Just tydeclr,Nothing,Nothing)] -> analyseTypeDef declspecs' tydeclr node+            _ -> astError node "bad typdef declaration: declarator missing or bitfieldsize/initializer present"+    | null declrs = analyseTypeDecl decl >> return ()+    | otherwise   = mapM_ (uncurry convertVarDeclr) $ zip (True : repeat False) declrs+    where+    convertVarDeclr handle_sue_def (Just declr, init_opt, Nothing) = do+        -- analyse the declarator+        vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <- analyseVarDecl handle_sue_def declspecs declr []+        -- declare / define the object+        init_opt' <- mapMaybeM init_opt tInit+        when (isTypeOfExpr typ) $ astError node "we cannot analyse typeof(expr) yet"+        if (isFunctionType typ)+            then extFunProto vardeclInfo+            else extVarDecl vardeclInfo init_opt'+    convertVarDeclr _ (Nothing,_,_)         = astError node "abstract declarator in object declaration"+    convertVarDeclr _ (_,_,Just bitfieldSz) = astError node "bitfield size in object declaration"+    isTypeOfExpr (TypeOfExpr _) = True+    isTypeOfExpr _ = False++-- | Analyse a typedef+analyseTypeDef :: (MonadTrav m) => [CDeclSpec] -> CDeclr -> NodeInfo -> m ()+analyseTypeDef declspecs declr node_info = do+    -- analyse the declarator+    (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl True declspecs declr []+    checkValidTypeDef is_inline storage_spec attrs+    let ident = identOfVarName name+    handleTypeDef (TypeDef ident ty attrs node_info)+    where+    checkValidTypeDef True _ _ = astError node_info "inline specifier for typeDef"+    checkValidTypeDef _ NoStorageSpec _ = return ()+    checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage++-- | Analyse declarators+analyseVarDecl :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> m VarDeclInfo+analyseVarDecl handle_sue_def declspecs declr oldstyle_params = do+    let (storagespecs, decl_attrs, typequals, typespecs, inline) = partitionDeclSpecs declspecs+    -- analyse the storage specifiers+    storage_spec  <- canonicalStorageSpec storagespecs+    -- translate the type into semantic representation+    typ          <- tType handle_sue_def node typequals typespecs derived_declrs oldstyle_params+    -- translate attributes+    attrs'       <- mapM tAttr (decl_attrs ++ declr_attrs)+    -- create the variable name+    name         <- mkVarName node nameOpt asmname_opt+    return $ VarDeclInfo name inline storage_spec attrs' typ node+    where+    (CDeclr nameOpt derived_declrs asmname_opt declr_attrs node) = declr+    isInlineSpec (CInlineQual _) = True+    isInlineSpec _ = False++-- | compute storage of a function definition+--+-- a function definition has static storage with internal linkage if specified `static`,+-- the previously declared linkage if any if 'extern' or no specifier are present. (See C99 6.2.2, clause 5)+--+-- This function won't raise an Trav error if the declaration is incompatible with the existing one,+-- this case is handled in 'handleFunDef'.+computeFunDefStorage :: (MonadTrav m) => Ident -> StorageSpec -> m Storage+computeFunDefStorage _ (StaticSpec b)  = return$ FunLinkage InternalLinkage+computeFunDefStorage ident other_spec  = do+  obj_opt <- lookupObject ident+  let defaultSpec = FunLinkage ExternalLinkage+  case other_spec of+    NoStorageSpec  -> return$ maybe defaultSpec declStorage obj_opt+    (ExternSpec False) -> return$ maybe defaultSpec declStorage obj_opt+    bad_spec -> throwTravError $ badSpecifierError (nodeInfo ident)+                  $ "unexpected function storage specifier (only static or extern is allowed)" ++ show bad_spec++-- | handle a function prototype+extFunProto :: (MonadTrav m) => VarDeclInfo -> m ()+extFunProto (VarDeclInfo var_name is_inline storage_spec attrs ty node_info) =+    do  old_fun <- lookupObject (identOfVarName var_name)+        checkValidSpecs+        let decl = VarDecl var_name (DeclAttrs is_inline (funDeclLinkage old_fun) attrs) ty+        handleVarDecl (Decl decl node_info)+    where+    funDeclLinkage old_fun =+        case storage_spec of+            NoStorageSpec    -> FunLinkage ExternalLinkage -- prototype declaration / external linkage+            StaticSpec False -> FunLinkage InternalLinkage -- prototype declaration / internal linkage+            ExternSpec False -> case old_fun of+                                    Nothing -> FunLinkage ExternalLinkage+                                    Just f  -> declStorage f+            _ -> error $ "funDeclLinkage: " ++ show storage_spec+    checkValidSpecs+        | hasThreadLocalSpec storage_spec = astError node_info "thread local storage specified for function"+        | RegSpec <- storage_spec        = astError node_info "invalid `register' storage specified for function"+        | otherwise                      = return ()++-- | handle a object declaration \/ definition+--+-- We have to check the storage specifiers here, as they determine wheter we're dealing with decalartions+-- or definitions+-- see [doc\/ExternalDefinitions.txt]+extVarDecl :: (MonadTrav m) => VarDeclInfo -> (Maybe Initializer) -> m ()+extVarDecl (VarDeclInfo var_name is_inline storage_spec attrs typ node_info) init_opt =+    do let ident = identOfVarName var_name+       old_decl <- lookupObject ident+       checkValidVarDeclStorage+       let vardecl linkage = VarDecl var_name (DeclAttrs is_inline linkage attrs) typ+       let decl linkage = Decl (vardecl linkage) node_info+       case storage_spec of+           NoStorageSpec           -- tentative if there is no initializer, external+               -> handleObjectDef ident $ ObjDef (vardecl (Static ExternalLinkage False)) init_opt node_info+           StaticSpec thread_local -- tentative if there is no initializer, internal+               -> handleObjectDef ident $ ObjDef (vardecl (Static InternalLinkage thread_local)) init_opt node_info+           ExternSpec thread_local+             | Nothing <- init_opt  -- declaration with either external or old storage+               -> handleVarDecl $ decl $ maybe (Static ExternalLinkage thread_local) declStorage old_decl+             | otherwise            -- warning, external definition+               -> do warn $ badSpecifierError node_info+                            "Both initializer and `extern` specifier given - treating as definition"+                     handleObjectDef ident $ ObjDef (vardecl (Static ExternalLinkage thread_local)) init_opt node_info+           _ -> error$ "extVarDecl: storage_spec: "++show storage_spec+    where+    checkValidVarDeclStorage+        | is_inline               = astError node_info "invalide `inline' specifier for non-function"+        | RegSpec <- storage_spec = astError node_info "invalid `register' storage specified for external object"+        | otherwise               = return ()++-- | /TODO/: Bogus+analyseFunctionBody :: (MonadTrav m) => VarDecl -> CStat -> m Stmt+analyseFunctionBody _ = return++-- | /TODO/: Bogus+tStmt :: (MonadTrav m) => CStat -> m Stmt+tStmt = return++-- | /TODO/: Bogus+tExpr :: (MonadTrav m) => CExpr -> m Expr+tExpr = return++-- | /TODO/: Bogus+tInit :: (MonadTrav m) => CInit -> m Initializer+tInit = return+++-- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@+hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec]+hasTypeDef declspecs =+    case foldr hasTypeDefSpec (False,[]) declspecs of+        (True,specs') -> Just specs'+        (False,_)     -> Nothing+    where+    hasTypeDefSpec (CStorageSpec (CTypedef n)) (_,specs) = (True, specs)+    hasTypeDefSpec spec (b,specs) = (b,spec:specs)
+ src/Language/C/Analysis/Debug.hs view
@@ -0,0 +1,163 @@+{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}+{-# OPTIONS -fno-warn-orphans #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Analysis.Debug+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  prototype+-- Portability :  ghc+--+-- Pretty printing the semantic analysis representation.+-- This is currently only intended for debugging purposes.+-----------------------------------------------------------------------------+module Language.C.Analysis.Debug (+globalDeclStats,+prettyAssocs, prettyAssocsWith,+-- and many pretty instances+)+where+import Language.C.Analysis.SemRep+import Language.C.Analysis.Export++import Language.C.Data+import Language.C.Pretty+import Language.C.Syntax++import Data.Generics+import Text.PrettyPrint.HughesPJ+import Data.Map (Map) ; import qualified Data.Map as Map++prettyAssocs :: (Pretty k, Pretty v) => String -> [(k,v)] -> Doc+prettyAssocs label = prettyAssocsWith label pretty pretty+prettyAssocsWith :: String -> (k -> Doc) -> (v -> Doc) -> [(k,v)] -> Doc+prettyAssocsWith label prettyKey prettyVal theMap =+    text label $$ (nest 8) (vcat $ map prettyEntry theMap)+    where+    prettyEntry (k,v) = prettyKey k <+> text " ~> " <+> prettyVal v++instance Pretty GlobalDecls where+    pretty gd = text "Global Declarations" $$ (nest 4 $ vcat declMaps)+        where+        declMaps = [ prettyMap "enumerators" theEnums, prettyMap "declarations" theDecls,+                     prettyMap "objects" theObjs,  prettyMap "functions" theFuns,+                     prettyMap "tags"    $ gTags gd,  prettyMap "typeDefs"  $ gTypeDefs gd ]+        prettyMap :: (Pretty t, Pretty k) => String -> Map k t -> Doc+        prettyMap label = prettyAssocs label . Map.assocs+        (theDecls, (theEnums, theObjs, theFuns)) = splitIdentDecls False (gObjs gd)++globalDeclStats :: (FilePath -> Bool) -> GlobalDecls -> [(String,Int)]+globalDeclStats file_filter gmap =+    [ ("Enumeration Constants",Map.size enumerators),+      ("Total Object/Function Declarations",Map.size all_decls),+      ("Object definitions", Map.size objDefs),+      ("Function Definitions", Map.size funDefs),+      ("Tag definitions", Map.size tagDefs),+      ("TypeDefs", Map.size typeDefs)+    ]+    where+    gmap' = filterGlobalDecls filterFile gmap+    (all_decls,(enumerators,objDefs,funDefs)) = splitIdentDecls True (gObjs gmap')+    (tagDefs,typeDefs) = (gTags gmap', gTypeDefs gmap')+    filterFile :: (CNode n) => n -> Bool+    filterFile = file_filter . posFile . posOfNode . nodeInfo+++instance Pretty (Either VarDecl ObjDef) where+    pretty = either pretty pretty+instance Pretty (Either VarDecl FunDef) where+    pretty = either pretty pretty+instance Pretty Ident where+    pretty = text . identToString+instance Pretty SUERef where+    pretty ref = text (show ref)+instance Pretty TagDef where+    pretty (CompDef compty) = pretty compty+    pretty (EnumDef enumty) = pretty enumty+instance Pretty IdentDecl where+    pretty (Declaration decl) = pretty decl+    pretty (ObjectDef odef) = pretty odef+    pretty (FunctionDef fdef) = pretty fdef+    pretty (EnumeratorDef enumerator) = pretty enumerator+instance Pretty Decl where+    pretty (Decl vardecl _) =+        text "declaration" <+>+        pretty vardecl+instance Pretty TypeDef where+    pretty (TypeDef ident ty attrs _) =+        text "typedef" <+> pretty ident <+> text "as"  <+>+        pretty attrs <+> pretty ty+instance Pretty ObjDef where+    pretty (ObjDef vardecl init_opt _) =+        text "object" <+>+        pretty vardecl <+> maybe empty (((text "=") <+>) . pretty) init_opt+instance Pretty FunDef where+    pretty (FunDef vardecl _stmt _) =+        text "function" <+>+        pretty vardecl+instance Pretty VarDecl where+    pretty (VarDecl name attrs ty) =+        ((hsep . punctuate (text " |")) [pretty name, pretty attrs, pretty ty])+instance Pretty ParamDecl where+    pretty (ParamDecl (VarDecl name declattrs ty) _) =+        pretty declattrs <+> pretty name <+> text "::" <+> pretty ty+instance Pretty DeclAttrs where+    pretty (DeclAttrs inline storage attrs) =+        (if inline then (text "inline") else empty) <+>+        (hsep $ [ pretty storage, pretty attrs])+instance Pretty Type where+  pretty ty = pretty (exportTypeDecl ty)+instance Pretty TypeQuals where+    pretty tyQuals = hsep $ map showAttr [ ("const",constant),("volatile",volatile),("restrict",restrict) ]+        where showAttr (str,select) | select tyQuals = text str+                                    | otherwise      = empty++instance Pretty CompType where+    pretty (CompType sue_ref tag members attrs node) =+        (text.show) tag <+> pretty sue_ref <+>+        braces (terminateSemi members) <+>+        pretty attrs+instance Pretty MemberDecl where+    pretty (MemberDecl (VarDecl name declattrs ty) bitfield _) =+        pretty declattrs <+> pretty name <+> text "::" <+> pretty ty <+>+        (maybe empty (\bf -> text ":" <+> pretty bf) bitfield)+    pretty (AnonBitField ty bitfield_sz _) =+        pretty ty <+> text ":" <+> pretty bitfield_sz++instance Pretty EnumType where+    pretty (EnumType sue_ref enumerators attrs _) =+      text "enum" <+> pretty sue_ref <+> braces (terminateSemi_ $ map prettyEnr enumerators) <+> pretty attrs+      where+      prettyEnr (Enumerator ident expr enumty _) = pretty ident <+> text " = " <+> pretty expr++instance Pretty Enumerator where+    pretty (Enumerator ident expr enumty _) = text "<" <> text "econst" <+> pretty (sueRef enumty) <> text ">" <+>+                                              pretty ident <+> text " = " <+> pretty expr++instance Pretty Storage where+    pretty NoStorage = empty+    pretty (Auto reg) = text$ if reg then "auto/register" else "auto"+    pretty (Static linkage thread_local) =+        (hcat . punctuate (text "/") $ [ text "static",pretty linkage ])+        <+> (if thread_local then text ", __thread" else empty)+    pretty (FunLinkage linkage) = text "function/" <> pretty linkage+instance Pretty Linkage where+    pretty InternalLinkage = text "internal"+    pretty ExternalLinkage = text "external"+instance Pretty VarName where+    pretty NoName = text "<anonymous>"+    pretty (VarName ident asmname_opt) = pretty ident <+> (maybe empty pAsmName asmname_opt)+        where pAsmName asmname = text "" <+> parens (text "asmname" <+> pretty asmname)+instance Pretty Attributes where+    pretty = joinComma+instance Pretty Attr where+    pretty (Attr ident es _) = pretty ident <+> (if null es then empty else text "(...)")++joinComma :: (Pretty a) => [a] -> Doc+joinComma = hsep . punctuate comma . map pretty+terminateSemi :: (Pretty a) => [a] -> Doc+terminateSemi = terminateSemi_ . map pretty+terminateSemi_ :: [Doc] -> Doc+terminateSemi_ = hsep . map (<> semi)+
+ src/Language/C/Analysis/DeclAnalysis.hs view
@@ -0,0 +1,514 @@+{-# LANGUAGE PatternGuards #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Analysis.DeclAnalysis+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  alpha+-- Portability :  ghc+--+-- This module performs the analysis of declarations and the translation of+-- type specifications in the AST.+-----------------------------------------------------------------------------+module Language.C.Analysis.DeclAnalysis (+  -- * Translating types+  analyseTypeDecl,+  tType,tDirectType,tNumType,tArraySize,tTypeQuals,+  mergeOldStyle,+  -- * Dissecting type specs+  canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..),+  canonicalStorageSpec, StorageSpec(..),hasThreadLocalSpec,+  -- * Helpers+  VarDeclInfo(..),+  tAttr,mkVarName,getOnlyDeclr,nameOfDecl,+)+where+import Language.C.Data.Error+import Language.C.Data.Node+import Language.C.Data.Ident+import Language.C.Syntax+import Language.C.Analysis.DefTable (TagFwdDecl(..))+import Language.C.Analysis.SemError+import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad++import Data.Foldable as F (foldrM)+import qualified Data.Traversable as T+import Control.Monad (liftM,when,ap)+import Data.List (intersperse, mapAccumL)+import Data.Map (Map)+import qualified Data.Map as Map+++-- * handling declarations++-- | analyse and translate a parameter declaration+-- Should be called in either prototype or block scope+tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl+tParamDecl (CDecl declspecs declrs node) =+  do declr <- getParamDeclr+     -- analyse the variable declaration+     (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl True declspecs declr [] Nothing+     when (is_inline) $ throwTravError (badSpecifierError node "parameter declaration with inline specifier")+     -- compute storage of parameter (NoStorage, but might have a register specifier)+     storage <- throwOnLeft $ computeParamStorage node storage_spec+     let paramDecl = mkParamDecl name storage attrs ty declr_node+     handleParamDecl paramDecl+     return $ paramDecl+  where+  getParamDeclr =+      case declrs of+          [] -> return (emptyDeclr node)+          [(Just declr,Nothing,Nothing)] -> return declr+          _ -> astError node "bad parameter declaration: multiple decls / bitfield or initializer present"+  mkParamDecl name storage attrs ty declr_node =+    let vd = VarDecl name (DeclAttrs False storage attrs) ty in+    case name of+      NoName -> AbstractParamDecl vd declr_node+      _ -> ParamDecl vd declr_node+-- | a parameter declaration has no linkage and either auto or register storage+computeParamStorage :: NodeInfo -> StorageSpec -> Either BadSpecifierError Storage+computeParamStorage _ NoStorageSpec = Right (Auto False)+computeParamStorage _ RegSpec       = Right (Auto True)+computeParamStorage node spec       = Left . badSpecifierError node $ "Bad storage specified for parameter: " ++ show spec++-- | analyse and translate a member declaration+tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl]+tMemberDecls (CDecl declspecs declrs node) = mapM (uncurry tMemberDecl) (zip (True:repeat False) declrs)+    where+    tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) =+        do var_decl <- analyseVarDecl handle_sue_def declspecs member_declr [] Nothing+           let (VarDeclInfo name is_inline storage_spec attrs ty declr_node) = var_decl+           --+           checkValidMemberSpec is_inline storage_spec+           return $ MemberDecl (VarDecl name (DeclAttrs False NoStorage attrs) ty) bit_field_size_opt node+    tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) =+        do let (storage_specs, _attrs, typequals, typespecs, is_inline) = partitionDeclSpecs declspecs+           storage_spec  <- canonicalStorageSpec storage_specs+           typ           <- tType handle_sue_def node typequals typespecs [] []+           --+           return $ AnonBitField typ bit_field_size node+    tMemberDecl _ _ = astError node "Bad member declaration"+    checkValidMemberSpec is_inline storage_spec =+        do  when (is_inline)                     $ astError node "member declaration with inline specifier"+            when (storage_spec /= NoStorageSpec) $ astError node "storage specifier for member"+            return ()++data StorageSpec = NoStorageSpec | AutoSpec | RegSpec | ThreadSpec | StaticSpec Bool | ExternSpec Bool+                    deriving (Eq,Ord,Show,Read)++hasThreadLocalSpec :: StorageSpec -> Bool+hasThreadLocalSpec ThreadSpec = True+hasThreadLocalSpec (StaticSpec b) = b+hasThreadLocalSpec (ExternSpec b) = b+hasThreadLocalSpec _  = False++data VarDeclInfo = VarDeclInfo VarName Bool {- is-inline? -} StorageSpec Attributes Type NodeInfo++-- | analyse declarators+analyseVarDecl :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo+analyseVarDecl handle_sue_def declspecs+               (CDeclr name_opt derived_declrs asmname_opt declr_attrs node)+               oldstyle_params init_opt+    = do let (storage_specs, decl_attrs, typequals, typespecs, inline) = partitionDeclSpecs declspecs+         -- analyse the storage specifiers+         storage_spec  <- canonicalStorageSpec storage_specs+         -- translate the type into semantic representation+         typ          <- tType handle_sue_def node typequals typespecs derived_declrs oldstyle_params+         -- translate attributes+         attrs'       <- mapM tAttr (decl_attrs ++ declr_attrs)+         -- make name+         name         <- mkVarName node name_opt asmname_opt+         return $ VarDeclInfo name inline storage_spec attrs' typ node+    where+        isInlineSpec (CInlineQual _) = True+        isInlineSpec _ = False+++-- return @True@ if the declarations is a type def+isTypeDef :: [CDeclSpec] -> Bool+isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ]+++-- * translation++-- | get the type of a /type declaration/+--+-- A type declaration @T@ may appear in thre forms:+--+--  * @typeof(T)@+--+--  * as abstract declarator in a function prototype, as in @f(int)@+--+--  * in a declaration without declarators, as in @struct x { int a } ;@+--+-- Currently, @analyseTypeDecl@ is exlusively used for analysing types for GNU's @typeof(T)@.+--+-- We move attributes to the type, as they have no meaning for the abstract declarator+analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type+analyseTypeDecl (CDecl declspecs declrs node)+    | [] <- declrs = analyseTyDeclr (emptyDeclr node)+    | [(Just declr,Nothing,Nothing)] <- declrs = analyseTyDeclr declr+    | otherwise = astError node "Bad declarator for type declaration"+    where+    analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode)+        | (not (null storagespec) || inline) = astError node "storage specifier for type declaration"+        | otherwise                          = tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)+                                                     typespecs derived_declrs []+        where+        (storagespec, attrs_decl, typequals, typespecs, inline) = partitionDeclSpecs declspecs+    analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration"+++-- | translate a type+tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> [CDerivedDeclr] -> [CDecl] -> m Type+tType handle_sue_def top_node typequals typespecs derived_declrs oldstyle_params+    = mergeOldStyle top_node oldstyle_params derived_declrs >>= buildType+    where+    buildType [] = tDirectType handle_sue_def top_node typequals typespecs+    buildType (CPtrDeclr ptrquals node : dds) =+        buildType dds >>= buildPointerType ptrquals node+    buildType (CArrDeclr arrquals size node : dds)+        = buildType dds >>= buildArrayType arrquals size node+    buildType (CFunDeclr ~(Right (params, isVariadic)) attrs node : dds)+        = buildType dds >>= (liftM FunctionType . buildFunctionType params isVariadic attrs node)+    buildPointerType ptrquals _node inner_ty+        = liftM (\(quals,attrs) -> PtrType inner_ty quals attrs) (tTypeQuals ptrquals)+    buildArrayType arr_quals size _node inner_ty+        = do (quals,attrs) <- tTypeQuals arr_quals+             arr_sz        <- tArraySize size+             return$ ArrayType inner_ty arr_sz quals attrs+    -- We build functions in function prototype scope.+    -- When analyzing the  the function body, we push parameters in function body scope.+    buildFunctionType params is_variadic attrs _node return_ty+        = do enterPrototypeScope+             params' <- mapM tParamDecl params+             leavePrototypeScope+             attrs'   <- mapM tAttr attrs+             return $ case (map declType params',is_variadic) of+               ([],False) -> FunTypeIncomplete return_ty attrs'  -- may be improved later on+               ([DirectType TyVoid _],False) -> FunType return_ty [] False attrs'+               _ -> FunType return_ty params' is_variadic attrs'++-- | translate a type without (syntactic) indirections+-- Due to the GNU @typeof@ extension and typeDefs, this can be an arbitrary type+tDirectType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> m Type+tDirectType handle_sue_def node ty_quals ty_specs = do+    (quals,attrs) <- tTypeQuals ty_quals+    canonTySpec <- canonicalTypeSpec ty_specs+    let baseType ty_name = DirectType ty_name quals+    case canonTySpec of+        TSNone -> return$ baseType (TyIntegral TyInt)+        TSVoid -> return$ baseType TyVoid+        TSBool -> return$ baseType (TyIntegral TyBool)+        TSNum tsnum -> do+            numType <- tNumType tsnum+            return . baseType $+                case numType of+                    Left (floatType,iscomplex) | iscomplex -> TyComplex floatType+                                               | otherwise -> TyFloating floatType+                    Right intType  -> TyIntegral intType+        TSNonBasic (CSUType su _tnode)      -> liftM (baseType . TyComp) $ tCompTypeDecl handle_sue_def su+        TSNonBasic (CEnumType enum _tnode)   -> liftM (baseType . TyEnum) $ tEnumTypeDecl handle_sue_def enum+        TSNonBasic (CTypeDef name t_node)    -> liftM TypeDefType $ typeDefRef t_node name+        -- TODO: analyse type of expression+        TSNonBasic (CTypeOfExpr expr _tnode) -> return $ TypeOfExpr expr+        TSNonBasic (CTypeOfType decl t_node) ->  analyseTypeDecl decl >>= mergeTypeAttributes t_node quals attrs+        TSNonBasic _ -> astError node "Unexpected typespec"++-- | Merge type attributes+--+-- This handles for example the form+--+-- > /* tyqual attr typeof(type) */+-- > const typeof(char volatile) x;+mergeTypeAttributes :: (MonadTrav m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type+mergeTypeAttributes node_info quals attrs typ =+    case typ of+        DirectType ty_name quals' -> merge quals' [] $ mkDirect ty_name+        PtrType ty quals' attrs'  -> merge quals' attrs' $ PtrType ty+        ArrayType ty array_sz quals' attrs' -> merge quals' attrs' $ ArrayType ty array_sz+        FunctionType (FunType return_ty params inline attrs')+            | not (null attrs) -> astError node_info "type qualifiers for function type"+            | otherwise        -> return$ FunctionType (FunType return_ty params inline (attrs' ++ attrs))+    where+    mkDirect ty_name quals' attrs' | null attrs' = DirectType ty_name quals'+                                   | otherwise   = error "_attribute__ s for DirectType"+    merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs)++typeDefRef :: (MonadTrav m) => NodeInfo -> Ident -> m TypeDefRef+typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name (Just ty) t_node)++-- extract a struct\/union+-- we emit @declStructUnion@ and @defStructUnion@ actions+--+-- TODO: should attributes be part of declarartions too ?+tCompTypeDecl :: (MonadTrav m) => Bool -> CStructUnion -> m CompTypeRef+tCompTypeDecl handle_def (CStruct tag ident_opt member_decls_opt attrs node_info) = do+    -- create reference+    sue_ref <- createSUERef node_info ident_opt+    let tag' = tTag tag+    attrs' <- mapM tAttr attrs+    -- record tag name+    let decl = CompTypeRef sue_ref tag' node_info+    handleTagDecl (CompDecl decl)+    -- when handle_def is true, enter the definition+    when (handle_def) $ do+        maybeM member_decls_opt $ \decls ->+                tCompType sue_ref tag' decls (attrs') node_info+            >>= (handleTagDef.CompDef)+    return decl++tTag :: CStructTag -> CompTyKind+tTag CStructTag = StructTag+tTag CUnionTag  = UnionTag++tCompType :: (MonadTrav m) => SUERef -> CompTyKind -> [CDecl] -> Attributes -> NodeInfo -> m CompType+tCompType tag sue_ref member_decls attrs node+    = return (CompType tag sue_ref) `ap`+        (concatMapM tMemberDecls member_decls) `ap`+        (return attrs) `ap`+        (return node)++-- | translate a enum type decl+--+--  > enum my_enum+--  > enum your_enum { x, y=3 }+--+tEnumTypeDecl :: (MonadTrav m) => Bool -> CEnum -> m EnumTypeRef+tEnumTypeDecl handle_def (CEnum ident_opt enumerators_opt attrs node_info)+    | (Nothing, Nothing) <- (ident_opt, enumerators_opt) = astError node_info "both definition and name of enum missing"+    | Just [] <- enumerators_opt                         = astError node_info "empty enumerator list"+    | otherwise+        = do sue_ref <- createSUERef node_info ident_opt+             attrs' <- mapM tAttr attrs+             let decl = EnumTypeRef sue_ref node_info+             when handle_def $ do+                 maybeM enumerators_opt $ \enumerators ->+                         tEnumType sue_ref enumerators attrs' node_info+                    >>=  (handleTagDef . EnumDef)+             return decl++-- | translate and analyse an enumeration type+tEnumType :: (MonadTrav m) => SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType+tEnumType sue_ref enumerators attrs node = do+    mapM_ handleEnumeratorDef enumerators'+    return ty+    where+    ty = EnumType sue_ref enumerators' attrs node+    (_,enumerators') = mapAccumL nextEnumerator (Left 0) enumerators+    nextEnumerator memo (ident,e) =+      let (memo',expr) = nextEnrExpr memo e in+      (memo', Enumerator ident expr ty (nodeInfo ident))+    nextEnrExpr :: (Either Integer (Expr,Integer)) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr)+    nextEnrExpr (Left i) Nothing = (Left (succ i), intExpr i)+    nextEnrExpr (Right (e,offs)) Nothing = (Right (e, succ offs), offsExpr e offs)+    nextEnrExpr _ (Just e) = (Right (e,1), e)+    intExpr i = CConst (CIntConst (cInteger i) internalNode)+    offsExpr e offs = CBinary CAddOp e (intExpr offs) internalNode++-- | Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.+tNumType :: (MonadTrav m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType)+tNumType (NumTypeSpec basetype sgn sz iscomplex) =+    case (basetype,sgn,sz) of+        (BaseChar,_,NoSizeMod)      | Signed <- sgn   -> intType TySChar+                                      | Unsigned <- sgn -> intType TyUChar+                                      | otherwise       -> intType TyChar+        (intbase, _, NoSizeMod)  | optBase BaseInt intbase ->+            intType$ case sgn of+                            Unsigned -> TyUInt+                            _        -> TyInt+        (intbase, signed, sizemod)    | optBase BaseInt intbase, optSign Signed signed ->+            intType$ case sizemod of ShortMod    -> TyShort+                                     LongMod     -> TyLong+                                     LongLongMod -> TyLLong+                                     _ -> internalErr "numTypeMapping: unexpected pattern matching error"+        (intbase, Unsigned, sizemod) | optBase BaseInt intbase ->+            intType$ case sizemod of ShortMod    -> TyUShort+                                     LongMod     -> TyULong+                                     LongLongMod -> TyULLong+                                     _ -> internalErr "numTypeMapping: unexpected pattern matching error"+        (BaseFloat, NoSignSpec, NoSizeMod)  -> floatType TyFloat+        (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble+        (BaseDouble, NoSignSpec, LongMod)   -> floatType TyLDouble+        -- TODO: error analysis+        (_,_,_)   -> error "Bad AST analysis"+    where+    optBase _ NoBaseType = True+    optBase expect baseTy = expect == baseTy+    optSign _ NoSignSpec = True+    optSign expect sign = expect == sign+    intType = return . Right+    floatType ft = return (Left (ft,iscomplex))++-- TODO: currently bogus+tArraySize :: (MonadTrav m) => CArrSize -> m ArraySize+tArraySize (CNoArrSize False) = return (UnknownArraySize False)+tArraySize (CNoArrSize True) = return (UnknownArraySize True)+tArraySize (CArrSize static szexpr) = liftM (ArraySize static) (return szexpr)++tTypeQuals :: (MonadTrav m) => [CTypeQual] -> m (TypeQuals,Attributes)+tTypeQuals = foldrM go (noTypeQuals,[]) where+    go (CConstQual _) (tq,attrs) = return$ (tq { constant = True },attrs)+    go (CVolatQual _) (tq,attrs) = return$ (tq { volatile = True },attrs)+    go (CRestrQual _) (tq,attrs) = return$ (tq { restrict = True },attrs)+    go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr)+    go (CInlineQual node) (_tq,_attrs) = astError node "unexpected inline qualifier"+++-- * analysis+++{-+To canoicalize type specifiers, we define a canonical form:+void | bool | (char|int|float|double) (signed|unsigned)? (long long?)? complex? | othertype+-}+data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseFloat | BaseDouble deriving (Eq,Ord)+data SignSpec    = NoSignSpec | Signed | Unsigned deriving (Eq,Ord)+data SizeMod     = NoSizeMod | ShortMod | LongMod | LongLongMod deriving (Eq,Ord)+data NumTypeSpec = NumTypeSpec { base :: NumBaseType, signSpec :: SignSpec, sizeMod :: SizeMod, isComplex :: Bool  }+emptyNumTypeSpec :: NumTypeSpec+emptyNumTypeSpec = NumTypeSpec { base = NoBaseType, signSpec = NoSignSpec, sizeMod = NoSizeMod, isComplex = False }+data TypeSpecAnalysis = TSNone | TSVoid | TSBool | TSNum NumTypeSpec | TSNonBasic CTypeSpec++canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis+canonicalTypeSpec = foldrM go TSNone where+    getNTS TSNone = Just emptyNumTypeSpec+    getNTS (TSNum nts) = Just nts+    getNTS _ = Nothing+    updLongMod NoSizeMod = Just LongMod+    updLongMod LongMod   = Just LongLongMod+    updLongMod _         = Nothing+    go (CVoidType _)    TSNone = return$  TSVoid+    go (CBoolType _)    TSNone = return$  TSBool+    go (CCharType _)    tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+                            = return$  TSNum$ nts { base = BaseChar }+    go (CIntType _)     tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+                            = return$  TSNum$ nts { base = BaseInt }+    go (CFloatType _)   tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+                            = return$  TSNum$ nts { base = BaseFloat }+    go (CDoubleType _)  tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+                            = return$  TSNum$ nts { base = BaseDouble }+    go (CShortType _)   tsa | (Just nts@(NumTypeSpec { sizeMod = NoSizeMod })) <- getNTS tsa+                            = return$  TSNum$nts { sizeMod = ShortMod }+    go (CLongType _)    tsa | (Just nts@(NumTypeSpec { sizeMod = szMod })) <- getNTS tsa,+                              (Just szMod') <- updLongMod szMod+                            = return$  TSNum$ nts { sizeMod = szMod' }+    go (CSignedType _)  tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa+                            = return$  TSNum$ nts { signSpec = Signed }+    go (CUnsigType _)   tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa+                            = return$  TSNum$ nts { signSpec = Unsigned }+    go (CComplexType _) tsa | (Just nts@(NumTypeSpec { isComplex = False })) <- getNTS tsa+                            = return$  TSNum$ nts { isComplex = True }+    go otherType  TSNone    = return$  TSNonBasic otherType+    go ty _ts = astError (nodeInfo ty) "Invalid type specifier"++-- compute storage given storage specifiers+canonicalStorageSpec :: (MonadTrav m) =>[CStorageSpec] -> m StorageSpec+canonicalStorageSpec storagespecs = liftM elideAuto $ foldrM updStorage NoStorageSpec storagespecs where+        updStorage (CAuto _) NoStorageSpec     = return$ AutoSpec+        updStorage (CRegister _) NoStorageSpec = return$ RegSpec+        updStorage (CThread _) NoStorageSpec   = return$ ThreadSpec+        updStorage (CThread _) (StaticSpec _)  = return$ StaticSpec True+        updStorage (CThread _) (ExternSpec _)  = return$ ExternSpec True+        updStorage (CStatic _) NoStorageSpec   = return$ StaticSpec False+        updStorage (CExtern _) NoStorageSpec   = return$ ExternSpec False+        updStorage (CStatic _) ThreadSpec      = return$ StaticSpec True+        updStorage (CExtern _) ThreadSpec      = return$ ExternSpec True+        updStorage badSpec old+            = astError (nodeInfo badSpec) $ "Invalid storage specifier "++show badSpec++" in combination with "++show old+        elideAuto AutoSpec = NoStorageSpec+        elideAuto spec = spec++-- | convert old style parameters+--+-- This requires matching parameter names and declarations, as in the following example:+--+-- > int f(d,c,a,b)+-- > char a,*b;+-- > int c;+-- > { }+--+-- is converted to+--+-- > int f(int d, int c, char a, char* b)+--+-- TODO: This could be moved to syntax, as it operates on the AST only+mergeOldStyle :: (MonadTrav m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]+mergeOldStyle _node [] declrs = return declrs+mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) =+    case params of+        Left list -> do+            -- FIXME: This translation doesn't work in the following example+            -- [| int f(b,a) struct x { }; int b,a; { struct x local; return local.x } |]+            oldstyle_params' <- liftM concat $ mapM splitCDecl oldstyle_params+            param_map <- liftM Map.fromList $ mapM attachNameOfDecl oldstyle_params'+            (newstyle_params,param_map') <- foldrM insertParamDecl ([],param_map) list+            when (not $ Map.null param_map') $+                astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter"+            return $ (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds)+        Right _newstyle -> astError node "oldstyle parameter list, but newstyle function declaration"+    where+        attachNameOfDecl decl = nameOfDecl decl >>= \n -> return (n,decl)+        insertParamDecl param_name (ps, param_map)+            = case Map.lookup param_name param_map of+                Just p -> return (p:ps, Map.delete param_name param_map)+                Nothing -> return (implicitIntParam param_name : ps, param_map)+        implicitIntParam param_name =+            let node = (nodeInfo param_name) in+            CDecl [CTypeSpec (CIntType node)] [(Just (CDeclr (Just param_name) [] Nothing [] node),Nothing,Nothing)] node+        showParamMap = concat . intersperse ", " . map identToString . Map.keys+mergeOldStyle node _ _ = astError node "oldstyle parameter list, but not function type"++-- | split a CDecl into declarators, hereby eliding SUE defs from the second declarator on.+--+--   There are several reasons why this isn;t the preferred way for handling multiple-declarator declarations,+--   but it can be convinient some times.+--+-- > splitCDecl [d| struct x { int z; } a,*b; |]+-- > [ [d| struct x { int z; } a, struct x *b |] ]+--+-- /TODO/: This could be moved to syntax, as it operates on the AST only+splitCDecl :: (MonadTrav m) => CDecl -> m [CDecl]+splitCDecl decl@(CDecl declspecs declrs node) =+    case declrs of+        []      -> internalErr "splitCDecl applied to empty declaration"+        [declr] -> return [decl]+        (d1:ds) ->+            let declspecs' = map elideSUEDef declspecs in+            return$ (CDecl declspecs [d1] node) : [ CDecl declspecs' [declr] node | declr <- ds ]+    where+    elideSUEDef declspec@(CTypeSpec tyspec) =+        case tyspec of+            (CEnumType (CEnum name def attrs enum_node) node) ->+                CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node)+            (CSUType (CStruct tag name def attrs su_node) node) ->+                CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node)+            _ -> declspec+    elideSUEDef declspec = declspec+++-- | translate @__attribute__@ annotations+-- TODO: This is a unwrap and wrap stub+tAttr :: (MonadTrav m) => CAttr -> m Attr+tAttr (CAttr name cexpr node) = return$ Attr name cexpr node+++-- | construct a name for a variable+-- TODO: more or less bogus+mkVarName :: (MonadTrav m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName+mkVarName  node Nothing _ = return NoName+mkVarName  node (Just n) asm = return $ VarName n Nothing++-- helpers+nameOfDecl :: (MonadTrav m) => CDecl -> m Ident+nameOfDecl d = getOnlyDeclr d >>= \declr ->+    case declr of+        (CDeclr (Just name) _ _ _ _) -> return name+        (CDeclr Nothing _ _ _ node) -> internalErr "nameOfDecl: abstract declarator"+emptyDeclr :: NodeInfo -> CDeclr+emptyDeclr node = CDeclr Nothing [] Nothing [] node+getOnlyDeclr :: (MonadTrav m) => CDecl -> m CDeclr+getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr+getOnlyDeclr (CDecl _ _ node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"
+ src/Language/C/Analysis/DefTable.hs view
@@ -0,0 +1,305 @@+{-# LANGUAGE PatternGuards, DeriveDataTypeable  #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Analysis.DefTable+-- Copyright   :  (c) 2008 Benedikt Huber+--                  based on code from c2hs+--                (c) [1999..2001] Manuel M. T. Chakravarty+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  alpha+-- Portability :  ghc+--+-- This module manages symbols in local and global scopes.+--+-- There are four different kind of identifiers: ordinary identifiers (henceforth+-- simply called `identifier'), tag names (names of struct\/union\/enum types),+-- labels and structure members.+-----------------------------------------------------------------------------+module Language.C.Analysis.DefTable (+    IdentEntry, identOfTyDecl,+    TagEntry, TagFwdDecl(..),+    DefTable(..),+    emptyDefTable,+    globalDefs,+    enterFunctionScope,leaveFunctionScope,enterBlockScope,leaveBlockScope,+    enterMemberDecl,leaveMemberDecl,+    DeclarationStatus(..),declStatusDescr,+    defineTypeDef, defineGlobalIdent, defineScopedIdent, defineScopedIdentWhen,+    declareTag,defineTag,defineLabel,lookupIdent,+    lookupTag,lookupLabel,lookupIdentInner,lookupTagInner,+)+where+import Language.C.Data+import Language.C.Data.Name (NameMap,emptyNameMap)+import Language.C.Analysis.NameSpaceMap+import Language.C.Analysis.SemRep++import Control.Applicative ((<|>))+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Generics++{- Name spaces, scopes and contexts [Scopes]++ In C, there are 4 categories of identifiers:++  * labels+  * tag names (@(struct|union|enum) tag-name@), where /all/ tag names live in one namespace+  * members of structures and unions+  * ordinary identifiers, denoting objects, functions, typeDefs and enumeration constants++ There are 4 kind of scopes:++  * file scope: outside of parameter lists and blocks+  * function prototype scope+  * function scope: labels are visible within the entire function, and declared implicitely+  * block scope++ While function scope is irrelevant for variable declarations, they might also appear in member declarations.+ Therefore, there are also 4 kinds of contexts where a variable might be declared:++  * File Scope Context: external declaration \/ definition+  * Block Scope Context: either external or local definition+  * Function prototype scope context+  * Member Declaration context++ See+   <http://www.embedded.com/design/206901036>+   C99 6+-}++-- | All ordinary identifiers map to 'IdenTyDecl': either a typedef or a object\/function\/enumerator+type IdentEntry = Either TypeDef IdentDecl++identOfTyDecl :: IdentEntry -> Ident+identOfTyDecl = either identOfTypeDef declIdent++data TagFwdDecl = CompDecl CompTypeRef+                | EnumDecl EnumTypeRef+instance HasSUERef TagFwdDecl where+  sueRef (CompDecl ctr) = sueRef ctr+  sueRef (EnumDecl etr) = sueRef etr+instance CNode TagFwdDecl where+  nodeInfo (CompDecl ctr) = nodeInfo ctr+  nodeInfo (EnumDecl etr) = nodeInfo etr++-- | Tag names map to forward declarations or definitions of struct\/union\/enum types+type TagEntry = Either TagFwdDecl TagDef++-- | Table holding current definitions+data DefTable = DefTable+    {+        identDecls   :: NameSpaceMap Ident IdentEntry,    -- ^ declared `ordinary identifiers'+        tagDecls   :: NameSpaceMap SUERef TagEntry,       -- ^ declared struct/union/enum  tags+        labelDefs  :: NameSpaceMap Ident Ident,            -- ^ defined labels+        memberDecls :: NameSpaceMap Ident MemberDecl,      -- ^ member declarations (only local)+        refTable   :: NameMap Name                         -- ^ link names with definitions+    }++-- | empty definition table, with all name space maps in global scope+emptyDefTable :: DefTable+emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap emptyNameMap++-- | get the globally defined entries of a definition table+globalDefs :: DefTable -> GlobalDecls+globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl)+    where+    e = Map.empty+    (_fwd_decls,gtags) = Map.mapEither id $ globalNames (tagDecls deftbl)+    insertDecl ident (Left tydef) ds = ds { gTypeDefs = Map.insert ident tydef (gTypeDefs ds)}+    insertDecl ident (Right obj) ds = ds { gObjs = Map.insert ident obj (gObjs ds) }++leaveScope_ :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a+leaveScope_ = fst . leaveScope++enterLocalScope :: DefTable -> DefTable+enterLocalScope deftbl = deftbl {+        identDecls = enterNewScope (identDecls deftbl),+        tagDecls = enterNewScope (tagDecls deftbl)+    }+leaveLocalScope :: DefTable -> DefTable+leaveLocalScope deftbl = deftbl {+                        identDecls = leaveScope_ (identDecls deftbl),+                        tagDecls = leaveScope_ (tagDecls deftbl)+                       }++-- | Enter function scope (and the corresponding block scope)+enterFunctionScope :: DefTable -> DefTable+enterFunctionScope deftbl = enterLocalScope  $+                          deftbl { labelDefs = enterNewScope (labelDefs deftbl) }++-- | Leave function scope, and return the associated DefTable.+--   Error if not in function scope.+leaveFunctionScope :: DefTable -> DefTable+leaveFunctionScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }++-- | Enter new block scope+enterBlockScope :: DefTable -> DefTable+enterBlockScope = enterLocalScope++-- | Leave innermost block scope+leaveBlockScope :: DefTable -> DefTable+leaveBlockScope = leaveLocalScope++-- | Enter new member declaration scope+enterMemberDecl :: DefTable -> DefTable+enterMemberDecl deftbl = deftbl { memberDecls = enterNewScope (memberDecls deftbl) }++-- | Leave innermost member declaration scope+leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable)+leaveMemberDecl deftbl =+    let (decls',members) = leaveScope (memberDecls deftbl)+    in (,) (map snd members)+           (deftbl { memberDecls = decls' })++-- * declarations++-- | Status of a declaration+data DeclarationStatus t =+      NewDecl         -- ^ new entry+    | Redeclared t    -- ^ old def was overwritten+    | KeepDef t       -- ^ new def was discarded+    | Shadowed t      -- ^ new def shadows one in outer scope+    | KindMismatch t  -- ^ kind mismatch+    deriving (Data,Typeable)+declStatusDescr :: DeclarationStatus t -> String+declStatusDescr NewDecl = "new"+declStatusDescr (Redeclared _) = "redeclared"+declStatusDescr (KeepDef _) = "keep old"+declStatusDescr (Shadowed _) = "shadowed"+declStatusDescr (KindMismatch _) = "kind mismatch"++compatIdentEntry :: IdentEntry -> IdentEntry -> Bool+compatIdentEntry (Left _tydef) = either (const True) (const False)+compatIdentEntry (Right def) = either (const False) $+  \other_def -> case (def,other_def) of+                  (EnumeratorDef _, EnumeratorDef _) -> True+                  (EnumeratorDef _, _) -> True+                  (_, EnumeratorDef _) -> True+                  (_,_) -> True++data TagEntryKind = CompKind CompTyKind | EnumKind+                    deriving (Eq,Ord)+instance Show TagEntryKind where+  show (CompKind ctk) = show ctk+  show EnumKind = "enum"++-- | @sameTagKind ty1 ty2@ returns @True@ if @ty1,ty2@ are the same kind of tag (struct,union or enum)+tagKind :: TagEntry -> TagEntryKind+tagKind (Left (CompDecl cd)) = CompKind (compTag cd)+tagKind (Left (EnumDecl _)) = EnumKind+tagKind (Right (CompDef cd)) = CompKind (compTag cd)+tagKind (Right (EnumDef _)) =  EnumKind++compatTagEntry :: TagEntry -> TagEntry -> Bool+compatTagEntry  te1 te2 = tagKind te1 == tagKind te2++defRedeclStatus :: (t -> t -> Bool) -> t -> Maybe t -> DeclarationStatus t+defRedeclStatus sameKind def oldDecl =+    case oldDecl of+        Just def' | def `sameKind` def' -> Redeclared def'+                  | otherwise           -> KindMismatch def'+        Nothing                         -> NewDecl+defRedeclStatusLocal :: (Ord k) =>+                        (t -> t -> Bool) -> k -> t -> Maybe t -> NameSpaceMap k t -> DeclarationStatus t+defRedeclStatusLocal sameKind ident def oldDecl nsm =+    case defRedeclStatus sameKind def oldDecl of+        NewDecl -> case lookupName nsm ident of+                     Just shadowed -> Shadowed shadowed+                     Nothing       -> NewDecl+        redecl  -> redecl++defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable)+defineTypeDef ident tydef deftbl =+  (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' })+  where+  (decls', oldDecl) = defGlobal (identDecls deftbl) ident (Left tydef)++-- | declare\/define a global object\/function\/typeDef+--+--  returns @Redeclared def@ if there is already an object\/function\/typeDef+--  in global scope, or @DifferentKindRedec def@ if the old declaration is of a different kind.+defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)+defineGlobalIdent ident def deftbl =+    (defRedeclStatus compatIdentEntry (Right def) oldDecl, deftbl { identDecls = decls' })+    where+    (decls',oldDecl) = defGlobal (identDecls deftbl) ident (Right def)+-- | declare\/define a object\/function\/typeDef with lexical scope+--+--  returns @Redeclared def@ or @DifferentKindRedec def@  if there is already an object\/function\/typeDef+--  in the same scope.+defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)+defineScopedIdent = defineScopedIdentWhen (const True)++-- | declare\/define a object\/function\/typeDef with lexical scope, if the given predicate holds on the old+--   entry.+--+--  returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or+--  @DifferentKindRedec def@  if there is already an object\/function\/typeDef in the same scope.+defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable ->+                           (DeclarationStatus IdentEntry, DefTable)+defineScopedIdentWhen override_def ident def deftbl+    = (redecl_status, deftbl { identDecls = decls' })+    where+    new_def = Right def+    old_decls = identDecls deftbl+    old_decl_opt = lookupInnermostScope old_decls ident+    (decls',redecl_status)  | (Just old_decl) <- old_decl_opt, not (old_decl `compatIdentEntry` new_def)+                              = (new_decls, KindMismatch old_decl)+                            | maybe True doOverride old_decl_opt+                              = (new_decls, redeclStatus' old_decl_opt)+                            | otherwise+                              = (old_decls, maybe NewDecl KeepDef old_decl_opt)+    new_decls = fst (defLocal old_decls ident new_def)+    doOverride (Left _) = False+    doOverride (Right old_def) = (override_def old_def)+    redeclStatus' overriden_decl = defRedeclStatusLocal compatIdentEntry ident new_def overriden_decl old_decls++-- | declare a tag (fwd decl in case the struct name isn't defined yet)+declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable)+declareTag sueref decl deftbl =+  case lookupTag sueref deftbl of+    Nothing -> (NewDecl, deftbl { tagDecls = fst $ defLocal (tagDecls deftbl) sueref (Left decl) })+    Just old_def | tagKind old_def == tagKind (Left decl) ->  (KeepDef old_def, deftbl)+                 | otherwise -> (KindMismatch old_def, deftbl)++-- | define a tag+defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable)+defineTag sueref def deftbl =+    (redeclStatus, deftbl { tagDecls = decls'})+    where+    (decls',olddecl) = defLocal (tagDecls deftbl) sueref (Right def)+    redeclStatus =+      case olddecl of+        Just fwd_decl@(Left decl) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef+                                  | otherwise -> KindMismatch fwd_decl+        _ -> defRedeclStatusLocal compatTagEntry sueref (Right def) olddecl (tagDecls deftbl)++-- | define a label+-- Return the old label if it is already defined in this function's scope+defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable)+defineLabel ident deftbl =+    let (labels',old_label) = defLocal (labelDefs deftbl) ident ident+    in  (maybe NewDecl Redeclared old_label, deftbl { labelDefs = labels' })++-- | lookup identifier (object, function, typeDef, enumerator)+lookupIdent :: Ident -> DefTable -> Maybe IdentEntry+lookupIdent ident deftbl = lookupName (identDecls deftbl) ident++-- | lookup tag+lookupTag :: SUERef -> DefTable -> Maybe TagEntry+lookupTag sue_ref deftbl = lookupName (tagDecls deftbl) sue_ref++-- | lookup label+lookupLabel :: Ident -> DefTable -> Maybe Ident+lookupLabel ident deftbl = lookupName (labelDefs deftbl) ident++-- | lookup an object in the innermost scope+lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry+lookupIdentInner ident deftbl = lookupInnermostScope (identDecls deftbl) ident++-- | lookup an identifier in the innermost scope+lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry+lookupTagInner sue_ref deftbl = lookupInnermostScope (tagDecls deftbl) sue_ref+
+ src/Language/C/Analysis/Export.hs view
@@ -0,0 +1,204 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Analysis.Export+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  prototype+-- Portability :  ghc+--+-- /WARNING/ : This is just an implementation sketch and not very well tested.+--+-- Export 'SemRep' entities to 'AST' nodes.+-----------------------------------------------------------------------------+module Language.C.Analysis.Export (+exportType, exportTypeDecl, exportTypeSpec,+exportTypeDef,+exportCompType, exportCompTypeDecl, exportCompTypeRef,+exportEnumType, exportEnumTypeDecl, exportEnumTypeRef,+)+where+import Language.C.Data.Ident+import Language.C.Data.Node+import Language.C.Syntax.AST+import Language.C.Analysis.SemRep+import Data.Maybe++exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec],CDeclr)+exportDeclr other_specs ty attrs name =+    (other_specs ++ specs, CDeclr ident derived asmname (exportAttrs attrs) ni)+    where+    (specs,derived) = exportType ty+    (ident,asmname) = case name of (VarName vident asmname_opt) -> (Just vident, asmname_opt)+                                   _ -> (Nothing,Nothing)++exportTypeDecl :: Type -> CDecl+exportTypeDecl ty =+  CDecl declspecs declrs ni+  where+  (declspecs,derived) = exportType ty+  declrs | null derived = []+         | otherwise = [(Just $ CDeclr Nothing derived Nothing [] ni,Nothing,Nothing)]++exportTypeDef :: TypeDef -> CDecl+exportTypeDef (TypeDef ident ty attrs node_info) =+  CDecl (CStorageSpec (CTypedef ni) : declspecs) [declr] node_info+  where+  (declspecs,derived) = exportType ty+  declr = (Just $ CDeclr (Just ident) derived Nothing (exportAttrs attrs) ni, Nothing, Nothing)++exportType :: Type -> ([CDeclSpec],[CDerivedDeclr])+exportType ty = exportTy [] ty+    where+    exportTy dd (PtrType ity tyquals attrs) = exportTy (ptr_declr : dd) ity where+        ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni+    exportTy dd (ArrayType ity array_sz tyquals attrs) = exportTy (arr_declr : dd) ity where+        arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni+    exportTy dd (FunctionType (FunType ity params variadic attrs)) = exportTy (fun_declr : dd) ity where+        fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni+    exportTy dd (FunctionType (FunTypeIncomplete ity attrs)) = exportTy (fun_declr : dd) ity where+        fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni+    exportTy dd (TypeDefType (TypeDefRef ty_ident _ node)) = ([CTypeSpec (CTypeDef ty_ident node)], reverse dd)+    exportTy dd (DirectType ity quals) = (map CTypeQual (exportTypeQuals quals) +++                                        map CTypeSpec (exportTypeSpec ity), reverse dd)+    exportTy _ (TypeOfExpr _) = error "export of TypeOfExpr isn't supported"++exportTypeQuals :: TypeQuals -> [CTypeQual]+exportTypeQuals quals = mapMaybe select [(constant,CConstQual ni),(volatile,CVolatQual ni),(restrict,CRestrQual ni)]+    where+    select (predicate,tyqual) | predicate quals = Just tyqual+                              | otherwise       = Nothing++exportTypeQualsAttrs :: TypeQuals -> Attributes -> [CTypeQual]+exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs))++exportArraySize :: ArraySize -> CArrSize+exportArraySize (ArraySize static e) = CArrSize static e+exportArraySize (UnknownArraySize complete) = CNoArrSize complete++exportTypeSpec :: TypeName -> [CTypeSpec]+exportTypeSpec tyname =+    case tyname of+        TyVoid -> [CVoidType ni]+        TyIntegral ity -> exportIntType ity+        TyFloating fty -> exportFloatType fty+        TyComplex fty -> exportComplexType fty+        TyComp comp -> exportCompTypeDecl comp+        TyEnum enum -> exportEnumTypeDecl enum+        TyBuiltin TyVaList -> [CTypeDef (internalIdent "va_list") ni]++exportIntType :: IntType -> [CTypeSpec]+exportIntType ty =+    case ty of+      TyBool    -> [CBoolType ni]+      TyChar    -> [CCharType ni]+      TySChar   -> [CSignedType ni,CCharType ni]+      TyUChar   -> [CUnsigType ni,CCharType ni]+      TyShort   -> [CShortType ni]+      TyUShort  -> [CUnsigType ni, CShortType ni]+      TyInt     -> [CIntType ni]+      TyUInt    -> [CUnsigType ni, CIntType ni]+      TyLong    -> [CLongType ni]+      TyULong   -> [CUnsigType ni,CLongType ni]+      TyLLong   -> [CLongType ni, CLongType ni]+      TyULLong  -> [CUnsigType ni, CLongType ni, CLongType ni]++exportFloatType :: FloatType -> [CTypeSpec]+exportFloatType ty =+    case ty of+      TyFloat   -> [CFloatType ni]+      TyDouble  -> [CDoubleType ni]+      TyLDouble -> [CLongType ni, CDoubleType ni]++exportComplexType :: FloatType -> [CTypeSpec]+exportComplexType ty = (CComplexType ni) : exportFloatType ty++exportCompTypeDecl :: CompTypeRef -> [CTypeSpec]+exportCompTypeDecl ty = [CSUType (exportComp ty) ni]+    where+    exportComp (CompTypeRef sue_ref comp_tag _n) =+        CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)+                (exportSUERef sue_ref) Nothing [] ni++exportEnumTypeDecl :: EnumTypeRef -> [CTypeSpec]+exportEnumTypeDecl ty = [CEnumType (exportEnum ty) ni]+    where+    exportEnum (EnumTypeRef sue_ref _n) =+        CEnum (exportSUERef sue_ref) Nothing [] ni++exportCompType :: CompType -> [CTypeSpec]+exportCompType (CompType sue_ref comp_tag members attrs node_info) = [CSUType comp ni]+    where+    comp = CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)+                   (exportSUERef sue_ref)+                   (Just (map exportMemberDecl members))+                   (exportAttrs attrs)+                   node_info+exportCompTypeRef :: CompType -> [CTypeSpec]+exportCompTypeRef (CompType sue_ref com_tag  _ _ node_info) = exportCompTypeDecl (CompTypeRef sue_ref com_tag node_info)++exportEnumType :: EnumType -> [CTypeSpec]+exportEnumType (EnumType sue_ref enumerators attrs node_info) = [CEnumType enum ni]+    where+    enum = CEnum (exportSUERef sue_ref)+                 (Just (map exportEnumerator enumerators))+                 (exportAttrs attrs)+                 node_info+    exportEnumerator (Enumerator ident val _ty _) = (ident,Just val)++exportEnumTypeRef :: EnumType -> [CTypeSpec]+exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info)++exportSUERef :: SUERef -> Maybe Ident+exportSUERef = Just . internalIdent . show -- relies on a the source program not having any $'s in it++exportMemberDecl :: MemberDecl -> CDecl+exportMemberDecl (AnonBitField ty expr node_info) =+    CDecl (map CTypeSpec $ exportTypeSpec $ fromDirectType ty) [(Nothing,Nothing,Just expr)] node_info+exportMemberDecl (MemberDecl vardecl bitfieldsz node_info) =+    let (specs,declarator) = exportVarDecl vardecl+    in  CDecl specs [(Just declarator, Nothing, bitfieldsz)] node_info+exportVarDecl :: VarDecl -> ([CDeclSpec],CDeclr)++-- NOTE: that there is an ambiguity between two possible places for __attributes__ s here+exportVarDecl (VarDecl name attrs ty) = exportDeclr (exportDeclAttrs attrs) ty [] name+exportParamDecl :: ParamDecl -> CDecl+exportParamDecl paramdecl =+    let (specs,declr) = exportVarDecl (getVarDecl paramdecl)+    in CDecl specs [(Just declr, Nothing , Nothing) ] (nodeInfo paramdecl)++exportDeclAttrs :: DeclAttrs -> [CDeclSpec]+exportDeclAttrs (DeclAttrs inline storage attrs) =+       (if inline then [CTypeQual (CInlineQual ni)] else [])+    ++ map (CStorageSpec) (exportStorage storage)+    ++ map (CTypeQual . CAttrQual) (exportAttrs attrs)++-- | express storage in terms of storage specifiers.+--+-- This isn't always possible and depends on the context the identifier is declared.+-- Most importantly, if there is a /conflicting/ declaration in scope, export is impossible.+-- Furthermore, automatic storage is impossible in file scope.+-- If the storage can actually be specified, the export is correct.+exportStorage :: Storage -> [CStorageSpec]+exportStorage NoStorage = []+exportStorage (Auto reg) = if reg then [CRegister ni] else []+exportStorage (Static InternalLinkage thread_local) = threadLocal thread_local [CStatic ni]+exportStorage (Static ExternalLinkage thread_local) = threadLocal thread_local [CExtern ni]+exportStorage (FunLinkage ExternalLinkage) = []+exportStorage (FunLinkage InternalLinkage) = [CStatic ni]++threadLocal :: Bool -> [CStorageSpec] -> [CStorageSpec]+threadLocal False = id+threadLocal True = ((CThread ni) :)++exportAttrs :: [Attr] -> [CAttr]+exportAttrs = map exportAttr where+    exportAttr (Attr ident es n) = CAttr ident es n++fromDirectType :: Type -> TypeName+fromDirectType (DirectType ty _) = ty+fromDirectType (TypeDefType (TypeDefRef _ ref _)) = maybe (error "undefined typeDef") fromDirectType ref+fromDirectType _ = error "fromDirectType"++ni :: NodeInfo+ni = internalNode
+ src/Language/C/Analysis/NameSpaceMap.hs view
@@ -0,0 +1,144 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Analysis.NameSpaceMap+-- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty+--                (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  alpha+-- Portability :  portable+--+-- This module manages name spaces.+--+--  * A name space map associates identifiers with their definition.+--+--  * Each name space map is organized in a hierarchical way using the notion of+--    scopes. A name space map, at any moment, always has a global scope and may+--    have several local scopes. Definitions in inner scopes hide definitions+--    of the same identifier in outer scopes.+--+module Language.C.Analysis.NameSpaceMap (+    -- * name space maps+    NameSpaceMap, nameSpaceMap, nsMapToList,+    globalNames,localNames,hasLocalNames,+    -- * scope modification+    defGlobal,+    enterNewScope, leaveScope,+    defLocal,+    lookupName,lookupGlobal,lookupInnermostScope,+    )+where+import Prelude hiding (lookup)+import qualified Prelude+import qualified Data.Map as Map (empty, insert, lookup, toList)+import Data.Map   (Map)+import Language.C.Data.Ident     (Ident)++{-+C Namespaces and scopes:+++-}++-- DevDocs:+--+-- * the definitions in the global scope are stored in a finite map, because+--   they tend to be a lot.+--+-- * the definitions of the local scopes are stored in a single list, usually+--   they are not very many and the definitions entered last are the most+--   frequently accessed ones; the list structure naturally hides older+--   definitions, i.e., definitions from outer scopes; adding new definitions+--   is done in time proportinal to the current size of the scope; removing a+--   scope is done in constant time (and the definitions of a scope can be+--   returned as a result of leaving the scope); lookup is proportional to the+--   number of definitions in the local scopes and the logarithm of the number+--   of definitions in the global scope -- i.e., efficiency relies on a+--   relatively low number of local definitions together with frequent lookup+--   of the most recently defined local identifiers+--++-- | @NameSpaceMap a@ is a Map from identifiers to @a@, which manages+-- global and local name spaces.+data NameSpaceMap k v = NsMap (Map k v)  -- defs in global scope+                              [[(k, v)]] -- stack of local scopes+globalNames :: (Ord k) => NameSpaceMap k v -> Map k v+globalNames (NsMap g _) = g+hasLocalNames :: NameSpaceMap k v -> Bool+hasLocalNames (NsMap _ l) = not (null l)+localNames :: (Ord k) => NameSpaceMap k v -> [[(k,v)]]+localNames (NsMap _ l) = l++-- | create a name space+nameSpaceMap :: (Ord k) => NameSpaceMap k v+nameSpaceMap  = NsMap Map.empty []++++-- | Add global definition+--+-- @(ns',oldDef) = defGlobal ns ident def@+--   adds a global definition @ident := def@ to the namespace.+--   It returns the modified namespace @ns'@. If the identifier is+--   already declared in the global namespace, the definition is overwritten+--   and the old definition @oldDef@ is returned.+defGlobal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)+defGlobal (NsMap gs lss) ident def+    = (NsMap (Map.insert ident def gs) lss, Map.lookup ident gs)++-- | Enter new local scope+--+-- @ns' = enterNewScope ns@ creates and enters a new local scope.+enterNewScope :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a+enterNewScope (NsMap gs lss)  = NsMap gs ([]:lss)++-- | Leave innermost local scope+--+-- @(ns',defs) = leaveScope ns@ pops leaves the innermost local scope.+--  and returns its definitions+leaveScope :: (Ord k) => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)])+leaveScope (NsMap _ [])         = error "NsMaps.leaveScope: No local scope!"+leaveScope (NsMap gs (ls:lss))  = (NsMap gs lss, ls)++-- | Add local definition+--+-- @(ns',oldDef) = defLocal ns ident def@ adds the local definition+--   @ident := def@ to the innermost local scope, if there is a local scope,+--     and to the global scope otherwise.+--   It returns the modified name space @ns'@ and the old  binding of+--   the identifier @oldDef@, which is overwritten.+defLocal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)+defLocal ns@(NsMap _ []) ident def = defGlobal ns ident def+defLocal (NsMap    gs (ls:lss)) ident def =+  (NsMap gs (((ident, def):ls):lss),+   Prelude.lookup ident ls)++-- | Search for a definition+--+-- @def = find ns ident@ returns the definition in some scope (inner to outer),+-- if there is one.+lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a+lookupName ns@(NsMap _ localDefs) ident+    = case (lookupLocal localDefs) of+        Nothing  -> lookupGlobal ns ident+        Just def -> Just def+  where+    lookupLocal []       = Nothing+    lookupLocal (ls:lss) = case (Prelude.lookup ident ls) of+                        Nothing  -> lookupLocal lss+                        Just def -> Just def++lookupGlobal :: (Ord k) => NameSpaceMap k a -> k -> Maybe a+lookupGlobal (NsMap gs _) ident = Map.lookup ident gs++lookupInnermostScope :: (Ord k) => NameSpaceMap k a -> k -> Maybe a+lookupInnermostScope nsm@(NsMap _gs localDefs) ident  =+    case localDefs of+        (ls : _lss) -> Prelude.lookup ident ls+        [] -> lookupGlobal nsm ident++-- | flatten a namespace into a assoc list+--+--  @nameSpaceToList ns = (localDefInnermost ns ++ .. ++ localDefsOutermost ns) ++ globalDefs ns@+nsMapToList :: (Ord k) => NameSpaceMap k a -> [(k, a)]+nsMapToList (NsMap gs lss)  = concat lss ++ Map.toList gs
+ src/Language/C/Analysis/SemError.hs view
@@ -0,0 +1,98 @@+{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving  #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Analysis.SemError+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  alpha+-- Portability :  ghc+--+-- Errors in the semantic analysis+-----------------------------------------------------------------------------+module Language.C.Analysis.SemError (+InvalidASTError(..), invalidAST,+BadSpecifierError(..), badSpecifierError,+TypeMismatch(..), typeMismatch,+RedefError(..), RedefInfo(..), RedefKind(..), redefinition,+)+where+import Data.Typeable++-- this means we cannot use SemError in SemRep, but use rich types here+import Language.C.Analysis.SemRep++import Language.C.Data.Error+import Language.C.Data.Node++-- here are the errors available++-- | InvalidASTError is caused by the violation of an invariant in the AST+newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable,Error)++-- | BadSpecifierError is caused by an invalid combination of specifiers+newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable,Error)++-- | RedefError is caused by an invalid redefinition of the same identifier or type+data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable++data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo+data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef+data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable++-- Invalid AST+-- ~~~~~~~~~~~++instance Show InvalidASTError  where show = showError "AST invariant violated"++invalidAST :: NodeInfo -> String -> InvalidASTError+invalidAST node_info msg = InvalidAST (mkErrorInfo LevelError msg node_info)++-- Bad specifier (e.g. static for a parameter, or extern when there is an initializer)+-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++instance Show BadSpecifierError     where show = showError "Bad specifier"++badSpecifierError :: NodeInfo -> String -> BadSpecifierError+badSpecifierError node_info msg = BadSpecifierError (mkErrorInfo LevelError msg node_info)++-- Type mismatch+-- ~~~~~~~~~~~~~+typeMismatch :: String -> (NodeInfo, Type) -> (NodeInfo,Type) -> TypeMismatch+typeMismatch = TypeMismatch++instance Show TypeMismatch where+    show tm = showError "Type mismatch" (typeMismatchInfo tm)+instance Error TypeMismatch where+    errorInfo = typeMismatchInfo+typeMismatchInfo :: TypeMismatch -> ErrorInfo+typeMismatchInfo (TypeMismatch reason (node1,_ty2) _t2) =+    ErrorInfo LevelError (posOfNode node1) [reason]++-- Redefinitions+-- ~~~~~~~~~~~~~++instance Show RedefError  where+    show (RedefError lvl info) = showErrorInfo (redefErrLabel info) (redefErrorInfo lvl info)+instance Error RedefError where+    errorInfo (RedefError lvl info) = redefErrorInfo lvl info+    changeErrorLevel (RedefError _lvl info) lvl' = RedefError lvl' info++redefErrLabel :: RedefInfo -> String+redefErrLabel  (RedefInfo ident _ _ _) = ident ++ " redefined"++redefErrorInfo :: ErrorLevel -> RedefInfo -> ErrorInfo+redefErrorInfo lvl info@(RedefInfo _ _ node old_node) =+    ErrorInfo lvl (posOfNode node) ([redefErrReason info] ++ prevDeclMsg old_node)++redefErrReason :: RedefInfo -> String+redefErrReason (RedefInfo ident DuplicateDef _ _) = "duplicate definition of " ++ ident+redefErrReason (RedefInfo ident ShadowedDef _ _)   = "this declaration of " ++ ident ++ " shadows a previous one"+redefErrReason (RedefInfo ident DiffKindRedecl _ _) = ident ++ " previously declared as a different kind of symbol"++prevDeclMsg :: NodeInfo -> [String]+prevDeclMsg old_node = ["The previous declaration was here: ", show (posOfNode old_node)]++redefinition :: ErrorLevel -> String -> RedefKind -> NodeInfo -> NodeInfo -> RedefError+redefinition lvl ctx kind new old = RedefError lvl (RedefInfo ctx kind new old)+
+ src/Language/C/Analysis/SemRep.hs view
@@ -0,0 +1,659 @@+{-# LANGUAGE DeriveDataTypeable  #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Analysis.Syntax+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  alpha+-- Portability :  ghc+--+-- This module contains definitions for representing C translation units.+-- In contrast to 'Language.C.Syntax.AST', the representation tries to express the semantics of+-- of a translation unit.+---------------------------------------------------------------------------------------------------+module Language.C.Analysis.SemRep(+-- * Sums of tags and identifiers+TagDef(..),typeOfTagDef,+Declaration(..),declIdent,declName,declType,declAttrs,+IdentDecl(..),objKindDescr, splitIdentDecls,+-- * Global definitions+GlobalDecls(..),emptyGlobalDecls,filterGlobalDecls,mergeGlobalDecls,+-- * Events for visitors+DeclEvent(..),+-- * Declarations and definitions+Decl(..),+ObjDef(..),isTentative,+FunDef(..),+ParamDecl(..),MemberDecl(..),+TypeDef(..),identOfTypeDef,+VarDecl(..),+-- * Declaration attributes+DeclAttrs(..),isExtDecl,+Storage(..),declStorage,ThreadLocal,+Linkage(..),+-- * Types+Type(..),+FunType(..),isFunctionType,+derefTypeDef,referencedType,hasTypeOfExpr,+ArraySize(..),+TypeDefRef(..),+TypeName(..),BuiltinType(..),+IntType(..),FloatType(..),+HasSUERef(..),HasCompTyKind(..),+CompTypeRef(..),CompType(..),typeOfCompDef,CompTyKind(..),+EnumTypeRef(..),EnumType(..),typeOfEnumDef,+Enumerator(..),+TypeQuals(..),noTypeQuals,mergeTypeQuals,+-- * Variable names+VarName(..),identOfVarName,AsmName,+-- * Attributes (STUB, not yet analyzed)+Attr(..),Attributes,+-- * Statements and Expressions (STUB, aliases to Syntax)+Stmt,Expr,Initializer,AsmBlock,+)+where+import Language.C.Data+import Language.C.Syntax+import Language.C.Syntax.Constants++import Data.Map (Map)+import qualified Data.Map as Map+import Data.Generics+import Text.PrettyPrint.HughesPJ++-- | accessor class : struct\/union\/enum names+class HasSUERef a where+    sueRef  :: a -> SUERef++-- | accessor class : composite type tags (struct or union)+class HasCompTyKind a where+    compTag :: a -> CompTyKind++-- | Composite type definitions (tags)+data TagDef =  CompDef CompType	  --definition+     	       | EnumDef EnumType      -- enum definition+               deriving (Typeable, Data {-! CNode !-})++instance HasSUERef TagDef where+    sueRef (CompDef ct) = sueRef ct+    sueRef (EnumDef et) = sueRef et++-- | return the type corresponding to a tag definition+typeOfTagDef :: TagDef -> TypeName+typeOfTagDef (CompDef comptype) =  typeOfCompDef comptype+typeOfTagDef (EnumDef enumtype) =  typeOfEnumDef enumtype++-- | All datatypes aggregating a declaration are instances of @Declaration@+class Declaration n where+    -- | get the name, type and declaration attributes of a declaration or definition+    getVarDecl :: n -> VarDecl++-- | get the declaration corresponding to a definition+declOfDef :: (Declaration n, CNode n) => n -> Decl+declOfDef def = let vd = getVarDecl def in Decl vd (nodeInfo def)++-- | get the variable identifier of a declaration (only safe if the+--    the declaration is known to have a name)+declIdent :: (Declaration n) => n -> Ident+declIdent = identOfVarName . declName+-- | get the variable name of a @Declaration@+declName ::  (Declaration n) => n -> VarName+declName = (\(VarDecl n _ _) -> n) . getVarDecl+-- | get the type of a @Declaration@+declType ::  (Declaration n) => n -> Type+declType = (\(VarDecl _ _ ty) -> ty) . getVarDecl+-- | get the declaration attributes of a @Declaration@+declAttrs :: (Declaration n) => n -> DeclAttrs+declAttrs = (\(VarDecl _ specs _) -> specs) . getVarDecl++instance (Declaration a, Declaration b) => Declaration (Either a b) where+    getVarDecl = either getVarDecl getVarDecl++-- | identifiers, typedefs and enumeration constants (namespace sum)+data IdentDecl = Declaration Decl           -- ^ object or function declaration+	             | ObjectDef ObjDef           -- ^ object definition+	             | FunctionDef FunDef         -- ^ function definition+	             | EnumeratorDef Enumerator   -- ^ definition of an enumerator+               deriving (Typeable, Data {-! CNode !-})++instance Declaration IdentDecl where+  getVarDecl (Declaration decl) = getVarDecl decl+  getVarDecl (ObjectDef def) = getVarDecl def+  getVarDecl (FunctionDef def) = getVarDecl def+  getVarDecl (EnumeratorDef def) = getVarDecl def++-- | textual description of the kind of an object+objKindDescr :: IdentDecl -> String+objKindDescr  (Declaration _ ) = "declaration"+objKindDescr (ObjectDef _) = "object definition"+objKindDescr (FunctionDef _) = "function definition"+objKindDescr (EnumeratorDef _) = "enumerator definition"++-- | @splitIdentDecls includeAllDecls@ splits a map of object, function and enumerator declarations and definitions into one map+-- holding declarations, and three maps for object definitions, enumerator definitions and function definitions.+-- If @includeAllDecls@ is @True@ all declarations are present in the first map, otherwise only those where no corresponding definition+-- is available.+splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl,+                                                ( Map Ident Enumerator,+                                                  Map Ident ObjDef,+                                                  Map Ident FunDef ) )+splitIdentDecls include_all = Map.foldWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty))+  where+  deal ident entry (decls,defs) = (Map.insert ident (declOfDef entry) decls, addDef ident entry defs)+  deal' ident (Declaration d) (decls,defs) = (Map.insert ident d decls,defs)+  deal' ident def (decls,defs) = (decls, addDef ident def defs)+  addDef ident entry (es,os,fs) =+    case entry of+        Declaration _   -> (es,os,fs)+        EnumeratorDef e -> (Map.insert ident e es,os,fs)+        ObjectDef o     -> (es,Map.insert ident o os,fs)+        FunctionDef f   -> (es, os,Map.insert ident f fs)+++-- | global declaration\/definition table returned by the analysis+data GlobalDecls = GlobalDecls {+                     gObjs     :: Map Ident IdentDecl,+                     gTags     :: Map SUERef TagDef,+                     gTypeDefs :: Map Ident TypeDef+                   }++-- | empty global declaration table+emptyGlobalDecls :: GlobalDecls+emptyGlobalDecls = GlobalDecls Map.empty Map.empty Map.empty++-- | filter global declarations+filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls+filterGlobalDecls decl_filter gmap = GlobalDecls+    {+        gObjs  = Map.filter (decl_filter . DeclEvent) (gObjs gmap),+        gTags  = Map.filter (decl_filter . TagEvent) (gTags gmap),+        gTypeDefs = Map.filter (decl_filter . TypeDefEvent) (gTypeDefs gmap)+    }+-- | merge global declarations+mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls+mergeGlobalDecls gmap1 gmap2 = GlobalDecls+    {+        gObjs  = Map.union (gObjs gmap1) (gObjs gmap2),+        gTags  = Map.union  (gTags gmap1) (gTags gmap2),+        gTypeDefs = Map.union (gTypeDefs gmap1) (gTypeDefs gmap2)+    }+++-- * Events++-- | Declaration events+--+-- Those events are reported to callbacks, which are executed during the traversal.+data DeclEvent =+       TagEvent  TagDef+       -- ^ file-scope struct\/union\/enum event+     | DeclEvent IdentDecl+       -- ^ file-scope declaration or definition+     | TypeDefEvent TypeDef+       -- ^ a type definition+     | AsmEvent AsmBlock+       -- ^ assembler block+     deriving ({-! CNode !-})++-- * Declarations and definitions++-- | Declarations, which aren't definitions+data Decl = Decl VarDecl NodeInfo+            deriving (Typeable, Data {-! CNode !-})++instance Declaration Decl where+    getVarDecl   (Decl vd _) =  vd++-- | Object Definitions+--+-- An object definition is a declaration together with an initializer.+--+-- If the initializer is missing, it is a tentative definition, i.e. a+-- definition which might be overriden later on.+data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo+             deriving (Typeable, Data {-! CNode !-})+instance Declaration ObjDef where+    getVarDecl  (ObjDef vd _ _) =  vd++-- | Returns @True@ if the given object definition is tentative.+isTentative :: ObjDef -> Bool+isTentative (ObjDef decl init_opt _) | isExtDecl decl = maybe True (const False) init_opt+                                     | otherwise = False++-- | Function definitions+--+-- A function definition is a declaration together with a statement (the function body).+data FunDef = FunDef VarDecl Stmt NodeInfo+             deriving (Typeable, Data {-! CNode !-})+instance Declaration FunDef where+    getVarDecl (FunDef vd _ _) = vd+++-- | Parameter declaration+data ParamDecl = ParamDecl VarDecl NodeInfo+               | AbstractParamDecl VarDecl NodeInfo+    deriving (Typeable, Data {-! CNode !-} )++instance Declaration ParamDecl where+  getVarDecl (ParamDecl vd _) = vd+  getVarDecl (AbstractParamDecl vd _) = vd++-- | Struct\/Union member declaration+data MemberDecl = MemberDecl VarDecl (Maybe Expr) NodeInfo+                  -- ^ @MemberDecl vardecl bitfieldsize node@+                | AnonBitField Type Expr NodeInfo+                  -- ^ @AnonBitField typ size@+    deriving (Typeable, Data {-! CNode !-} )++instance Declaration MemberDecl where+  getVarDecl (MemberDecl vd _ _) = vd+  getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs False NoStorage []) ty++-- | @typedef@ definitions.+--+-- The identifier is a new name for the given type.+data TypeDef = TypeDef Ident Type Attributes NodeInfo+               deriving (Typeable, Data {-! CNode !-} )++-- | return the idenitifier of a @typedef@+identOfTypeDef :: TypeDef -> Ident+identOfTypeDef (TypeDef ide _ _ _) = ide++-- | Generic variable declarations+data VarDecl = VarDecl VarName DeclAttrs Type+              deriving (Typeable, Data)++instance Declaration VarDecl where+  getVarDecl = id++-- @isExtDecl d@ returns true if the declaration has /linkage/+isExtDecl :: (Declaration n) => n -> Bool+isExtDecl = hasLinkage . declStorage++-- | Declaration attributes of the form @DeclAttrs isInlineFunction storage linkage attrs@+--+-- They specify the storage and linkage of a declared object.+data DeclAttrs = DeclAttrs Bool Storage Attributes+                 -- ^ @DeclAttrs inline storage attrs@+               deriving (Typeable, Data)++-- | get the 'Storage' of a declaration+declStorage :: (Declaration d) => d -> Storage+declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st++-- In C we have+--  Identifiers can either have internal, external or no linkage+--  (same object everywhere, same object within the translation unit, unique).+--  * top-level identifiers+--      static : internal linkage (objects and function defs)+--      extern : linkage of prior declaration (if specified), external linkage otherwise+--      no-spec: external linkage+--  * storage duration+--      * static storage duration: objects with external or internal linkage, or local ones with the static keyword+--      * automatic storage duration: otherwise (register)+-- See http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html, Table 8.1, 8.2++-- | Storage duration and linkage of a variable+data Storage  =  NoStorage                  -- ^ no storage+               | Auto Register              -- ^ automatic storage (optional: register)+               | Static Linkage ThreadLocal -- ^ static storage, with linkage and thread local specifier (gnu c)+               | FunLinkage Linkage         -- ^ function, either internal or external linkage+               deriving (Typeable, Data, Show, Eq, Ord)++type ThreadLocal = Bool+type Register    = Bool++-- | Linkage: Either internal to the translation unit or external+data Linkage = InternalLinkage | ExternalLinkage+               deriving (Typeable, Data, Show, Eq, Ord)++-- | return @True@ if the object has linkage+hasLinkage :: Storage -> Bool+hasLinkage (Static _ _) = True+hasLinkage _ = False++-- * types++-- | types of C objects+data Type =+       DirectType TypeName TypeQuals+     -- ^ a non-derived type+     | PtrType Type TypeQuals Attributes+     -- ^ pointer type+     | ArrayType Type ArraySize TypeQuals Attributes+     -- ^ array type+     | FunctionType FunType+     -- ^ function type+     | TypeDefType TypeDefRef+     -- ^ a defined type+     | TypeOfExpr Expr+     -- ^ (GNU) typeof (/broken/ and should be removed, but we do not yet have expression type analysis)+     deriving (Typeable, Data)++-- | Function types are of the form @FunType return-type params isVariadic attrs@.+--+-- If the parameter types aren't yet known, the function has type @FunTypeIncomplete type attrs@.+data FunType = FunType Type [ParamDecl] Bool Attributes+            |  FunTypeIncomplete Type Attributes+               deriving (Typeable, Data)++-- | resolve typedefs, if possible+derefTypeDef :: Type -> Type+derefTypeDef (TypeDefType (TypeDefRef _ (Just actual_ty) _)) = derefTypeDef actual_ty+derefTypeDef ty = ty++-- may not be called on undefined typeDefs or typeof(expr)+referencedType :: Type -> Maybe Type+referencedType (PtrType ty _ _) = Just ty+referencedType (FunctionType (FunType ty _ _ _)) = Just ty+referencedType (ArrayType ty _ _ _) = Just ty+referencedType (TypeDefType (TypeDefRef _ (Just actual_ty) _)) = Just actual_ty+referencedType (DirectType _ _) = Nothing+referencedType _ = error "referencedType: failed to resolve type"++hasTypeOfExpr :: Type -> Bool+hasTypeOfExpr (TypeOfExpr _) = True+hasTypeOfExpr ty = maybe False hasTypeOfExpr (referencedType ty)++-- | return @True@ if the given type is a function type+--+--   Result is undefined in the presence of TypeOfExpr or undefined typeDefs+isFunctionType :: Type -> Bool+isFunctionType ty =+    case ty of  TypeDefType (TypeDefRef _ (Just actual_ty) _) -> isFunctionType actual_ty+                TypeDefType _ -> error "isFunctionType: unresolved typeDef"+                TypeOfExpr _  -> error "isFunctionType: typeof(expr)"+                FunctionType _ -> True+                _ -> False++-- | An array type may either have unknown size or a specified array size, the latter either variable or constant.+-- Furthermore, when used as a function parameters, the size may be qualified as /static/.+-- In a function prototype, the size may be `Unspecified variable size' (@[*]@).+data ArraySize =  UnknownArraySize Bool+                -- ^ @UnknownArraySize is-starred@+                | ArraySize Bool Expr+                -- ^ @FixedSizeArray is-static size-expr@+               deriving (Typeable, Data)++-- | normalized type representation+data TypeName =+      TyVoid+    | TyIntegral IntType+    | TyFloating FloatType+    | TyComplex  FloatType+    | TyComp CompTypeRef+    | TyEnum EnumTypeRef+    | TyBuiltin BuiltinType+    deriving (Typeable, Data)++-- | Builtin type (va_list)+data BuiltinType = TyVaList+                   deriving (Typeable, Data)++-- | typdef references+-- If the actual type is known, it is attached for convenience+data TypeDefRef = TypeDefRef Ident (Maybe Type) NodeInfo+               deriving (Typeable, Data {-! CNode !-})++-- | integral types (C99 6.7.2.2)+data IntType =+      TyBool+    | TyChar+    | TySChar+    | TyUChar+    | TyShort+    | TyUShort+    | TyInt+    | TyUInt+    | TyLong+    | TyULong+    | TyLLong+    | TyULLong+    deriving (Typeable, Data, Eq, Ord)++instance Show IntType where+    show TyBool = "_Bool"+    show TyChar = "char"+    show TySChar = "signed char"+    show TyUChar = "unsigned char"+    show TyShort = "short"+    show TyUShort = "unsigned short"+    show TyInt = "int"+    show TyUInt = "unsigned int"+    show TyLong = "long"+    show TyULong = "unsigned long"+    show TyLLong = "long long"+    show TyULLong = "unsigned long long"++-- | floating point type (C99 6.7.2.2)+data FloatType =+      TyFloat+    | TyDouble+    | TyLDouble+    deriving (Typeable, Data, Eq, Ord)++instance Show FloatType where+    show TyFloat = "float"+    show TyDouble = "double"+    show TyLDouble = "long double"++-- | composite type declarations+data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo+                    deriving (Typeable, Data {-! CNode !-})++instance HasSUERef  CompTypeRef where sueRef  (CompTypeRef ref _ _) = ref+instance HasCompTyKind CompTypeRef where compTag (CompTypeRef _ tag _)  = tag++data EnumTypeRef = EnumTypeRef SUERef NodeInfo+    deriving (Typeable, Data {-! CNode !-})+instance HasSUERef  EnumTypeRef where sueRef  (EnumTypeRef ref _) = ref++-- | Composite type (struct or union).+data CompType =  CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo+                 deriving (Typeable, Data {-! CNode !-} )+instance HasSUERef  CompType where sueRef  (CompType ref _ _ _ _) = ref+instance HasCompTyKind CompType where compTag (CompType _ tag _ _ _) = tag++-- | return the type of a composite type definition+typeOfCompDef :: CompType -> TypeName+typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag internalNode)++-- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'.+data CompTyKind =  StructTag+                 | UnionTag+    deriving (Eq,Ord,Typeable,Data)++instance Show CompTyKind where+    show StructTag = "struct"+    show UnionTag  = "union"++-- | Representation of C enumeration types+data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo+                 -- ^ @EnumType name enumeration-constants attrs node@+                 deriving (Typeable, Data {-! CNode !-} )++instance HasSUERef EnumType where sueRef  (EnumType ref _ _ _) = ref++-- | return the type of an enum definition+typeOfEnumDef :: EnumType -> TypeName+typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref internalNode)++-- | An Enumerator consists of an identifier, a constant expressions and the link to its type+data Enumerator = Enumerator Ident Expr EnumType NodeInfo+                  deriving (Typeable, Data {-! CNode !-})+instance Declaration Enumerator where+  getVarDecl (Enumerator ide _ enumty _) =+    VarDecl+      (VarName ide Nothing)+      (DeclAttrs False NoStorage [])+      (DirectType (typeOfEnumDef enumty) noTypeQuals)++-- | Type qualifiers: constant, volatile and restrict+data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool, restrict :: Bool }+    deriving (Typeable, Data)++-- | no type qualifiers+noTypeQuals :: TypeQuals+noTypeQuals = TypeQuals False False False++-- | merge (/&&/) two type qualifier sets+mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals+mergeTypeQuals (TypeQuals c1 v1 r1) (TypeQuals c2 v2 r2) = TypeQuals (c1 && c2) (v1 && v2) (r1 && r2)++-- * initializers++-- | 'Initializer' is currently an alias for 'CInit'.+--+-- We're planning a normalized representation, but this depends on the implementation of+-- constant expression evaluation+type Initializer = CInit++-- | Normalized C Initializers+-- * If the expression has scalar type, the initializer is an expression+-- * If the expression has struct type, the initializer is a map from designators to initializers+-- * If the expression has array type, the initializer is a list of values+-- Not implemented yet, as it depends on constant expression evaluation+++-- * names and attributes++-- | @VarName name assembler-name@ is a name of an declared object+data VarName =  VarName Ident (Maybe AsmName)+              | NoName+               deriving (Typeable, Data)+identOfVarName :: VarName -> Ident+identOfVarName NoName            = error "identOfVarName: NoName"+identOfVarName (VarName ident _) = ident++-- | Top level assembler block (alias for @CStrLit@)+type AsmBlock = CStrLit++-- | Assembler name (alias for @CStrLit@)+type AsmName = CStrLit++-- | @__attribute__@ annotations+--+-- Those are of the form @Attr attribute-name attribute-parameters@,+-- and serve as generic properties of some syntax tree elements.+--+-- Some examples:+--+-- * labels can be attributed with /unused/ to indicate that their not used+--+-- * struct definitions can be attributed with /packed/ to tell the compiler to use the most compact representation+--+-- * declarations can be attributed with /deprecated/+--+-- * function declarations can be attributes with /noreturn/ to tell the compiler that the function will never return,+--+-- * or with /const/ to indicate that it is a pure function+--+-- /TODO/: ultimatively, we want to parse attributes and represent them in a typed way+data Attr = Attr Ident [Expr] NodeInfo+            deriving (Typeable, Data {-! CNode !-})++type Attributes = [Attr]++-- * statements and expressions (Type aliases)++-- | 'Stmt' is an alias for 'CStat' (Syntax)+type Stmt = CStat+-- | 'Expr' is currently an alias for 'CExpr' (Syntax)+type Expr = CExpr++++--------------------------------------------------------+-- DERIVES GENERATED CODE+-- DO NOT MODIFY BELOW THIS LINE+-- CHECKSUM: 1672142450++instance CNode TagDef+    where nodeInfo (CompDef d) = nodeInfo d+          nodeInfo (EnumDef d) = nodeInfo d+instance Pos TagDef+    where posOf x = posOfNode (nodeInfo x)++instance CNode IdentDecl+    where nodeInfo (Declaration d) = nodeInfo d+          nodeInfo (ObjectDef d) = nodeInfo d+          nodeInfo (FunctionDef d) = nodeInfo d+          nodeInfo (EnumeratorDef d) = nodeInfo d+instance Pos IdentDecl+    where posOf x = posOfNode (nodeInfo x)++instance CNode DeclEvent+    where nodeInfo (TagEvent d) = nodeInfo d+          nodeInfo (DeclEvent d) = nodeInfo d+          nodeInfo (TypeDefEvent d) = nodeInfo d+          nodeInfo (AsmEvent d) = nodeInfo d+instance Pos DeclEvent+    where posOf x = posOfNode (nodeInfo x)++instance CNode Decl+    where nodeInfo (Decl _ nodeinfo) = nodeinfo+instance Pos Decl+    where posOf x = posOfNode (nodeInfo x)++instance CNode ObjDef+    where nodeInfo (ObjDef _ _ nodeinfo) = nodeinfo+instance Pos ObjDef+    where posOf x = posOfNode (nodeInfo x)++instance CNode FunDef+    where nodeInfo (FunDef _ _ nodeinfo) = nodeinfo+instance Pos FunDef+    where posOf x = posOfNode (nodeInfo x)++instance CNode ParamDecl+    where nodeInfo (ParamDecl _ nodeinfo) = nodeinfo+          nodeInfo (AbstractParamDecl _ nodeinfo) = nodeinfo+instance Pos ParamDecl+    where posOf x = posOfNode (nodeInfo x)++instance CNode MemberDecl+    where nodeInfo (MemberDecl _ _ nodeinfo) = nodeinfo+          nodeInfo (AnonBitField _ _ nodeinfo) = nodeinfo+instance Pos MemberDecl+    where posOf x = posOfNode (nodeInfo x)++instance CNode TypeDef+    where nodeInfo (TypeDef _ _ _ nodeinfo) = nodeinfo+instance Pos TypeDef+    where posOf x = posOfNode (nodeInfo x)++instance CNode TypeDefRef+    where nodeInfo (TypeDefRef _ _ nodeinfo) = nodeinfo+instance Pos TypeDefRef+    where posOf x = posOfNode (nodeInfo x)++instance CNode CompTypeRef+    where nodeInfo (CompTypeRef _ _ nodeinfo) = nodeinfo+instance Pos CompTypeRef+    where posOf x = posOfNode (nodeInfo x)++instance CNode EnumTypeRef+    where nodeInfo (EnumTypeRef _ nodeinfo) = nodeinfo+instance Pos EnumTypeRef+    where posOf x = posOfNode (nodeInfo x)++instance CNode CompType+    where nodeInfo (CompType _ _ _ _ nodeinfo) = nodeinfo+instance Pos CompType+    where posOf x = posOfNode (nodeInfo x)++instance CNode EnumType+    where nodeInfo (EnumType _ _ _ nodeinfo) = nodeinfo+instance Pos EnumType+    where posOf x = posOfNode (nodeInfo x)++instance CNode Enumerator+    where nodeInfo (Enumerator _ _ _ nodeinfo) = nodeinfo+instance Pos Enumerator+    where posOf x = posOfNode (nodeInfo x)++instance CNode Attr+    where nodeInfo (Attr _ _ nodeinfo) = nodeinfo+instance Pos Attr+    where posOf x = posOfNode (nodeInfo x)
+ src/Language/C/Analysis/TravMonad.hs view
@@ -0,0 +1,429 @@+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances,+             PatternSignatures, PatternGuards, RankNTypes, ScopedTypeVariables #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Analysis.TravMonad+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  alpha+-- Portability :  ghc+--+-- Monad for Traversals of the C AST.+--+-- For the traversal, we maintain a symboltable and need MonadError and unique+-- name generation facilities.+-- Furthermore, the user may provide callbacks to handle declarations and definitions.+-----------------------------------------------------------------------------+module Language.C.Analysis.TravMonad (+    -- * AST traversal monad+    MonadTrav(..),+    -- * Handling declarations+    handleTagDecl, handleTagDef, handleEnumeratorDef, handleTypeDef,+    handleObjectDef,handleFunDef,handleVarDecl,handleParamDecl,+    handleAsmBlock,+    -- * Symbol table scope modification+    enterPrototypeScope,leavePrototypeScope,+    enterFunctionScope,leaveFunctionScope,+    enterBlockScope,leaveBlockScope,+    -- * Symbol table lookup (delegate)+    lookupTypeDef, lookupObject,+    -- * Symbol table modification+    createSUERef,+    -- * Additional error handling facilities+    hadHardErrors,handleTravError,throwOnLeft,+    astError, warn,+    -- * Trav - default MonadTrav implementation+    Trav(..),+    runTrav,runTrav_,+    TravState,initTravState,withExtDeclHandler,modifyUserState,userState,+    -- * Helpers+    mapMaybeM,maybeM,mapSndM,concatMapM,+)+where+import Language.C.Data+import Language.C.Data.RList as RList+import Language.C.Syntax++import Language.C.Analysis.SemError+import Language.C.Analysis.SemRep+import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope,+                                            enterFunctionScope,leaveFunctionScope)+import qualified Language.C.Analysis.DefTable as ST++import Data.Maybe+import Control.Monad(liftM)++-- | Traversal monad+class (Monad m) => MonadTrav m where+    -- error handling facilities++    -- | throw an 'Error'+    throwTravError :: Error e => e -> m a+    -- | catch an 'Error' (we could implement dynamically-typed catch here)+    catchTravError :: m a -> (CError -> m a) -> m a+    -- | remember that an 'Error' occured (without throwing it)+    recordError    :: Error e => e -> m ()+    -- | return the list of recorded errors+    getErrors      :: m [CError]++    -- symbol table handling++    -- | return the definition table+    getDefTable :: m DefTable+    -- | perform an action modifying the definition table+    withDefTable :: (DefTable -> (a, DefTable)) -> m a++    -- | unique name generation+    genName :: m Name++    -- | handling declarations and definitions+    handleDecl :: DeclEvent -> m ()++-- * handling declarations++-- check wheter a redefinition is ok+checkRedef :: (MonadTrav m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m ()+checkRedef subject new_decl redecl_status =+    case redecl_status of+        NewDecl -> return ()+        Redeclared old_def   -> throwTravError $+            redefinition LevelError subject DuplicateDef (nodeInfo new_decl) (nodeInfo old_def)+        KindMismatch old_def -> throwTravError $+            redefinition LevelError subject DiffKindRedecl (nodeInfo new_decl) (nodeInfo old_def)+        Shadowed _old_def     ->  return ()+            -- warn $+            -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def)+        KeepDef _old_def      -> return ()++-- | forward declaration of a tag. Only neccessary for name analysis, but otherwise no semantic+-- consequences.+handleTagDecl :: (MonadTrav m) => TagFwdDecl -> m ()+handleTagDecl decl = do+    redecl <- withDefTable $ declareTag (sueRef decl) decl+    checkRedef (show $ sueRef decl) decl redecl++-- | define the given composite type or enumeration+-- If there is a declaration visible, overwrite it with the definition.+-- Otherwise, enter a new definition in the current namespace.+-- If there is already a definition present, yield an error (redeclaration).+handleTagDef :: (MonadTrav m) => TagDef -> m ()+handleTagDef def = do+    redecl <- withDefTable $ defineTag (sueRef def) def+    checkRedef (show $ sueRef def) def redecl+    handleDecl (TagEvent def)++handleEnumeratorDef :: (MonadTrav m) => Enumerator ->  m ()+handleEnumeratorDef enumerator = do+    let ident = declIdent enumerator+    redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator)+    checkRedef (show ident) ident redecl+    return ()++handleTypeDef :: (MonadTrav m) => TypeDef -> m ()+handleTypeDef typeDef@(TypeDef ident _ _ _) = do+    redecl <- withDefTable $ defineTypeDef ident typeDef+    checkRedef (show ident) typeDef redecl+    handleDecl (TypeDefEvent typeDef)+    return ()++handleAsmBlock :: (MonadTrav m) => AsmBlock -> m ()+handleAsmBlock asm = handleDecl (AsmEvent asm)++redefErr :: (MonadTrav m, CNode old, CNode new) => Ident -> ErrorLevel -> new -> old -> RedefKind -> m ()+redefErr name lvl new old kind =+  throwTravError $ redefinition lvl (show name) kind (nodeInfo new) (nodeInfo old)++-- TODO: unused+checkIdentTyRedef :: (MonadTrav m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m ()+checkIdentTyRedef (Right decl) status = checkVarRedef decl status+checkIdentTyRedef (Left tydef) (KindMismatch old_def) =+  redefErr (identOfTypeDef tydef) LevelError tydef old_def DiffKindRedecl+checkIdentTyRedef (Left tydef) (Redeclared old_def) =+  redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef+checkIdentTyRedef (Left _tydef) _ = return ()++checkVarRedef :: (MonadTrav m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m ()+checkVarRedef def redecl =+    case redecl of+        -- always an error+        KindMismatch old_def -> redefVarErr old_def DiffKindRedecl+        -- types have to match+        KeepDef (Right old_def) -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)+        -- redeclaration: old entry has to be a declaration or tentative, type have to match+        Redeclared (Right old_def) | isTentativeG old_def ->+                                      throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)+                                   | otherwise -> redefVarErr old_def DuplicateDef+        -- NewDecl/Shadowed is ok+        _ -> return ()+    where+    redefVarErr old_def kind = redefErr (declIdent def) LevelError def old_def kind+    new_ty = declType def+    isTentativeG (Declaration _) = True+    isTentativeG (ObjectDef od)  = isTentative od+    isTentativeG _               = False++-- | handle variable declarations (external object declarations and function prototypes)+-- variable declarations are either function prototypes, or external declarations, and not very+-- interesting on their own. we only put them in the symbol table and call the handle.+-- declarations never override definitions+handleVarDecl :: (MonadTrav m) => Decl -> m ()+handleVarDecl decl = do+    def <- enterDecl decl (const False)+    handleDecl (DeclEvent def)++-- | handle parameter declaration. The interesting part is that parameters can be abstract+-- (if they are part of a type). If they have a name, we enter the name (usually in function prototype or function scope),+-- checking if there are duplicate definitions. +-- FIXME: I think it would be more transparent to handle parameter declarations in a special way+handleParamDecl :: (MonadTrav m) => ParamDecl -> m ()+handleParamDecl (AbstractParamDecl _ _) = return ()+handleParamDecl (ParamDecl vardecl node) = do+    let def = ObjectDef (ObjDef vardecl Nothing node)+    redecl <- withDefTable $ defineScopedIdent (declIdent def) def+    checkVarRedef def redecl+    return ()++-- shared impl+enterDecl :: (MonadTrav m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl+enterDecl decl cond = do+    let def = Declaration decl+    redecl <- withDefTable $+              defineScopedIdentWhen cond (declIdent def) def+    checkVarRedef def redecl+    return def++-- | handle function definitions+handleFunDef :: (MonadTrav m) => Ident -> FunDef -> m ()+handleFunDef ident fun_def = do+    let def = FunctionDef fun_def+    redecl <- withDefTable $+              defineScopedIdentWhen isDeclaration ident def+    checkVarRedef def redecl+    handleDecl (DeclEvent def)++isDeclaration :: IdentDecl -> Bool+isDeclaration (Declaration _) = True+isDeclaration _ = False++checkCompatibleTypes :: Type -> Type -> Either TypeMismatch ()+checkCompatibleTypes _ _ = Right ()++-- | handle object defintions (maybe tentative)+handleObjectDef :: (MonadTrav m) => Ident -> ObjDef -> m ()+handleObjectDef ident obj_def = do+    let def = ObjectDef obj_def+    redecl <- withDefTable $+              defineScopedIdentWhen (\o -> shouldOverride def o) ident def+    checkVarRedef def redecl+    handleDecl (DeclEvent def)+    where+    isTentativeDef (ObjectDef object_def) = isTentative object_def+    isTentativeDef _ = False+    shouldOverride def o | isDeclaration o = True+                         | not (isTentativeDef def) = True+                         | isTentativeDef o = True+                         | otherwise = False++-- * scope manipulation+--+--  * file scope: outside of parameter lists and blocks (outermost)+--+--  * function prototype scope+--+--  * function scope: labels are visible within the entire function, and declared implicitely+--+--  * block scope+updDefTable :: (MonadTrav m) => (DefTable -> DefTable) -> m ()+updDefTable f = withDefTable (\st -> ((),f st))++enterPrototypeScope :: (MonadTrav m) => m ()+enterPrototypeScope = updDefTable (ST.enterBlockScope)++leavePrototypeScope :: (MonadTrav m) => m ()+leavePrototypeScope = updDefTable (ST.leaveBlockScope)++enterFunctionScope :: (MonadTrav m) => m ()+enterFunctionScope = updDefTable (ST.enterFunctionScope)++leaveFunctionScope :: (MonadTrav m) => m ()+leaveFunctionScope = updDefTable (ST.leaveFunctionScope)++enterBlockScope :: (MonadTrav m) => m ()+enterBlockScope = updDefTable (ST.enterBlockScope)++leaveBlockScope :: (MonadTrav m) => m ()+leaveBlockScope = updDefTable (ST.leaveBlockScope)++-- * Lookup++-- | lookup a type definition+-- the 'wrong kind of object' is an internal error here,+-- because the parser should distinguish typeDefs and other+-- objects+lookupTypeDef :: (MonadTrav m) => Ident -> m Type+lookupTypeDef ident =+    getDefTable >>= \symt ->+    case lookupIdent ident symt of+        Nothing                             -> astError (nodeInfo ident) "unbound typeDef"+        Just (Left (TypeDef _ident ty _ _)) -> return ty+        Just (Right d)                      -> astError (nodeInfo ident) (wrongKindErrMsg d)+    where+    wrongKindErrMsg d = "wrong kind of object: excepcted typeDef but found: "++(objKindDescr d)+++-- | lookup an object, function or enumerator+lookupObject :: (MonadTrav m) => Ident -> m (Maybe IdentDecl)+lookupObject ident = do+    old_decl <- liftM (lookupIdent ident) getDefTable+    mapMaybeM old_decl $ \obj ->+        case obj of+        Right objdef -> return objdef+        Left _tydef  -> astError (nodeInfo ident) (mismatchErr "lookupObject" "an object" "a typeDef")+++mismatchErr :: String -> String -> String -> String+mismatchErr ctx expect found = ctx ++ ": Expected " ++ expect ++ ", but found: " ++ found++-- * inserting declarations++-- | create a reference to a struct\/union\/enum+--+-- This currently depends on the fact the structs are tagged with unique names.+-- We could use the name generation of TravMonad as well, which might be the better+-- choice when dealing with autogenerated code.+createSUERef :: (MonadTrav m) => NodeInfo -> Maybe Ident -> m SUERef+createSUERef _node_info (Just ident) = return$ NamedRef ident+createSUERef node_info Nothing | (Just name) <- nameOfNode node_info = return $ AnonymousRef name+                               | otherwise = astError node_info "struct/union/enum definition without unique name"++-- * error handling facilities++handleTravError :: (MonadTrav m) => m a -> m (Maybe a)+handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing)++-- | check wheter non-recoverable errors occured+hadHardErrors :: [CError] -> Bool+hadHardErrors = (not . null . filter isHardError)++-- | raise an error caused by a malformed AST+astError :: (MonadTrav m) => NodeInfo -> String -> m a+astError node msg = throwTravError $ invalidAST node msg++-- | raise an error based on an Either argument+throwOnLeft :: (MonadTrav m, Error e) => Either e a -> m a+throwOnLeft (Left err) = throwTravError err+throwOnLeft (Right v)  = return v++warn :: (Error e, MonadTrav m) => e -> m ()+warn err = recordError (changeErrorLevel err LevelWarn)++-- * The Trav datatype++-- | simple traversal monad, providing user state and callbacks+newtype Trav s a = Trav { unTrav :: TravState s -> Either CError (a, TravState s) }+modify :: (TravState s -> TravState s) -> Trav s ()+modify f = Trav (\s -> Right ((),f s))+gets :: (TravState s -> a) -> Trav s a+gets f   = Trav (\s -> Right (f s, s))+get ::  Trav s (TravState s)+get      = Trav (\s -> Right (s,s))+put :: TravState s -> Trav s ()+put s    = Trav (\_ -> Right ((),s))++runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s)+runTrav state traversal =+    case unTrav action (initTravState state) of+        Left trav_err                                 -> Left [trav_err]+        Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts)+                      | otherwise                     -> Right (v,ts)+    where+    action = do withDefTable $ defineTypeDef (identOfTypeDef va_list) va_list+                traversal+    va_list = (TypeDef (internalIdent "__builtin_va_list")+                       (DirectType (TyBuiltin TyVaList) noTypeQuals)+                       []+                       (internalNode))++runTrav_ :: Trav () a -> Either [CError] (a,[CError])+runTrav_ t = fmap fst . runTrav () $+    do r <- t+       es <- getErrors+       return (r,es)++withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a+withExtDeclHandler action handler =+    do modify $ \st -> st { doHandleExtDecl = handler }+       action++instance Monad (Trav s) where+    return x  = Trav (\s -> Right (x,s))+    m >>= k   = Trav (\s -> case unTrav m s of+                              Right (x,s1) -> unTrav (k x) s1+                              Left e       -> Left e)++instance MonadTrav (Trav s) where+    -- error handling facilities+    throwTravError e = Trav (\_ -> Left (toError e))+    catchTravError a handler = Trav (\s -> case unTrav a s of+                                             Left e  -> unTrav (handler e) s+                                             Right r -> Right r)+    recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }+    getErrors = gets (RList.reverse . rerrors)+    -- symbol table handling+    getDefTable = gets symbolTable+    withDefTable f = do+        ts <- get+        let (r,symt') = f (symbolTable ts)+        put $ ts { symbolTable = symt' }+        return r+    -- unique name generation+    genName = generateName+    -- handling declarations and definitions+    handleDecl d = ($ d) =<< gets doHandleExtDecl++data TravState s =+    TravState {+        symbolTable :: DefTable,+        rerrors :: RList CError,+        nameGenerator :: [Name],+        doHandleExtDecl :: (DeclEvent -> Trav s ()),+        userState :: s+      }++travErrors :: TravState s -> [CError]+travErrors = RList.reverse . rerrors++initTravState :: s -> TravState s+initTravState userst =+    TravState {+        symbolTable = emptyDefTable,+        rerrors = RList.empty,+        nameGenerator = namesStartingFrom 0,+        doHandleExtDecl = const (return ()),+        userState = userst+      }++-- * Trav specific operations+modifyUserState :: (s -> s) -> Trav s ()+modifyUserState f = modify $ \ts -> ts { userState = f (userState ts) }++generateName :: Trav s Name+generateName =+    get >>= \ts ->+    do let (new_name : gen') = nameGenerator ts+       put $ ts { nameGenerator = gen'}+       return new_name++-- * helpers+mapMaybeM :: (Monad m) => (Maybe a) -> (a -> m b) -> m (Maybe b)+mapMaybeM m f = maybe (return Nothing) (liftM Just . f) m++maybeM :: (Monad m) => (Maybe a) -> (a -> m ()) -> m ()+maybeM m f = maybe (return ()) f m++mapSndM :: (Monad m) => (b -> m c) -> (a,b) -> m (a,c)+mapSndM f (a,b) = liftM ((,) a) (f b)++concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b]+concatMapM f = liftM concat . mapM f
+ src/Language/C/Data.hs view
@@ -0,0 +1,39 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Data+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : ghc+--+-- Common data types for Language.C: Identifiers, unique names, source code locations,+-- ast node attributes and extensible errors.+-----------------------------------------------------------------------------+module Language.C.Data (+     -- * Input stream+     module Language.C.Data.InputStream,+     -- * Identifiers+     SUERef(..), isAnonymousRef,+     Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent,+     -- * Unqiue names+     Name(..),namesStartingFrom,+     -- * Source code positions+     Position(..),Pos(..),+     posFile,posRow,posColumn,+     nopos,builtinPos,internalPos,+     isSourcePos,isBuiltinPos,isInternalPos,+     -- * Syntax tree nodes+     NodeInfo(..),CNode(..),+     fileOfNode,posOfNode,nameOfNode,+     internalNode,mkNodeInfoOnlyPos,mkNodeInfo,+     -- * Extensible errors+     module Language.C.Data.Error+)+where+import Language.C.Data.InputStream+import Language.C.Data.Ident+import Language.C.Data.Name+import Language.C.Data.Position+import Language.C.Data.Error+import Language.C.Data.Node
+ src/Language/C/Data/Error.hs view
@@ -0,0 +1,171 @@+{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Data.Error+-- Copyright   :  (c) 2008 Benedikt Huber, Manuel M. T. Chakravarty+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  experimental+-- Portability :  ghc+--+-- Base type for errors occuring in parsing, analysing and pretty-printing.+-- With ideas from Simon Marlow's+-- "An extensible dynamically-typed hierarchy of execeptions [2006]"+-----------------------------------------------------------------------------+module Language.C.Data.Error (+    -- * Severity Level+    ErrorLevel(..), isHardError,+    -- * Error class+    Error(..), errorPos, errorLevel, errorMsgs,+    -- * Error 'supertype'+    CError(..),+    -- * Infos attached to errors+    ErrorInfo(..),showError,showErrorInfo,mkErrorInfo,+    -- * Default error types+    UnsupportedFeature, unsupportedFeature, unsupportedFeature_,+    UserError, userErr,+    -- * Raising internal errors+    internalErr,+)+where+import Data.Typeable+import Data.Generics+import Language.C.Data.Node+import Language.C.Data.Position++-- | Error levels (severity)+data ErrorLevel = LevelWarn+                | LevelError+                | LevelFatal+              deriving (Eq, Ord)++instance Show ErrorLevel where+    show LevelWarn  = "WARNING"+    show LevelError = "ERROR"+    show LevelFatal = "FATAL ERROR"++-- | return @True@ when the given error makes it impossible to continue+--   analysis or compilation.+isHardError :: (Error ex) => ex -> Bool+isHardError = ( > LevelWarn) . errorLevel++-- | information attached to every error in Language.C+data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable++-- to faciliate newtype deriving+instance Show ErrorInfo where show = showErrorInfo "error"+instance Error ErrorInfo where+    errorInfo = id+    changeErrorLevel (ErrorInfo _ pos msgs) lvl' = ErrorInfo lvl' pos msgs++mkErrorInfo :: ErrorLevel -> String -> NodeInfo -> ErrorInfo+mkErrorInfo lvl msg node = ErrorInfo lvl (posOfNode node) (lines msg)++-- | `supertype' of all errors+data CError+    = forall err. (Error err) => CError err+    deriving Typeable++-- | errors in Language.C are instance of 'Error'+class (Typeable e, Show e) => Error e where+    -- | obtain source location etc. of an error+    errorInfo        :: e -> ErrorInfo+    -- | wrap error in 'CError'+    toError          :: e -> CError+    -- | try to cast a generic 'CError' to the specific error type+    fromError     :: CError -> (Maybe e)+    -- | modify the error level+    changeErrorLevel :: e -> ErrorLevel -> e++    -- default implementation+    fromError (CError e) = cast e+    toError = CError+    changeErrorLevel e lvl =+        if errorLevel e == lvl+            then e+            else error $ "changeErrorLevel: not possible for " ++ show e++instance Show CError where+    show (CError e) = show e+instance Error CError where+    errorInfo (CError err) = errorInfo err+    toError = id+    fromError = Just+    changeErrorLevel (CError e) = CError . changeErrorLevel e++-- | position of an @Error@+errorPos   :: (Error e) => e -> Position+errorPos = ( \(ErrorInfo _ pos _) -> pos ) . errorInfo++-- | severity level of an @Error@+errorLevel :: (Error e) => e -> ErrorLevel+errorLevel = ( \(ErrorInfo lvl _ _) -> lvl ) . errorInfo++-- | message lines of an @Error@+errorMsgs   :: (Error e) => e -> [String]+errorMsgs = ( \(ErrorInfo _ _ msgs) -> msgs ) . errorInfo++-- | error raised if a operation requires an unsupported or not yet implemented feature.+data UnsupportedFeature = UnsupportedFeature String Position deriving Typeable+instance Error UnsupportedFeature where+    errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg)+instance Show UnsupportedFeature where show = showError "Unsupported Feature"++unsupportedFeature :: (Pos a) => String -> a -> UnsupportedFeature+unsupportedFeature msg a = UnsupportedFeature msg (posOf a)++unsupportedFeature_ :: String -> UnsupportedFeature+unsupportedFeature_ msg = UnsupportedFeature msg internalPos++-- | unspecified error raised by the user (in case the user does not want to define+--   her own error types).+newtype UserError     = UserError ErrorInfo deriving Typeable+instance Error UserError where+    errorInfo (UserError info) = info+instance Show UserError where show = showError "User Error"++userErr :: String -> UserError+userErr msg = UserError (ErrorInfo LevelError internalPos (lines msg))++-- other errors to be defined elsewhere++showError :: (Error e) => String -> e -> String+showError short_msg = showErrorInfo short_msg . errorInfo++-- | converts an error into a string using a fixed format+--+-- * either the lines of the long error message or the short message has to be non-empty+--+-- * the format is+--+-- >    <fname>:<row>: (column <col>) [<err lvl>]+-- >      >>> <line_1>+-- >      <line_2>+-- >        ...+-- >      <line_n>+showErrorInfo :: String -> ErrorInfo -> String+showErrorInfo short_msg (ErrorInfo level pos msgs) =+    header ++ showMsgLines (if null short_msg then msgs else short_msg:msgs)+    where+    header = (posFile pos) ++ ":" ++ show (posRow pos) ++ ": " +++             "(column " ++ show (posColumn pos) ++ ") " +++             "[" ++ show level ++ "]"+    showMsgLines []     = internalErr "No short message or error message provided."+    showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs)+++-- internal errors+internalErrPrefix :: String+internalErrPrefix = unlines [ "Language.C : Internal Error" ,+                              "This is propably a bug, and should be reported at "+++                              "http://www.sivity.net/projects/language.c/newticket"]++-- | raise a fatal internal error; message may have multiple lines+internalErr     :: String -> a+internalErr msg  = error (internalErrPrefix ++ "\n"+                       ++ indentLines msg+                       ++ "\n")+indent :: String+indent = "  "+indentLines :: String -> String+indentLines = unlines . map (indent++) . lines
+ src/Language/C/Data/Ident.hs view
@@ -0,0 +1,135 @@+{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Data.Ident+-- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty+--                (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  experimental+-- Portability :  ghc+--+-- This module provides the notion of identifiers in C, speed up using hashing.+-- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with +-- a unique 'Name' and a source location ('Position'). The ordering relation on+-- identifiers is based on the hash and does not follow the lexical order.+-----------------------------------------------------------------------------+module Language.C.Data.Ident (+    Ident(..),+    SUERef(..), isAnonymousRef,+    mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent, identToString, dumpIdent)+where+  +-- TODO (comment from manuel):+--  * Hashing is not 8bit clean.++import Data.Char+import Language.C.Data.Position+import Language.C.Data.Node+import Language.C.Data.Name   (Name,nameId)+import Data.Generics++-- | References uniquely determining a struct, union or enum type.+-- Those are either identified by an string identifier, or by a unique+-- name (anonymous types).+data SUERef =  AnonymousRef Name+             | NamedRef Ident+    deriving (Typeable, Data, Ord, Eq)+instance Show SUERef where+    show (AnonymousRef name) = "$" ++ show (nameId name)+    show (NamedRef ident) = identToString ident++-- | Return true if the struct\/union\/enum reference is anonymous.+isAnonymousRef :: SUERef -> Bool+isAnonymousRef (AnonymousRef _) = True+isAnonymousRef _ = False++-- | C identifiers+data Ident = Ident String       -- lexeme+                   {-# UNBOXED #-}   !Int         -- hash to speed up equality check+                   NodeInfo        -- attributes of this ident. incl. position+             deriving (Data,Typeable)++-- the definition of the equality allows identifiers to be equal that are+-- defined at different source text positions, and aims at speeding up the+-- equality test, by comparing the lexemes only if the two numbers are equal+--+instance Eq Ident where+  (Ident s h _) == (Ident s' h' _) = (h == h') && (s == s')++-- this does *not* follow the alphanumerical ordering of the lexemes+--+instance Ord Ident where+  compare (Ident s h _) (Ident s' h' _) = compare (h, s) (h', s')++-- for displaying identifiers+instance Show Ident where+  showsPrec _ ide = showString ("`" ++ identToString ide ++ "'")++-- identifiers are attributed+instance CNode Ident where+  nodeInfo (Ident _ _ at) = at+instance Pos Ident where+  posOf = posOfNode . nodeInfo+-- to speed up the equality test we compute some hash-like value for each+-- identifiers lexeme and store it in the identifiers representation++-- hash function from the dragon book pp437; assumes 7 bit characters and needs+-- the (nearly) full range of values guaranteed for `Int' by the Haskell+-- language definition; can handle 8 bit characters provided we have 29 bit+-- for the `Int's without sign+--+quad                 :: String -> Int+quad (c1:c2:c3:c4:s)  = ((ord c4 * bits21+                          + ord c3 * bits14+                          + ord c2 * bits7+                          + ord c1)+                         `mod` bits28)+                        + (quad s `mod` bits28)+quad (c1:c2:c3:[]  )  = ord c3 * bits14 + ord c2 * bits7 + ord c1+quad (c1:c2:[]     )  = ord c2 * bits7 + ord c1+quad (c1:[]        )  = ord c1+quad ([]           )  = 0++bits7 :: Int+bits7  = 2^(7::Int)+bits14 :: Int+bits14 = 2^(14::Int)+bits21 :: Int+bits21 = 2^(21::Int)+bits28 :: Int+bits28 = 2^(28::Int)++-- | build an identifier from a string.+--+-- * only minimal error checking, e.g., the characters of the identifier are+--   not checked for being alphanumerical only; the correct lexis of the+--   identifier should be ensured by the caller, e.g., the scanner.+--+-- * for reasons of simplicity the complete lexeme is hashed.+mkIdent            :: Position -> String -> Name -> Ident+mkIdent pos s name  = Ident s (quad s) (mkNodeInfo pos name)++-- | returns an /internal/ identifier (has internal position and no unique name)+internalIdent   :: String -> Ident+internalIdent s  = Ident s (quad s) (mkNodeInfoOnlyPos internalPos)++-- | return an /internal/ identifier with position info+internalIdentAt :: Position -> String -> Ident+internalIdentAt pos s = Ident s (quad s) (mkNodeInfoOnlyPos pos)++-- | returns a /builtin/ identifier (has builtin position and no unique name)+builtinIdent   :: String -> Ident+builtinIdent s  = Ident s (quad s) (mkNodeInfoOnlyPos builtinPos)++-- | return @True@ if the given identifier is /internal/+isInternalIdent :: Ident -> Bool+isInternalIdent (Ident _ _ nodeinfo) = isInternalPos (posOfNode nodeinfo)++-- | string of an identifier+identToString               :: Ident -> String+identToString (Ident s _ _)  = s++-- | dump the identifier string and its positions for debugging purposes+dumpIdent     :: Ident -> String+dumpIdent ide  = identToString ide ++ " at " ++ show (nodeInfo ide)
+ src/Language/C/Data/InputStream.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE CPP, BangPatterns #-}+{-# OPTIONS -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Data.InputStream+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  experimental+-- Portability :  ghc+--+-- Compile time input abstraction for the parser.+-- Supports either ByteString or String.+-------------------------------------------------------------------------------+module Language.C.Data.InputStream (+    InputStream, readInputStream,inputStreamToString,inputStreamFromString,+    takeChar,inputStreamEmpty,takeChars,+    countLines,+)+where+#ifndef NO_BYTESTRING+import Data.ByteString.Char8 (ByteString)+import qualified Data.ByteString.Char8 as BS+#endif++-- Generic InputStream stuff++-- | read a file into an 'InputStream'+readInputStream :: FilePath -> IO InputStream++-- | convert 'InputStream' to 'String'+inputStreamToString :: InputStream -> String+{-# INLINE inputStreamToString #-}++-- | convert a 'String' to an 'InputStream'+inputStreamFromString :: String -> InputStream++-- | @(c,is') = takeChar is@ reads and removes+-- the first character @c@ from the 'InputStream' @is@+takeChar :: InputStream -> (Char, InputStream)+{-# INLINE takeChar #-}++-- | return @True@ if the given input stream is empty+inputStreamEmpty :: InputStream -> Bool+{-# INLINE inputStreamEmpty #-}++-- | @str = takeChars n is@ returns the first @n@ characters+-- of the given input stream, without removing them+takeChars :: Int -> InputStream -> [Char]+{-# INLINE takeChars #-}++-- | @countLines@ returns the number of text lines  in the+-- given 'InputStream'+countLines :: InputStream -> Int++#ifndef NO_BYTESTRING+type InputStream = ByteString+takeChar bs = BS.head bs `seq`  (BS.head bs, BS.tail bs)+inputStreamEmpty = BS.null+#ifndef __HADDOCK__+takeChars !n bstr = BS.unpack $ BS.take n bstr --leaks+#endif+readInputStream = BS.readFile+inputStreamToString = BS.unpack+inputStreamFromString = BS.pack+countLines = length . BS.lines+#else+type InputStream = String+takeChar bs = (head bs, tail bs)+inputStreamEmpty = null+takeChars n str = take n str+readInputStream = readFile+inputStreamToString = id+inputStreamFromString = id+countLines = length . lines+#endif+
+ src/Language/C/Data/Name.hs view
@@ -0,0 +1,36 @@+{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Data.Name+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  experimental+-- Portability :  ghc+--+-- Unique Names with fast equality (newtype 'Int')+module Language.C.Data.Name (+Name(..),namesStartingFrom,+NameMap,emptyNameMap,+) where+import Data.Ix+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Data.Generics++-- | Name is a unique identifier+newtype Name = Name { nameId :: Int } deriving (Show, Read, Eq, Ord, Ix, Data, Typeable)++instance Enum Name where+    toEnum = Name+    fromEnum (Name n) = n++-- | get the infinite stream of unique names starting from the given integer+namesStartingFrom :: Int -> [Name]+namesStartingFrom k = [Name k..]++-- | NameMap is currently just an alias for IntMap, but that might change in the future+type NameMap = IntMap+emptyNameMap :: NameMap v+emptyNameMap = IntMap.empty+
+ src/Language/C/Data/Node.hs view
@@ -0,0 +1,80 @@+{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Syntax.Attributes+-- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty+--                (c) 2008 Benedikt Huber (stripped radically)+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  experimental+-- Portability :  ghc+--+-- source position and unqiue name+-----------------------------------------------------------------------------+module Language.C.Data.Node (+   NodeInfo(..), internalNode,mkNodeInfoOnlyPos,mkNodeInfo,+   CNode(nodeInfo), fileOfNode,+   posOfNode, nameOfNode,+   eqByName,+) where+import Language.C.Data.Position+import Language.C.Data.Name     (Name)+import Data.Generics++-- | Parsed entity attribute+data NodeInfo = OnlyPos   Position           -- only pos (for internal stuff only)+              | NodeInfo Position Name      -- pos and unique name+           deriving (Show,Read,Data,Typeable)++-- name equality of attributes, used to define (name) equality of objects+instance Eq NodeInfo where+  (NodeInfo   _ id1) == (NodeInfo   _ id2) = id1 == id2+  _               == _               =+    error "Attributes: Attempt to compare `OnlyPos' attributes!"++-- attribute ordering+instance Ord NodeInfo where+  (NodeInfo   _ id1) <= (NodeInfo   _ id2) = id1 <= id2+  _               <= _               =+    error "Attributes: Attempt to compare `OnlyPos' attributes!"++instance Pos NodeInfo where+  posOf (OnlyPos pos) = pos+  posOf (NodeInfo pos _) = pos++-- | a class for convenient access to the attributes of an attributed object+class CNode a where+  nodeInfo :: a -> NodeInfo+instance CNode NodeInfo where+  nodeInfo = id+instance (CNode a, CNode b) => CNode (Either a b) where+  nodeInfo = either nodeInfo nodeInfo++nameOfNode :: NodeInfo -> Maybe Name+nameOfNode (OnlyPos _) = Nothing+nameOfNode (NodeInfo _ name) = Just name+posOfNode :: NodeInfo -> Position+posOfNode ni = case ni of (OnlyPos pos  ) -> pos; (NodeInfo   pos _) -> pos+fileOfNode :: (CNode a) => a -> FilePath+fileOfNode = posFile . posOfNode . nodeInfo++-- | equality by name+eqByName           :: CNode a => a -> a -> Bool+eqByName obj1 obj2  = (nodeInfo obj1) == (nodeInfo obj2)+++-- attribute identifier creation+-- -----------------------------++internalNode :: NodeInfo+internalNode = OnlyPos nopos++-- | Given only a source position, create a new attribute identifier+mkNodeInfoOnlyPos :: Position -> NodeInfo+mkNodeInfoOnlyPos pos  = OnlyPos pos++-- | Given a source position and a unique name, create a new attribute+-- identifier+mkNodeInfo :: Position -> Name -> NodeInfo+mkNodeInfo pos name  = NodeInfo pos name+
+ src/Language/C/Data/Position.hs view
@@ -0,0 +1,112 @@+{-# LANGUAGE DeriveDataTypeable, PatternGuards #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Data.Position+-- Copyright   :  (c) [1995..2000] Manuel M. T. Chakravarty+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  experimental+-- Portability :  ghc+--+-- Source code position+-----------------------------------------------------------------------------+module Language.C.Data.Position (+  --+  -- source text positions+  --+  Position(Position),+  posFile,posRow,posColumn,isSourcePos,+  nopos, isNoPos,+  builtinPos, isBuiltinPos,+  internalPos, isInternalPos,+  incPos, tabPos, retPos,+  Pos(..),+) where+import Data.Generics++-- | uniform representation of source file positions; the order of the arguments+-- is important as it leads to the desired ordering of source positions+data Position = Position String         -- file name+        {-# UNPACK #-}   !Int           -- row+        {-# UNPACK #-}   !Int           -- column+  deriving (Eq, Ord, Typeable, Data)++instance Show Position where+  show pos@(Position fname row col)+    | isNoPos pos = "<no file>"+    | isBuiltinPos pos = "<builtin>"+    | isInternalPos pos = "<internal>"+    | otherwise = show (fname, row, col)+instance Read Position where+    readsPrec p s = case s of+                       '<' : _  -> readInternal s+                       _        -> map (\((file,row,pos),r) -> (Position file row pos,r)) . readsPrec p $ s+readInternal :: ReadS Position+readInternal s | (Just rest) <- readString "<no file>" s = [(nopos,rest)]+               | (Just rest) <- readString "<builtin>" s = [(builtinPos,rest)]+               | (Just rest) <- readString "<internal>" s = [(internalPos,rest)]+               | otherwise                             = []+    where readString [] r = return r+          readString (c:cs) (c':cs') | c == c'    = readString cs cs'+                                     | otherwise = Nothing+          readString (_:_) [] = Nothing++-- | get the source file of the specified position. Fails unless @isSourcePos pos@.+posFile :: Position -> String+posFile (Position fname _ _) = fname++-- | get the line number of the specified position. Fails unless @isSourcePos pos@+posRow  :: Position -> Int+posRow (Position _ row _) = row++-- | get the column of the specified position. Fails unless @isSourcePos pos@+posColumn :: Position -> Int+posColumn (Position _ _ col) = col++-- | class of type which aggregate a source code location+class Pos a where+    posOf :: a -> Position++-- | returns @True@ if the given position refers to an actual source file+isSourcePos :: Position -> Bool+isSourcePos (Position _ row col) = row >= 0 && col >= 0++-- | no position (for unknown position information)+nopos :: Position+nopos  = Position "<no file>" (-1) 0++isNoPos :: Position -> Bool+isNoPos (Position _ (-1) 0) = True+isNoPos _                   = False++-- | position attached to built-in objects+--+builtinPos :: Position+builtinPos  = Position "<built into the parser>" (-1) 1++-- | returns @True@ if the given position refers to a builtin definition+isBuiltinPos :: Position -> Bool+isBuiltinPos (Position _ (-1) 1) = True+isBuiltinPos _                   = False++-- | position used for internal errors+internalPos :: Position+internalPos = Position "<internal error>" (-1) 2++-- | returns @True@ if the given position is internal+isInternalPos :: Position -> Bool+isInternalPos (Position _ (-1) 2) = True+isInternalPos _                      = False++-- | advance column+incPos :: Position -> Int -> Position+incPos (Position fname row col) n = Position fname row (col + n)++-- | advance column to next tab positions (tabs are considered to be at every 8th column)+tabPos :: Position -> Position+tabPos (Position fname row col) =+        Position fname row (col + 8 - (col - 1) `mod` 8)++-- | advance to next line+retPos :: Position -> Position+retPos (Position fname row _col) = Position fname (row + 1) 1
+ src/Language/C/Data/RList.hs view
@@ -0,0 +1,52 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Data.RList+-- Copyright   :  (c) [2007..2008] Duncan Coutts, Benedikt Huber+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : ghc+--+-- Due to the way the grammar is constructed we very often have to build lists+-- in reverse. To make sure we do this consistently and correctly we have a+-- newtype to wrap the reversed style of list:+-----------------------------------------------------------------------------+module Language.C.Data.RList (+    RList,Reversed(..),+    empty,singleton,snoc,rappend,appendr,rappendr,rmap,reverse,+    viewr,+)+where+import Prelude hiding (reverse)+import qualified Data.List as List++newtype Reversed a = Reversed a+type RList a = Reversed [a]+empty :: Reversed [a]+empty = Reversed []++singleton :: a -> Reversed [a]+singleton x = Reversed [x]++snoc :: Reversed [a] -> a -> Reversed [a]+snoc (Reversed xs) x = Reversed (x : xs)+infixr 5 `snoc`++rappend :: Reversed [a] -> [a] -> Reversed [a]+rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs)++appendr :: [a] -> Reversed [a] -> Reversed [a]+appendr xs (Reversed ys) = Reversed (ys ++ List.reverse xs)++rappendr :: Reversed [a] -> Reversed [a] -> Reversed [a]+rappendr (Reversed xs) (Reversed ys) = Reversed (ys ++ xs)++rmap :: (a -> b) -> Reversed [a] -> Reversed [b]+rmap f (Reversed xs) = Reversed (map f xs)++reverse :: Reversed [a] -> [a]+reverse (Reversed xs) = List.reverse xs++viewr :: Reversed [a] -> (Reversed [a] , a)+viewr (Reversed []) = error "viewr: empty RList"+viewr (Reversed (x:xs)) = (Reversed xs, x)
+ src/Language/C/Parser.hs view
@@ -0,0 +1,18 @@+{-# OPTIONS  #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Parser+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : ghc+--+-- Language.C parser+-----------------------------------------------------------------------------+module Language.C.Parser (+    parseC,+    ParseError(..)+)+where+import Language.C.Parser.Parser (parseC, ParseError(..))
+ src/Language/C/Parser/Builtin.hs view
@@ -0,0 +1,21 @@+-- |+-- Module      :  Language.C.Parser.Builtin+-- Copyright   :  (c) 2001 Manuel M. T. Chakravarty+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Portability :  portable+--+-- This module provides information about builtin entities.+--+--  Currently, only builtin type names are supported.  The only builtin type+--  name is `__builtin_va_list', which is a builtin of GNU C.+--+module Language.C.Parser.Builtin (+  builtinTypeNames+) where+import Language.C.Data.Ident (Ident, builtinIdent)++-- predefined type names+--+builtinTypeNames :: [Ident]+builtinTypeNames  = [builtinIdent "__builtin_va_list"]
+ src/Language/C/Parser/Lexer.x view
@@ -0,0 +1,454 @@+-----------------------------------------------------------------------------+-- Module      :  Lexer.x+-- Copyright   : (c) [1999..2004] Manuel M T Chakravarty+--               (c) 2005 Duncan Coutts+--               (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Portability :  portable+--+--  Lexer for C files, after being processed by the C preprocessor+--+--  We assume that the input already went through cpp.  Thus, we do not handle+--  comments and preprocessor directives here.  It supports the+--  C99 `restrict' extension: <http://www.lysator.liu.se/c/restrict.html> as+--  well as inline functions.+--+--  Comments:+--+--  * Universal character names and multi-character character constants,+--    as well as trigraphs are unsupported. They are lexed, but yield an error.+--+--  * We add `typedef-name' (K&R 8.9) as a token, as proposed in K&R A13.+--    However, as these tokens cannot be recognized lexically, but require a+--    context analysis, they are never produced by the lexer, but instead have+--    to be introduced in a later phase (by converting the corresponding+--    identifiers).+--+--  * We also recognize GNU C `__attribute__', `__extension__', `__complex__',+--    `__const',  `__const__', `__imag', `__imag__', `__inline', `__inline__',+--    `__real', `__real__, `__restrict', and `__restrict__'.+--+--  * Any line starting with `#pragma' is ignored.+--+--  With K&R we refer to ``The C Programming Language'', second edition, Brain+--  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988.+--+--  With C99 we refer to ``ISO/IEC 9899:TC3'',+--  available online at http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf.+--+--- TODO ----------------------------------------------------------------------+--+--  * There are more GNU C specific keywords.  Add them and change `Parser.y'+--    correspondingly (in particular, most tokens within __attribute ((...))+--    expressions are actually keywords, but we handle them as identifiers at+--    the moment).+--+--  * Add support for bytestrings++{++module Language.C.Parser.Lexer (lexC, parseError) where++import Data.Char (isDigit)+import Control.Monad (liftM)++import Language.C.Data.InputStream+import Language.C.Data.Position  (Position(..),posOf)+import Language.C.Data.Ident    (mkIdent)++import Language.C.Syntax.Constants++import Language.C.Parser.Tokens+import Language.C.Parser.ParserMonad+}++$space = [ \ \t ]                           -- horizontal white space+$eol   = \n                                 -- end of line++$letter   = [a-zA-Z]+$identletter = [a-zA-Z_\$]                  -- GNU extension: allow $ in variable names+$octdigit = 0-7+$digit    = 0-9+$digitNZ  = 1-9+$hexdigit = [0-9a-fA-F]++$inchar   = \0-\255 # [ \\ \' \n \r ]       -- valid character in char constant+$instr    = \0-\255 # [ \\ \" \n \r ]       -- valid character in a string literal+$anyButNL = \0-\255 # \n+$infname  = \ -\127 # [ \\ \" ]             -- valid character in a filename++@sp  = $space*++-- character escape sequence (follows K&R A2.5.2)+--+-- * also used for strings+-- * C99: 6.4.4.4+@charesc  = \\([ntvbrfaeE\\\?\'\"]|$octdigit{1,3}|x$hexdigit+)+@ucn      = \\u$hexdigit{4}|\\U$hexdigit{8}++-- components of integer constants+--+-- * C99: 6.4.4.1+@int = $digitNZ$digit*++-- integer suffixes+@llsuffix  = ll|LL+@gnusuffix = [ij]?+@intsuffix = [uU][lL]?|[uU]@llsuffix|[lL][uU]?|@llsuffix[uU]?+@intgnusuffix = @intsuffix@gnusuffix?|@gnusuffix@intsuffix?++-- components of float constants (follows K&R A2.5.3)+--+-- * C99: 6.4.4.2+@digits    = $digit++@intpart   = @digits+@fractpart = @digits++@mantpart  = @intpart?\.@fractpart|@intpart\.+@exppart   = [eE][\+\-]?@digits++@hexprefix = 0x+@hexdigits = $hexdigit++@hexmant   = @hexdigits?\.@hexdigits|@hexdigits\.+@binexp    = [pP][\+\-]?@digits++@floatsuffix    = [fFlL]+@floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix?++++tokens :-++-- whitespace (follows K&R A2.1)+--+-- * horizontal and vertical tabs, newlines, and form feeds are filter out by+--   `Lexers.ctrlLexer'+--+-- * comments are not handled, as we assume the input already went through cpp+--+$white+         ;++-- #line directive (K&R A12.6)+--+-- * allows further ints after the file name a la GCC; as the GCC CPP docu+--   doesn't say how many ints there can be, we allow an unbound number+--+\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*$eol+  { \pos len str -> setPos (adjustPos (takeChars len str) pos) >> lexToken }++-- #pragma directive (K&R A12.8)+--+-- * we simply ignore any #pragma (but take care to update the position+--   information)+--+\#$space*pragma$anyButNL*$eol   ;++-- #ident directive, eg used by rcs/cvs+--+-- * we simply ignore any #ident (but take care to update the position+--   information)+--+\#$space*ident$anyButNL*$eol    ;++-- identifiers and keywords (follows K&R A2.3 and A2.4)+--+$identletter($identletter|$digit)*  { \pos len str -> idkwtok (takeChars len str) pos }++-- constants (follows K&R A2.5)+--+-- * K&R,C99 explicitly mention `enumeration-constants'; however, as they are+--   lexically identifiers, we do not have an extra case for them+--++-- integer constants (follows K&R A2.5.1, C99 6.4.4.1)+-- FIXME: 0 is lexed as octal integer constant+0$octdigit*@intgnusuffix?       { token_plus CTokILit (readCInteger OctalRepr) }+$digitNZ$digit*@intgnusuffix?   { token_plus CTokILit (readCInteger DecRepr) }+0[xX]$hexdigit+@intgnusuffix?   { token_plus CTokILit (readCInteger HexRepr . drop 2) }++(0$octdigit*|$digitNZ$digit*|0[xX]$hexdigit+)[uUlL]+ { token_fail "Invalid integer constant suffix" }++-- character constants (follows K&R A2.5.2, C99 6.4.4.4)+--+-- * Universal Character Names are unsupported and cause an error.+\'($inchar|@charesc)\'  { token CTokCLit (cChar . fst . unescapeChar . tail) }+L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) }+\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars .tail) }+L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) }++-- float constants (follows K&R A2.5.3. C99 6.4.4.2)+--+-- * NOTE: Hexadecimal floating constants without binary exponents are forbidden.+--         They generate a lexer error, because they are hard to recognize in the parser.+(@mantpart@exppart?|@intpart@exppart)@floatgnusuffix?  { token CTokFLit readCFloat }+@hexprefix(@hexmant|@hexdigits)@binexp@floatgnusuffix? { token CTokFLit readCFloat }+@hexprefix@hexmant                                     { token_fail "Hexadecimal floating constant requires an exponent" }++-- string literal (follows K&R A2.6)+-- C99: 6.4.5.+\"($instr|@charesc)*\"      { token CTokSLit (cString . unescapeString . init . tail) }+L\"($instr|@charesc)*\"     { token CTokSLit (cString_w . unescapeString . init . tail . tail) }++L?\'@ucn\'                        { token_fail "Universal character names are unsupported" }+L?\'\\[^0-7'\"\?\\abfnrtvuUx]\'     { token_fail "Invalid escape sequence" }+L?\"($inchar|@charesc)*@ucn($inchar|@charesc|@ucn)*\" { token_fail "Universal character names in string literals are unsupported"}++-- operators and separators+--+"("   { token_ CTokLParen }+")"   { token_ CTokRParen  }+"["   { token_ CTokLBracket }+"]"   { token_ CTokRBracket }+"->"  { token_ CTokArrow }+"."   { token_ CTokDot }+"!"   { token_ CTokExclam }+"~"   { token_ CTokTilde }+"++"  { token_ CTokInc }+"--"  { token_ CTokDec }+"+"   { token_ CTokPlus }+"-"   { token_ CTokMinus }+"*"   { token_ CTokStar }+"/"   { token_ CTokSlash }+"%"   { token_ CTokPercent }+"&"   { token_ CTokAmper }+"<<"  { token_ CTokShiftL }+">>"  { token_ CTokShiftR }+"<"   { token_ CTokLess }+"<="  { token_ CTokLessEq }+">"   { token_ CTokHigh }+">="  { token_ CTokHighEq }+"=="  { token_ CTokEqual }+"!="  { token_ CTokUnequal }+"^"   { token_ CTokHat }+"|"   { token_ CTokBar }+"&&"  { token_ CTokAnd }+"||"  { token_ CTokOr }+"?"   { token_ CTokQuest }+":"   { token_ CTokColon }+"="   { token_ CTokAssign }+"+="  { token_ CTokPlusAss }+"-="  { token_ CTokMinusAss }+"*="  { token_ CTokStarAss }+"/="  { token_ CTokSlashAss }+"%="  { token_ CTokPercAss }+"&="  { token_ CTokAmpAss }+"^="  { token_ CTokHatAss }+"|="  { token_ CTokBarAss }+"<<=" { token_ CTokSLAss }+">>=" { token_ CTokSRAss }+","   { token_ CTokComma }+\;    { token_ CTokSemic }+"{"   { token_ CTokLBrace }+"}"   { token_ CTokRBrace }+"..." { token_ CTokEllipsis }+++{++-- We use the odd looking list of string patterns here rather than normal+-- string literals since GHC converts the latter into a sequence of string+-- comparisons (ie a linear search) but it translates the former using its+-- effecient pattern matching which gives us the expected radix-style search.+-- This gives change makes a significant performance difference.+--+idkwtok :: String -> Position -> P CToken+idkwtok ('a':'l':'i':'g':'n':'o':'f':[])         = tok CTokAlignof+idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':[])       = tok CTokAlignof+idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':'_':'_':[])     = tok CTokAlignof+idkwtok ('a':'s':'m':[])             = tok CTokAsm+idkwtok ('_':'_':'a':'s':'m':[])           = tok CTokAsm+idkwtok ('_':'_':'a':'s':'m':'_':'_':[])         = tok CTokAsm+idkwtok ('a':'u':'t':'o':[])             = tok CTokAuto+idkwtok ('b':'r':'e':'a':'k':[])           = tok CTokBreak+idkwtok ('_':'B':'o':'o':'l':[])           = tok CTokBool+idkwtok ('c':'a':'s':'e':[])             = tok CTokCase+idkwtok ('c':'h':'a':'r':[])             = tok CTokChar+idkwtok ('c':'o':'n':'s':'t':[])           = tok CTokConst+idkwtok ('_':'_':'c':'o':'n':'s':'t':[])         = tok CTokConst+idkwtok ('_':'_':'c':'o':'n':'s':'t':'_':'_':[])       = tok CTokConst+idkwtok ('c':'o':'n':'t':'i':'n':'u':'e':[])         = tok CTokContinue+idkwtok ('_':'C':'o':'m':'p':'l':'e':'x':[])         = tok CTokComplex+idkwtok ('_':'_':'c':'o':'m':'p':'l':'e':'x':'_':'_':[]) = tok CTokComplex+idkwtok ('d':'e':'f':'a':'u':'l':'t':[])         = tok CTokDefault+idkwtok ('d':'o':[])               = tok CTokDo+idkwtok ('d':'o':'u':'b':'l':'e':[])           = tok CTokDouble+idkwtok ('e':'l':'s':'e':[])             = tok CTokElse+idkwtok ('e':'n':'u':'m':[])             = tok CTokEnum+idkwtok ('e':'x':'t':'e':'r':'n':[])           = tok CTokExtern+idkwtok ('f':'l':'o':'a':'t':[])           = tok CTokFloat+idkwtok ('f':'o':'r':[])             = tok CTokFor+idkwtok ('g':'o':'t':'o':[])             = tok CTokGoto+idkwtok ('i':'f':[])               = tok CTokIf+idkwtok ('i':'n':'l':'i':'n':'e':[])           = tok CTokInline+idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':[])         = tok CTokInline+idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':'_':'_':[])       = tok CTokInline+idkwtok ('i':'n':'t':[])             = tok CTokInt+idkwtok ('l':'o':'n':'g':[])             = tok CTokLong+idkwtok ('r':'e':'g':'i':'s':'t':'e':'r':[])         = tok CTokRegister+idkwtok ('r':'e':'s':'t':'r':'i':'c':'t':[])         = tok CTokRestrict+idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':[])       = tok CTokRestrict+idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':'_':'_':[]) = tok CTokRestrict+idkwtok ('r':'e':'t':'u':'r':'n':[])           = tok CTokReturn+idkwtok ('s':'h':'o':'r':'t':[])           = tok CTokShort+idkwtok ('s':'i':'g':'n':'e':'d':[])           = tok CTokSigned+idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':[])         = tok CTokSigned+idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':'_':'_':[])       = tok CTokSigned+idkwtok ('s':'i':'z':'e':'o':'f':[])           = tok CTokSizeof+idkwtok ('s':'t':'a':'t':'i':'c':[])           = tok CTokStatic+idkwtok ('s':'t':'r':'u':'c':'t':[])           = tok CTokStruct+idkwtok ('s':'w':'i':'t':'c':'h':[])           = tok CTokSwitch+idkwtok ('t':'y':'p':'e':'d':'e':'f':[])         = tok CTokTypedef+idkwtok ('t':'y':'p':'e':'o':'f':[])           = tok CTokTypeof+idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':[])         = tok CTokTypeof+idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':'_':'_':[])       = tok CTokTypeof+idkwtok ('_':'_':'t':'h':'r':'e':'a':'d':[])         = tok CTokThread+idkwtok ('u':'n':'i':'o':'n':[])           = tok CTokUnion+idkwtok ('u':'n':'s':'i':'g':'n':'e':'d':[])         = tok CTokUnsigned+idkwtok ('v':'o':'i':'d':[])             = tok CTokVoid+idkwtok ('v':'o':'l':'a':'t':'i':'l':'e':[])         = tok CTokVolatile+idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':[])       = tok CTokVolatile+idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':'_':'_':[]) = tok CTokVolatile+idkwtok ('w':'h':'i':'l':'e':[])           = tok CTokWhile+idkwtok ('_':'_':'l':'a':'b':'e':'l':'_':'_':[])             = tok CTokLabel+idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':[]) = tok (CTokGnuC GnuCAttrTok)+idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':'_':'_':[]) = tok (CTokGnuC GnuCAttrTok)+idkwtok ('_':'_':'e':'x':'t':'e':'n':'s':'i':'o':'n':'_':'_':[]) = tok (CTokGnuC GnuCExtTok)+idkwtok ('_':'_':'r':'e':'a':'l':[])   = tok (CTokGnuC GnuCComplexReal)+idkwtok ('_':'_':'r':'e':'a':'l':'_':'_':[])   = tok (CTokGnuC GnuCComplexReal)+idkwtok ('_':'_':'i':'m':'a':'g':[])   = tok (CTokGnuC GnuCComplexImag)+idkwtok ('_':'_':'i':'m':'a':'g':'_':'_':[])   = tok (CTokGnuC GnuCComplexImag)+idkwtok ('_':'_':'b':'u':'i':'l':'t':'i':'n':'_':rest)+        | rest == "va_arg"             = tok (CTokGnuC GnuCVaArg)+        | rest == "offsetof"           = tok (CTokGnuC GnuCOffsetof)+        | rest == "types_compatible_p" = tok (CTokGnuC GnuCTyCompat)++idkwtok cs = \pos -> do+  name <- getNewName+  let ident = mkIdent pos cs name+  tyident <- isTypeIdent ident+  if tyident+    then return (CTokTyIdent pos ident)+    else return (CTokIdent   pos ident)++ignoreAttribute :: P ()+ignoreAttribute = skipTokens (0::Int)+  where skipTokens :: Int -> P ()+        skipTokens n = do+          tok <- lexToken+          case tok of+            CTokRParen _ | n == 1    -> return ()+                         | otherwise -> skipTokens (n-1)+            CTokLParen _             -> skipTokens (n+1)+            _                        -> skipTokens n++tok :: (Position -> CToken) -> Position -> P CToken+tok tc pos = return (tc pos)++adjustPos :: String -> Position -> Position+adjustPos str (Position fname row _) = Position fname' row' 0+    where+    str'            = dropWhite . drop 1 $ str+    (rowStr, str'') = span isDigit str'+    row'      = read rowStr+    str'''      = dropWhite str''+    fnameStr      = takeWhile (/= '"') . drop 1 $ str'''+    fname'      | null str''' || head str''' /= '"' = fname+     -- try and get more sharing of file name strings+     | fnameStr == fname     = fname+     | otherwise             = fnameStr+    --+    dropWhite = dropWhile (\c -> c == ' ' || c == '\t')++-- special utility for the lexer+unescapeMultiChars :: String -> [Char]+unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'+unescapeMultiChars ('\'' : []) = []+unescapeMultiChars _ = error "Unexpected end of multi-char constant"++{-# INLINE token_ #-}+-- token that ignores the string+token_ :: (Position -> CToken) -> Position -> Int -> InputStream -> P CToken+token_ tok pos _ _ = return (tok pos)++{-# INLINE token_fail #-}+-- error token+token_fail :: String -> Position ->+              Int -> InputStream -> P CToken+token_fail errmsg pos _ _ =   failP pos [ "Lexical Error !", errmsg ]+++{-# INLINE token #-}+-- token that uses the string+token :: (Position -> a -> CToken) -> (String -> a)+      -> Position -> Int -> InputStream -> P CToken+token tok read pos len str = return (tok pos (read $ takeChars len str))++{-# INLINE token_plus #-}+-- token that may fail+token_plus :: (Position -> a -> CToken) -> (String -> Either String a)+      -> Position -> Int -> InputStream -> P CToken+token_plus tok read pos len str =+  case read (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]+                                   Right ok -> return $! tok pos ok++-- -----------------------------------------------------------------------------+-- The input type++type AlexInput = (Position,   -- current position,+                  InputStream)     -- current input string++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar _ = error "alexInputPrevChar not used"++alexGetChar :: AlexInput -> Maybe (Char,AlexInput)+alexGetChar (p,is) | inputStreamEmpty is = Nothing+                   | otherwise  = let (c,s) = takeChar is in+                                  let p' = alexMove p c in p' `seq`+                                  Just (c, (p', s))++alexMove :: Position -> Char -> Position+alexMove (Position f l c) ' '  = Position f l (c+1)+alexMove (Position f l c) '\n' = Position f (l+1) 1+alexMove (Position f l c) '\t' = Position f l (((c+7) `div` 8)*8+1)+alexMove p                '\r' = p+alexMove (Position f l c) _    = Position f l     (c+1)++lexicalError :: P a+lexicalError = do+  pos <- getPos+  (c,cs) <- liftM takeChar getInput+  failP pos+        ["Lexical error !",+         "The character " ++ show c ++ " does not fit here."]++parseError :: P a+parseError = do+  tok <- getLastToken+  failP (posOf tok)+        ["Syntax error !",+         "The symbol `" ++ show tok ++ "' does not fit here."]++lexToken :: P CToken+lexToken = do+  pos <- getPos+  inp <- getInput+  case alexScan (pos, inp) 0 of+    AlexEOF -> return CTokEof+    AlexError inp' -> lexicalError+    AlexSkip  (pos', inp') len -> do+        setPos pos'+        setInput inp'+        lexToken+    AlexToken (pos', inp') len action -> do+        setPos pos'+        setInput inp'+        tok <- action pos len inp+        setLastToken tok+        return tok++lexC :: (CToken -> P a) -> P a+lexC cont = do+  tok <- lexToken+  cont tok+}
+ src/Language/C/Parser/Parser.y view
@@ -0,0 +1,2238 @@+-----------------------------------------------------------------------------+-- Module      :  Parser.y+-- Copyright   :  (c) 2005-2007 Duncan Coutts+--                (c) 2008 Benedikt Huber+--                (c) [1999..2004] Manuel M T Chakravarty+--                Portions copyright 1989, 1990 James A. Roskind+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Portability :  portable+--+--  Parser for C translation units, which have already been run through the C+--  preprocessor. It is recommended to use the `strict' flag for happy.+--+--  The parser recognizes all of ISO C 99 and most GNU C extensions.+--+--  With C99 we refer to the ISO C99 standard, specifically the section numbers+--  used below refer to this report:+--+--    <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf>+--+-- GNU extensions are documented in the gcc parser+--+--    <http://gcc.gnu.org/viewcvs/trunk/gcc/c-parser.c>+--+-- and in: <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>+--+-- The set of supported extensions is documented in+--+--    <http://www.sivity.net/projects/language.c/wiki/Cee>+------------------------------------------------------------------+{+module Language.C.Parser.Parser (parseC, ParseError(..)) where++-- Relevant C99 sections:+--+-- 6.5 Expressions .1 - .17 and 6.6 (almost literally)+--  Supported GNU extensions:+--     - Allow a compound statement as an expression+--     - Various __builtin_* forms that take type parameters+--     - `alignof' expression or type+--     - `__extension__' to suppress warnings about extensions+--     - Allow taking address of a label with: && label+--     - Omitting the `then' part of conditional expressions+--     - complex numbers+--+-- 6.7 C Declarations .1 -.8+--  Supported GNU extensions:+--     - '__thread' thread local storage (6.7.1)+--+-- 6.8 Statements .1 - .8+--  Supported GNU extensions:+--    - case ranges (C99 6.8.1)+--    - '__label__ ident;' declarations (C99 6.8.2)+--    - computed gotos (C99 6.8.6)+--+-- 6.9 Translation unit+--  Supported GNU extensions:+--     - allow empty translation_unit+--     - allow redundant ';'+--     - allow extension keyword before external declaration+--     - asm definitions+--+--  Since some of the grammar productions are quite difficult to read,+--  (especially those involved with the decleration syntax) we document them+--  with an extended syntax that allows a more consise representation:+--+--  Ordinary rules+--+--   foo      named terminal or non-terminal+--+--   'c'      terminal, literal character token+--+--   A B      concatenation+--+--   A | B    alternation+--+--   (A)      grouping+--+--  Extended rules+--+--   A?       optional, short hand for (A|) or [A]{ 0==A || 1==A }+--+--   ...      stands for some part of the grammar omitted for clarity+--+--   {A}      represents sequences, 0 or more.+--+--   <permute> modifier which states that any permutation of the immediate subterms is valid+--+--+--- TODO ----------------------------------------------------------------------+--+--  !* We ignore the C99 static keyword (see C99 6.7.5.3)+--  !* We do not distinguish in the AST between incomplete array types and+--      complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)+--  !* The AST doesn't allow recording __attribute__ of unnamed struct field+--     (see , struct_default_declaring_list, struct_identifier_declarator)+--  !* see `We're being far to liberal here' (... struct definition within structs)+--  * Documentation isn't complete and consistent yet.++import Prelude    hiding (reverse)+import qualified Data.List as List++import Language.C.Parser.Builtin   (builtinTypeNames)+import Language.C.Parser.Lexer     (lexC, parseError)+import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..))+import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef,+                                      enterScope, leaveScope, ParseError(..))++import Language.C.Data.RList+import Language.C.Data.InputStream+import Language.C.Data.Ident+import Language.C.Data.Name+import Language.C.Data.Node+import Language.C.Data.Position+import Language.C.Syntax++}++%name header header+%name statement statement+%name expression expression++%tokentype { CToken }++%monad { P } { >>= } { return }+%lexer { lexC } { CTokEof }++%expect 1++%token++'('		{ CTokLParen	_ }+')'		{ CTokRParen	_ }+'['		{ CTokLBracket	_ }+']'		{ CTokRBracket	_ }+"->"		{ CTokArrow	_ }+'.'		{ CTokDot	_ }+'!'		{ CTokExclam	_ }+'~'		{ CTokTilde	_ }+"++"		{ CTokInc	_ }+"--"		{ CTokDec	_ }+'+'		{ CTokPlus	_ }+'-'		{ CTokMinus	_ }+'*'		{ CTokStar	_ }+'/'		{ CTokSlash	_ }+'%'		{ CTokPercent	_ }+'&'		{ CTokAmper	_ }+"<<"		{ CTokShiftL	_ }+">>"		{ CTokShiftR	_ }+'<'		{ CTokLess	_ }+"<="		{ CTokLessEq	_ }+'>'		{ CTokHigh	_ }+">="		{ CTokHighEq	_ }+"=="		{ CTokEqual	_ }+"!="		{ CTokUnequal	_ }+'^'		{ CTokHat	_ }+'|'		{ CTokBar	_ }+"&&"		{ CTokAnd	_ }+"||"		{ CTokOr	_ }+'?'		{ CTokQuest	_ }+':'		{ CTokColon	_ }+'='		{ CTokAssign	_ }+"+="		{ CTokPlusAss	_ }+"-="		{ CTokMinusAss	_ }+"*="		{ CTokStarAss	_ }+"/="		{ CTokSlashAss	_ }+"%="		{ CTokPercAss	_ }+"&="		{ CTokAmpAss	_ }+"^="		{ CTokHatAss	_ }+"|="		{ CTokBarAss	_ }+"<<="		{ CTokSLAss	_ }+">>="		{ CTokSRAss	_ }+','		{ CTokComma	_ }+';'		{ CTokSemic	_ }+'{'		{ CTokLBrace	_ }+'}'		{ CTokRBrace	_ }+"..."		{ CTokEllipsis	_ }+alignof		{ CTokAlignof	_ }+asm		{ CTokAsm	_ }+auto		{ CTokAuto	_ }+break		{ CTokBreak	_ }+"_Bool"		{ CTokBool	_ }+case		{ CTokCase	_ }+char		{ CTokChar	_ }+const		{ CTokConst	_ }+continue	{ CTokContinue	_ }+"_Complex"	{ CTokComplex	_ }+default		{ CTokDefault	_ }+do		{ CTokDo	_ }+double		{ CTokDouble	_ }+else		{ CTokElse	_ }+enum		{ CTokEnum	_ }+extern		{ CTokExtern	_ }+float		{ CTokFloat	_ }+for		{ CTokFor	_ }+goto		{ CTokGoto	_ }+if		{ CTokIf	_ }+inline		{ CTokInline	_ }+int		{ CTokInt	_ }+long		{ CTokLong	_ }+"__label__"	{ CTokLabel	_ }+register	{ CTokRegister	_ }+restrict	{ CTokRestrict	_ }+return		{ CTokReturn	_ }+short		{ CTokShort	_ }+signed		{ CTokSigned	_ }+sizeof		{ CTokSizeof	_ }+static		{ CTokStatic	_ }+struct		{ CTokStruct	_ }+switch		{ CTokSwitch	_ }+typedef		{ CTokTypedef	_ }+typeof		{ CTokTypeof	_ }+"__thread"	{ CTokThread	_ }+union		{ CTokUnion	_ }+unsigned	{ CTokUnsigned	_ }+void		{ CTokVoid	_ }+volatile	{ CTokVolatile	_ }+while		{ CTokWhile	_ }+cchar		{ CTokCLit   _ _ }		-- character constant+cint		{ CTokILit   _ _ }		-- integer constant+cfloat		{ CTokFLit   _ _ }		-- float constant+cstr		{ CTokSLit   _ _ }		-- string constant (no escapes)+ident		{ CTokIdent  _ $$ }		-- identifier+tyident		{ CTokTyIdent _ $$ }		-- `typedef-name' identifier+"__attribute__"	{ CTokGnuC GnuCAttrTok _ }	-- special GNU C tokens+"__extension__"	{ CTokGnuC GnuCExtTok  _ }	-- special GNU C tokens+"__real__"        { CTokGnuC GnuCComplexReal _ }+"__imag__"        { CTokGnuC GnuCComplexImag _ }+-- special GNU C builtin 'functions' that actually take types as parameters:+"__builtin_va_arg"		{ CTokGnuC GnuCVaArg    _ }+"__builtin_offsetof"		{ CTokGnuC GnuCOffsetof _ }+"__builtin_types_compatible_p"	{ CTokGnuC GnuCTyCompat _ }++%%+++-- parse a complete C header file+--+header :: { CTranslUnit }+header+  : translation_unit	{% withNodeInfo $1 $ CTranslUnit (reverse $1) }+++-- parse a complete C translation unit (C99 6.9)+--+-- * GNU extensions:+--     allow empty translation_unit+--     allow redundant ';'+--+translation_unit :: { Reversed [CExtDecl] }+translation_unit+  : {- empty -}					{ empty }+  | translation_unit ';'			{ $1 }+  | translation_unit external_declaration	{ $1 `snoc` $2 }+++-- parse external C declaration (C99 6.9)+--+-- * GNU extensions:+--     allow extension keyword before external declaration+--     asm definitions+external_declaration :: { CExtDecl }+external_declaration+  : function_definition		              { CFDefExt $1 }+  | declaration			                  { CDeclExt $1 }+  | "__extension__" external_declaration  { $2 }+  | asm '(' string_literal ')' ';'		  { CAsmExt $3 }+++-- parse C function definition (C99 6.9.1)+--+-- function_definition :- specifiers? fun-declarator compound-statement+--                        specifiers? old-fun-declarator  declaration-list compound-statement+--+-- The specifiers are a list consisting of type-names (int, struct foo, ...),+-- storage-class specifiers (extern, static,...) and type qualifiers (const, volatile, ...).+--+--   declaration_specifier      :- <permute> type-qualifier* storage-class+ typename+    "extern unsigned static volatile int f()"+--   type_specifier             :- <permute> type-qualifier* typename+                   "const int f()", "long int f()"+--   declaration_qualifier_list :- <permute> type_qualifier* storage-class+              "extern static const f()"+--   type_qualifier_list        :- type-qualifier+                                       "const f()"+--+-- * GNU extension:+--    __attribute__ annotations+--+function_definition :: { CFunDef }+function_definition+  :                            function_declarator compound_statement+  	{% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }++  |                      attrs function_declarator compound_statement+    {% leaveScope >> (withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 [] $3) }++  | declaration_specifier      function_declarator compound_statement+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }++  | type_specifier             function_declarator compound_statement+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }++  | declaration_qualifier_list function_declarator compound_statement+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }++  | type_qualifier_list   function_declarator compound_statement+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }++  | type_qualifier_list   attrs function_declarator compound_statement+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }++  -- old function declarators++  |                            function_declarator_old declaration_list compound_statement+  	{% withNodeInfo $1 $ CFunDef [] $1 (reverse $2) $3 }++  |                      attrs function_declarator_old declaration_list compound_statement+  	{% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 }++  | declaration_specifier      function_declarator_old declaration_list compound_statement+  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }++  | type_specifier             function_declarator_old declaration_list compound_statement+  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }++  | declaration_qualifier_list function_declarator_old declaration_list compound_statement+  	{% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 }++  | type_qualifier_list   function_declarator_old declaration_list compound_statement+  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 }++  | type_qualifier_list attrs  function_declarator_old declaration_list compound_statement+  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1  ++ liftCAttrs $2) $3 (reverse $4) $5 }++-- Read declarator and put function+function_declarator :: { CDeclr }+function_declarator+  : identifier_declarator+  	{% let declr = reverseDeclr $1 in+  	   enterScope >> doFuncParamDeclIdent declr >> return declr }+++-- parse C statement (C99 6.8)+--+-- * GNU extension: ' __asm__ (...); ' statements+--+statement :: { CStat }+statement+  : labeled_statement			{ $1 }+  | compound_statement		{ $1 }+  | expression_statement	{ $1 }+  | selection_statement		{ $1 }+  | iteration_statement		{ $1 }+  | jump_statement			  { $1 }+  | asm_statement			    {% withNodeInfo $1 (CAsm $1) }+++-- parse C labeled statement (C99 6.8.1)+--+-- * GNU extension: case ranges+--+labeled_statement :: { CStat }+labeled_statement+  : identifier ':' attrs_opt statement		{% withNodeInfo $2 $ CLabel $1 $4 $3 }+  | case constant_expression ':' statement	{% withNodeInfo $1 $ CCase $2 $4 }+  | default ':' statement			{% withNodeInfo $1 $ CDefault $3 }+  | case constant_expression "..." constant_expression ':' statement+  	{% withNodeInfo $1 $ CCases $2 $4 $6 }+++-- parse C compound statement (C99 6.8.2)+--+-- * GNU extension: '__label__ ident;' declarations+--+compound_statement :: { CStat }+compound_statement+  : '{' enter_scope block_item_list leave_scope '}'+  	{% withNodeInfo $1 $ CCompound [] (reverse $3) }++  | '{' enter_scope label_declarations block_item_list leave_scope '}'+  	{% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) }+++-- No syntax for these, just side effecting semantic actions.+--+enter_scope :: { () }+enter_scope : {% enterScope }+leave_scope :: { () }+leave_scope : {% leaveScope }+++block_item_list :: { Reversed [CBlockItem] }+block_item_list+  : {- empty -}			{ empty }+  | block_item_list block_item	{ $1 `snoc` $2 }++block_item :: { CBlockItem }+block_item+  : statement			{ CBlockStmt $1 }+  | nested_declaration		{ $1 }++nested_declaration :: { CBlockItem }+nested_declaration+  : declaration				{ CBlockDecl $1 }+  | nested_function_definition		{ CNestedFunDef $1 }+  | "__extension__" nested_declaration	{ $2 }++nested_function_definition :: { CFunDef }+nested_function_definition+  : declaration_specifier      function_declarator compound_statement+	{% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }++  | type_specifier             function_declarator compound_statement+	{% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }++  | declaration_qualifier_list function_declarator compound_statement+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }++  | type_qualifier_list   function_declarator compound_statement+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }++  | type_qualifier_list   attrs function_declarator compound_statement+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }+++label_declarations :: { Reversed [Ident] }+label_declarations+  : "__label__" identifier_list ';'			{ $2 }+  | label_declarations "__label__" identifier_list ';'	{ $1 `rappendr` $3 }+++-- parse C expression statement (C99 6.8.3)+--+expression_statement :: { CStat }+expression_statement+  : ';'				{% withNodeInfo $1 $ CExpr Nothing }+  | expression ';'		{% withNodeInfo $1 $ CExpr (Just $1) }+++-- parse C selection statement (C99 6.8.4)+--+selection_statement :: { CStat }+selection_statement+  : if '(' expression ')' statement+	{% withNodeInfo $1 $ CIf $3 $5 Nothing }++  | if '(' expression ')' statement else statement+	{% withNodeInfo $1 $ CIf $3 $5 (Just $7) }++  | switch '(' expression ')' statement	+	{% withNodeInfo $1 $ CSwitch $3 $5 }+++-- parse C iteration statement (C99 6.8.5)+--+iteration_statement :: { CStat }+iteration_statement+  : while '(' expression ')' statement+  	{% withNodeInfo $1 $ CWhile $3 $5 False }++  | do statement while '(' expression ')' ';'+  	{% withNodeInfo $1 $ CWhile $5 $2 True }++  | for '(' expression_opt ';' expression_opt ';' expression_opt ')' statement+	{% withNodeInfo $1 $ CFor (Left $3) $5 $7 $9 }++  | for '(' enter_scope declaration expression_opt ';' expression_opt ')' statement leave_scope+	{% withNodeInfo $1 $ CFor (Right $4) $5 $7 $9 }+++-- parse C jump statement (C99 6.8.6)+--+-- * GNU extension: computed gotos+--+jump_statement :: { CStat }+jump_statement+  : goto identifier ';'			{% withNodeInfo $1 $ CGoto $2 }+  | goto '*' expression ';'		{% withNodeInfo $1 $ CGotoPtr $3 }+  | continue ';'			{% withNodeInfo $1 $ CCont }+  | break ';'				{% withNodeInfo $1 $ CBreak }+  | return expression_opt ';'		{% withNodeInfo $1 $ CReturn $2 }+++-- parse GNU C __asm__ statement (compatible with C99: J.5.10)+--+-- asm_stmt    :- asm volatile? ( "asm..." : output-operands : input-operands : asm-clobbers )+-- asm_operand :- [operand-name] "constraint" ( expr )+-- asm_clobber :- "r1", "r2", ...+--+asm_statement :: { CAsmStmt }+asm_statement+  : asm maybe_type_qualifier '(' string_literal ')' ';'+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 [] [] [] }++  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ')' ';'+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 [] [] }++  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ')' ';'+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 [] }++  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';'+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 (reverse $10) }+++maybe_type_qualifier :: { Maybe CTypeQual }+maybe_type_qualifier+  : {- empty -}		  { Nothing }+  | type_qualifier	{ Just $1 }++asm_operands :: { [CAsmOperand] }+asm_operands+  : {- empty -}				{ [] }+  | nonnull_asm_operands		{ reverse $1 }++nonnull_asm_operands :: { Reversed [CAsmOperand] }+nonnull_asm_operands+  : asm_operand					{ singleton $1 }+  | nonnull_asm_operands ',' asm_operand	{ $1 `snoc` $3 }++asm_operand :: { CAsmOperand }+asm_operand+  : string_literal '(' expression ')'			            {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }+  | '[' ident ']' string_literal '(' expression ')'   {% withNodeInfo $4 $ CAsmOperand (Just $2) $4 $6 }+  | '[' tyident ']' string_literal '(' expression ')'	{% withNodeInfo $4 $ CAsmOperand (Just $2) $4 $6 }+++asm_clobbers :: { Reversed [CStrLit] }+asm_clobbers+  : string_literal			            { singleton $1 }+  | asm_clobbers ',' string_literal	{ $1 `snoc` $3 }++{-+---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-- Declarations+---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------++Declarations are the most complicated part of the grammar, and shall be summarized here.+To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand+sides doesn't matter.+ - <permute> a* b+ c   === any sequence of a's, b's and c's, which contains exactly 1 'c' and at least one 'b'++-- storage class and type qualifier+---------------------------------------------------------------------------------------------------------------+attr                       :-   __attribute__((..))+storage_class              :-   typedef | extern | static | auto | register | __thread+type_qualifier             :-   const | volatile | restrict | inline+type_qualifier_list        :-   type_qualifier+++declaration_qualifier      :-   storage_class | type_qualifier+declaration_qualifier_list :-   <permute> type_qualifier* storage_class+++qualifiers                 :-   declaration_qualifier_list | type_qualifier_list+                           :=   <permute> (type_qualifier|storage_class)+++-- type names+---------------------------------------------------------------------------------------------------------------+declaration_specifier      :- <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )+type_specifier             :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)++specifiers                 :- declaration_specifier | type_specifier+                           := <permute> type_qualifier* storage_class* (basic_type_name+ | elaborated_type_name | tyident )++-- struct/union/enum declarations+---------------------------------------------------------------------------------------------------------------+sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name+sue_type_specifier        :- <permute> type_qualifier* elaborated_type_name++sue_declaration           := sue_declaration_specifier | sue_type_specifier+                          :- <permute> type_qualifier* storage_class* elaborated_type_name++-- declarators+---------------------------------------------------------------------------------------------------------------+identifier_declarator :- ( '*' (type_qualifier | attr)* ) * ident     [ array_decl | "(" parameter-list ")" ]+                               plus additional parenthesis' ending ^^ here+typedef_declartor     :-+declarator            :- identifier_declarator | typedef_declarator++-- Declaration lists+---------------------------------------------------------------------------------------------------------------+default_declaring_list :- qualifiers ( identifier_declarator asm*attrs* initializer? )_comma_list++declaring_list         :- specifiers ( declarator asm*attrs* initializer? )_comma_list++declaration_list := default_declaring_list | declaring_list++-- Declaration+---------------------------------------------------------------------------------------------------------------+declaration = sue_declaration | declaration_list++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-- Attributes+-- (citing http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html)+---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------++"Attributes may appear after the colon following a label (expect case and default)"++labeled_statement :- identifier ':' attrs_opt statement++"Attributes may go either immediately after the struct/union/enum keyword or after the closing brace"++struct attrs_opt ...+struct ... { } attrs_opt++"In general: Attributes appear as part of declarations, either belonging to a declaration or declarator"++"Any list of specifiers and qualifiers at the start of a declaration may contain attribute specifiers"+"An attribute list may appear immediately before the comma, = or semicolon terminating a declaration of an identifier"++---------------------------------------------------------------------------------------------------------------+For the parser, we modified the following rules to be interleaved with attributes:++default_declaring_list' :-  (declaration_qualifier_list' | type_qualifier_list' attr*)+                                             identifier_declarator asm*attr* initializer?+                                 { ',' attr* identifier_declarator asm*attr* initializer? }+declaring_list' :-          specifier' declarator asm*attr* initializer?+                                 { ',' attr* declarator asm*attr* initializer? }+++type_qualifier_list' is like type_qualifier_list, but with preceeding and/or interleaving (but not terminating) __attribute__ annotations.+declaration_qualifier_list', declaration_specifier' and type_specifier' are like their unprimed variants, but with arbitrary preceeding, interleaving and/or terminating __attribute__ annotations.++"An attribute list may appear immediately before a declarator other than the first in a comma seperated list of declarators"++"The attribute specifiers may be the only specifiers present (implicit int)" [not supported]++"Attribute specifiers may be mixed with type qualifiers appearing inside the [] of an parameter array declarator"++tbc.+-}++++-- parse C declaration (C99 6.7)+declaration :: { CDecl }+declaration+  : sue_declaration_specifier ';'+  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }++  | sue_type_specifier ';'+  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }++  | declaring_list ';'+  	{ case $1 of+            CDecl declspecs dies at ->+              CDecl declspecs (List.reverse dies) at }++  | default_declaring_list ';'+  	{ case $1 of+            CDecl declspecs dies at ->+              CDecl declspecs (List.reverse dies) at }+++declaration_list :: { Reversed [CDecl] }+declaration_list+  : {- empty -}					{ empty }+  | declaration_list declaration		{ $1 `snoc` $2 }+++-- Note that if a typedef were redeclared, then a declaration+-- specifier must be supplied+--+-- Can't redeclare typedef names+--+-- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer?+--                                                 { ',' identifier_declarator asm_attrs initializer? }+--+-- * GNU extensions+--   __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)+--   asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)+--   The assembler annotation is used to specifiy an assembler name for the declarator.+--+default_declaring_list :: { CDecl }+default_declaring_list+  : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt+  	{% let declspecs = reverse $1 in+  	   do{ declr <- withAsmNameAttrs $3 $2+           ; doDeclIdent declspecs declr+           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}++  | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt+  	{% let declspecs = liftTypeQuals $1 in+  	   do{ declr <- withAsmNameAttrs $3 $2+           ; doDeclIdent declspecs declr+           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}++  | type_qualifier_list attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt -- FIX 1600+  	{% let declspecs = liftTypeQuals $1 in+  	   do{ declr <- withAsmNameAttrs $4 $3+           ; doDeclIdent declspecs declr+           ; withNodeInfo $1 $ CDecl (declspecs ++ liftCAttrs $2) [(Just (reverseDeclr declr), $5, Nothing)] }}++  -- GNU extension: __attribute__ as the only qualifier+  | attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt+    {% let declspecs = liftCAttrs $1 in+       do{ declr <- withAsmNameAttrs $3 $2+           ; doDeclIdent declspecs declr+           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}++  | default_declaring_list ',' attrs_opt identifier_declarator asm_attrs_opt {-{}-} initializer_opt+  	{% case $1 of+             CDecl declspecs dies at -> do+               declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4+               doDeclIdent declspecs declr+               return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) }++-- assembler, followed by attribute annotation+asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) }+asm_attrs_opt+  : asm_opt attrs_opt+  { ($1,$2) }++--+-- SUMMARY: declaring_list :- specifier* declarator asm_attrs initializer?+--                                 { ',' declarator asm_attrs initializer? }+--+-- GNU extensions:+--      __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)+--      asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)+--+declaring_list :: { CDecl }+declaring_list+  : declaration_specifier declarator asm_attrs_opt initializer_opt+  	{% do{+  	   declr <- withAsmNameAttrs $3 $2;+  	   doDeclIdent $1 declr;+       withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }+    }++  | type_specifier declarator asm_attrs_opt initializer_opt+  	{% do{+  	   declr <- withAsmNameAttrs $3 $2;+  	   doDeclIdent $1 declr;+       withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }+    }++  | declaring_list ',' attrs_opt declarator asm_attrs_opt initializer_opt+  	{% case $1 of+             CDecl declspecs dies at -> do+               declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4+               doDeclIdent declspecs declr+               return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) }+++-- parse C declaration specifiers (C99 6.7)+--+-- * <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )+--+declaration_specifier :: { [CDeclSpec] }+declaration_specifier+  : basic_declaration_specifier		{ reverse $1 }	-- Arithmetic or void+  | sue_declaration_specifier		{ reverse $1 }	  -- Struct/Union/Enum+  | typedef_declaration_specifier	{ reverse $1 }	-- Typedef+++-- A mixture of type qualifiers (const, volatile, restrict, inline) and storage class specifiers+-- (extern, static, auto, register, __thread), in any order, but containing at least one storage class specifier.+--+-- declaration_qualifier_list :- <permute> type_qualifier* storage_class++--+-- GNU extensions+--   * arbitrary interleaved __attribute__ annotations+--+declaration_qualifier_list :: { Reversed [CDeclSpec] }+declaration_qualifier_list+  : storage_class+  	{ singleton (CStorageSpec $1) }++  | attrs storage_class+  	{ reverseList (liftCAttrs $1) `snoc` (CStorageSpec $2) }++  | type_qualifier_list storage_class+  	{ rmap CTypeQual $1 `snoc` CStorageSpec $2 }++  | type_qualifier_list attrs storage_class+  	{ (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` CStorageSpec $3 }++  | declaration_qualifier_list declaration_qualifier+  	{ $1 `snoc` $2 }++  | declaration_qualifier_list attr+  	{ addTrailingAttrs $1 $2 }++--+-- declaration_qualifier :- storage_class | type_qualifier+--+declaration_qualifier :: { CDeclSpec }+declaration_qualifier+  : storage_class		{ CStorageSpec $1 }+  | type_qualifier		{ CTypeQual $1 }     -- const or volatile+++-- parse C storage class specifier (C99 6.7.1)+--+-- * GNU extensions: '__thread' thread local storage+--+storage_class :: { CStorageSpec }+storage_class+  : typedef			{% withNodeInfo $1 $ CTypedef }+  | extern			{% withNodeInfo $1 $ CExtern }+  | static			{% withNodeInfo $1 $ CStatic }+  | auto			{% withNodeInfo $1 $ CAuto }+  | register			{% withNodeInfo $1 $ CRegister }+  | "__thread"			{% withNodeInfo $1 $ CThread }+++-- parse C type specifier (C99 6.7.2)+--+-- This recignises a whole list of type specifiers rather than just one+-- as in the C99 grammar.+--+-- type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)+--+type_specifier :: { [CDeclSpec] }+type_specifier+  : basic_type_specifier		{ reverse $1 }	-- Arithmetic or void+  | sue_type_specifier			{ reverse $1 }	-- Struct/Union/Enum+  | typedef_type_specifier		{ reverse $1 }	-- Typedef++basic_type_name :: { CTypeSpec }+basic_type_name+  : void			{% withNodeInfo $1 $ CVoidType }+  | char			{% withNodeInfo $1 $ CCharType }+  | short			{% withNodeInfo $1 $ CShortType }+  | int				{% withNodeInfo $1 $ CIntType }+  | long			{% withNodeInfo $1 $ CLongType }+  | float			{% withNodeInfo $1 $ CFloatType }+  | double			{% withNodeInfo $1 $ CDoubleType }+  | signed			{% withNodeInfo $1 $ CSignedType }+  | unsigned			{% withNodeInfo $1 $ CUnsigType }+  | "_Bool"			{% withNodeInfo $1 $ CBoolType }+  | "_Complex"			{% withNodeInfo $1 $ CComplexType }+++-- A mixture of type qualifiers, storage class and basic type names in any+-- order, but containing at least one basic type name and at least one storage+-- class specifier.+--+-- basic_declaration_specifier :- <permute> type_qualifier* storage_class+ basic_type_name++--+--   GNU extensions+--     arbitrary interleaved __attribute__ annotations+--+basic_declaration_specifier :: { Reversed [CDeclSpec] }+basic_declaration_specifier+  : declaration_qualifier_list basic_type_name+  	{ $1 `snoc` CTypeSpec $2 }++  | basic_type_specifier storage_class+  	{ $1 `snoc` CStorageSpec $2 }++  | basic_declaration_specifier declaration_qualifier+  	{ $1 `snoc` $2 }++  | basic_declaration_specifier basic_type_name+  	{ $1 `snoc` CTypeSpec $2 }++  | basic_declaration_specifier attr+  	{ addTrailingAttrs $1 $2 }+++-- A mixture of type qualifiers and basic type names in any order, but+-- containing at least one basic type name.+--+-- basic_type_specifier :- <permute> type_qualifier* basic_type_name++--+--   GNU extensions+--     arbitrary interleaved __attribute__ annotations+--+basic_type_specifier :: { Reversed [CDeclSpec] }+basic_type_specifier+  -- Arithmetic or void+  : basic_type_name+  	{ singleton (CTypeSpec $1) }++  | attrs basic_type_name+  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }++  | type_qualifier_list basic_type_name+  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }++  | type_qualifier_list attrs basic_type_name+  	{ rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }++  | basic_type_specifier type_qualifier+  	{ $1 `snoc` CTypeQual $2 }++  | basic_type_specifier basic_type_name+  	{ $1 `snoc` CTypeSpec $2 }++  | basic_type_specifier attr+     { addTrailingAttrs $1 $2 }+++-- A named or anonymous struct, union or enum type along with at least one+-- storage class and any mix of type qualifiers.+--+-- * Summary:+--   sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name+--+sue_declaration_specifier :: { Reversed [CDeclSpec] }+sue_declaration_specifier+  : declaration_qualifier_list elaborated_type_name+  	{ $1 `snoc` CTypeSpec $2 }++  | sue_type_specifier storage_class+  	{ $1 `snoc` CStorageSpec $2 }++  | sue_declaration_specifier declaration_qualifier+  	{ $1 `snoc` $2 }+  	+  | sue_declaration_specifier attr+  	{ addTrailingAttrs $1 $2 }+++-- A struct, union or enum type (named or anonymous) with optional leading and+-- trailing type qualifiers.+--+-- * Summary:+--   sue_type_specifier :- <permute> type_qualifier* elaborated_type_name+--+-- * GNU Extensions: records __attribute__ annotations+--+sue_type_specifier :: { Reversed [CDeclSpec] }+sue_type_specifier+  -- struct/union/enum+  : elaborated_type_name+  	{ singleton (CTypeSpec $1) }++  | attrs elaborated_type_name+  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }++  | type_qualifier_list elaborated_type_name+  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }++  | type_qualifier_list attrs elaborated_type_name+  	{ rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }++  | sue_type_specifier type_qualifier+  	{ $1 `snoc` CTypeQual $2 }+  	+  | sue_type_specifier attr+    { addTrailingAttrs $1 $2 }++-- A typedef'ed type identifier with at least one storage qualifier and any+-- number of type qualifiers+--+-- * Summary:+--   typedef_declaration_specifier :- <permute> type_qualifier* storage_class+ tyident+--+-- * Note:+--   the tyident can also be a: typeof '(' ... ')'+--+typedef_declaration_specifier :: { Reversed [CDeclSpec] }+typedef_declaration_specifier+  : typedef_type_specifier storage_class+  	{ $1 `snoc` CStorageSpec $2 }+  	+  | declaration_qualifier_list tyident+  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }++  | declaration_qualifier_list typeof '(' expression ')'+  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }++  | declaration_qualifier_list typeof '(' type_name ')'+  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }++  | typedef_declaration_specifier declaration_qualifier+  	{ $1 `snoc` $2 }++  | typedef_declaration_specifier attr+  	{ addTrailingAttrs $1 $2 }+++-- typedef'ed type identifier with optional leading and trailing type qualifiers+--+-- * Summary:+--   type_qualifier* ( tyident | typeof '('...')' ) type_qualifier*+--+typedef_type_specifier :: { Reversed [CDeclSpec] }+typedef_type_specifier+  : tyident+  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) }++  | typeof '(' expression ')'+  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) }++  | typeof '(' type_name ')'+  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) }++  | type_qualifier_list tyident+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeDef $2 at) }++  | type_qualifier_list typeof '(' expression ')'+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }++  | type_qualifier_list typeof '(' type_name ')'+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfType $4 at) }++  -- repeat with attrs (this could be easier if type qualifier list wouldn't allow leading attributes)+  | attrs tyident+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) }++  | attrs typeof '(' expression ')'+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfExpr $4 at)) }++  | attrs typeof '(' type_name ')'+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfType $4 at)) }++  | type_qualifier_list attrs tyident+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }++  | type_qualifier_list attrs typeof '(' expression ')'+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) }++  | type_qualifier_list attrs typeof '(' type_name ')'+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) }++  | typedef_type_specifier type_qualifier+  	{ $1 `snoc` CTypeQual $2 }++  | typedef_type_specifier attr+  	{ addTrailingAttrs $1 $2 }+++-- A named or anonymous struct, union or enum type.+--+-- * Summary:+--   (struct|union|enum) (identifier? '{' ... '}' | identifier)+--+elaborated_type_name :: { CTypeSpec }+elaborated_type_name+  : struct_or_union_specifier	{% withNodeInfo $1 $ CSUType $1 }+  | enum_specifier		{% withNodeInfo $1 $ CEnumType $1 }+++-- parse C structure or union declaration (C99 6.7.2.1)+--+-- * Summary:+--    (struct|union) (identifier? '{' ... '}' | identifier)+--+struct_or_union_specifier :: { CStructUnion }+struct_or_union_specifier+  : struct_or_union attrs_opt identifier '{' struct_declaration_list  '}'+  	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ reverse $5) $2 }++  | struct_or_union attrs_opt '{' struct_declaration_list  '}'+  	{% withNodeInfo $1 $ CStruct (unL $1) Nothing   (Just$ reverse $4) $2 }++  | struct_or_union attrs_opt identifier+  	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 }+++struct_or_union :: { Located CStructTag }+struct_or_union+  : struct			{ L CStructTag (posOf $1) }+  | union			{ L CUnionTag (posOf $1) }+++struct_declaration_list :: { Reversed [CDecl] }+struct_declaration_list+  : {- empty -}						{ empty }+  | struct_declaration_list ';'				{ $1 }+  | struct_declaration_list struct_declaration		{ $1 `snoc` $2 }+++-- parse C structure declaration (C99 6.7.2.1)+--+struct_declaration :: { CDecl }+struct_declaration+  : struct_declaring_list ';'+  	{ case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }++  | struct_default_declaring_list';'+  	{ case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }++  | "__extension__" struct_declaration	{ $2 }+++--+--  * Note: doesn't redeclare typedef+--+--  TODO: FIXME: AST doesn't allow recording attributes of unnamed struct members+struct_default_declaring_list :: { CDecl }+struct_default_declaring_list+  : type_qualifier_list attrs_opt struct_identifier_declarator+  	{% withNodeInfo $1 $ case $3 of (d,s) -> CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [(d,Nothing,s)] }++  -- GNU extension: __attribute__ as only type qualifier+  | attrs struct_identifier_declarator+    {% withNodeInfo $1 $ case $2 of (d,s) -> CDecl (liftCAttrs $1) [(d,Nothing,s)] }+  -- attrs_opt apply to the declared object+  | struct_default_declaring_list ',' attrs_opt struct_identifier_declarator+  	{ case $1 of+            CDecl declspecs dies at ->+              case $4 of+                (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs $3 d,Nothing,s) : dies) at+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at } -- FIXME++-- * GNU extensions:+--     allow anonymous nested structures and unions+--     FIXME: cannot record attribute of unnamed field+struct_declaring_list :: { CDecl }+struct_declaring_list+  : type_specifier struct_declarator attrs_opt+  	{% withNodeInfo $1 $ case $2 of { (Just d,s)  -> CDecl $1 [(Just $! appendObjAttrs $3 d,Nothing,s)]+                                    ; (Nothing,s) -> CDecl $1 [(Nothing,Nothing,s)]  } } {- DO FIXME -}+  | struct_declaring_list ',' attrs_opt struct_declarator attrs_opt+  	{ case $1 of+            CDecl declspecs dies attr ->+              case $4 of+                (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs ($3++$5) d,Nothing,s) : dies) attr+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr }++  -- FIXME: We're being far too liberal in the parsing here, we really want to just+  -- allow unnamed struct and union fields but we're actually allowing any+  -- unnamed struct member. Making it allow only unnamed structs or unions in+  -- the parser is far too tricky, it makes things ambiguous. So we'll have to+  -- diagnose unnamed fields that are not structs/unions in a later stage.++  -- Note that a plain type specifier can have a trailing attribute++  | type_specifier+     {% withNodeInfo $1 $ CDecl $1 []  }+++-- parse C structure declarator (C99 6.7.2.1)+--+struct_declarator :: { (Maybe CDeclr, Maybe CExpr) }+struct_declarator+  : declarator					       { (Just (reverseDeclr $1), Nothing) }+  | ':' constant_expression			   { (Nothing, Just $2) }+  | declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) }++-- FIXME: anonymous bitfield doesn't allow recording of attributes+struct_identifier_declarator :: { (Maybe CDeclr, Maybe CExpr) }+struct_identifier_declarator+  : identifier_declarator				{ (Just (reverseDeclr $1), Nothing) }+  | ':' constant_expression				{ (Nothing, Just $2) }+  | identifier_declarator ':' constant_expression	{ (Just (reverseDeclr $1), Just $3) }+  | struct_identifier_declarator attr+    {  case $1 of {   (Nothing,expr) -> (Nothing,expr) {- FIXME -}+                    ; (Just (CDeclr name derived asmname attrs node), bsz) ->+                                        (Just (CDeclr name derived asmname (attrs++$2) node),bsz)+                  }+    }++-- parse C enumeration declaration (C99 6.7.2.2)+--+-- * Summary:+--   enum (identifier? '{' ... '}' | identifier)+--+enum_specifier :: { CEnum }+enum_specifier+  : enum attrs_opt '{' enumerator_list '}'+  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }++  | enum attrs_opt '{' enumerator_list ',' '}'+  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }++  | enum attrs_opt identifier '{' enumerator_list '}'+  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }++  | enum attrs_opt identifier '{' enumerator_list ',' '}'+  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }++  | enum attrs_opt identifier+  	{% withNodeInfo $1 $ CEnum (Just $3) Nothing $2           }++enumerator_list :: { Reversed [(Ident, Maybe CExpr)] }+enumerator_list+  : enumerator					{ singleton $1 }+  | enumerator_list ',' enumerator		{ $1 `snoc` $3 }+++enumerator :: { (Ident, Maybe CExpr) }+enumerator+  : identifier					{ ($1, Nothing) }+  | identifier '=' constant_expression		{ ($1, Just $3) }+++-- parse C type qualifier (C99 6.7.3)+--+type_qualifier :: { CTypeQual }+type_qualifier+  : const		{% withNodeInfo $1 $ CConstQual }+  | volatile		{% withNodeInfo $1 $ CVolatQual }+  | restrict		{% withNodeInfo $1 $ CRestrQual }+  | inline		{% withNodeInfo $1 $ CInlineQual }++-- a list containing at least one type_qualifier (const, volatile, restrict, inline)+--    and additionally CAttrs+type_qualifier_list :: { Reversed [CTypeQual] }+type_qualifier_list+  : attrs_opt type_qualifier	             { reverseList (map CAttrQual $1) `snoc` $2 }+  | type_qualifier_list type_qualifier	     { $1 `snoc` $2 }+  | type_qualifier_list attrs type_qualifier { ($1 `rappend` map CAttrQual $2) `snoc` $3}	++-- parse C declarator (C99 6.7.5)+--+declarator :: { CDeclrR }+declarator+  : identifier_declarator		{ $1 }+  | typedef_declarator			{ $1 }+++-- Parse GNU C's asm annotations+--+-- Those annotations allow to give an assembler name to a function or identifier.+asm_opt :: { Maybe CStrLit }+asm_opt+  : {- empty -}				          { Nothing }+  | asm '(' string_literal ')'	{ Just $3 }++--+-- typedef_declarator :-++typedef_declarator :: { CDeclrR }+typedef_declarator+  -- would be ambiguous as parameter+  : paren_typedef_declarator		{ $1 }++  -- not ambiguous as param+  | parameter_typedef_declarator	{ $1 }+++-- parameter_typedef_declarator :- tyident declarator_postfix?+--                              | '(' attrs? clean_typedef_declarator ')' declarator_postfix?+--                              |  '*' attrs? type_qualifier_list? parameter_typedef_declarator+--+parameter_typedef_declarator :: { CDeclrR }+parameter_typedef_declarator+  : tyident+  	{% withNodeInfo $1 $ mkVarDeclr $1 }++  | tyident postfixing_abstract_declarator+  	{% withNodeInfo $1 $ \at -> $2 (mkVarDeclr $1 at) }++  | clean_typedef_declarator+  	{ $1 }+++-- The  following have at least one '*'.+-- There is no (redundant) '(' between the '*' and the tyident.+--+-- clean_typedef_declarator :-  '(' attrs? clean_typedef_declarator ')' declarator_postfix?+--                            | '*' attrs? type_qualifier_list? parameter_typedef_declarator+--+clean_typedef_declarator :: { CDeclrR }+clean_typedef_declarator+  : clean_postfix_typedef_declarator+  	{ $1 }++  | '*' parameter_typedef_declarator+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }++  | '*' attrs parameter_typedef_declarator+  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }++  | '*' type_qualifier_list  parameter_typedef_declarator+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }++  | '*' type_qualifier_list attrs parameter_typedef_declarator+  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2)  }++-- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix?+--+clean_postfix_typedef_declarator :: { CDeclrR }+clean_postfix_typedef_declarator+  : '(' clean_typedef_declarator ')'						              { $2 }+  | '(' clean_typedef_declarator ')' postfixing_abstract_declarator		  { $4 $2 }+  | '(' attrs clean_typedef_declarator ')'	                              { appendDeclrAttrs $2 $3 }+  | '(' attrs clean_typedef_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) }+++-- The following have a redundant '(' placed+-- immediately to the left of the tyident+--+paren_typedef_declarator :: { CDeclrR }+paren_typedef_declarator+  : paren_postfix_typedef_declarator+  	{ $1 }++  -- redundant paren+  | '*' '(' simple_paren_typedef_declarator ')'+  	{% withNodeInfo $1 $ ptrDeclr $3 [] }++  | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')'+  	{% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) }+  | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')'+  	{% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2)  }++  | '*' paren_typedef_declarator+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }++  | '*' type_qualifier_list paren_typedef_declarator+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }+  | '*' type_qualifier_list attrs paren_typedef_declarator+  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }++-- redundant paren to left of tname+paren_postfix_typedef_declarator :: { CDeclrR }+paren_postfix_typedef_declarator+  : '(' paren_typedef_declarator ')'+  	{ $2 }++  -- redundant paren+  | '(' simple_paren_typedef_declarator postfixing_abstract_declarator ')'+  	{ $3 $2 }++  | '(' paren_typedef_declarator ')' postfixing_abstract_declarator+  	{ $4 $2 }+++-- Just a type name in any number of nested brackets+--+simple_paren_typedef_declarator :: { CDeclrR }+simple_paren_typedef_declarator+  : tyident+  	{% withNodeInfo $1 $ mkVarDeclr $1 }++  | '(' simple_paren_typedef_declarator ')'+  	{ $2 }++--+-- Declarators+-- * Summary+--   declarator :- ( '*' (type_qualifier | attr)* )* ident ( array_decl | "(" parameter-list ")" )?+--      + additional parenthesis+--+identifier_declarator :: { CDeclrR }+identifier_declarator+  : unary_identifier_declarator			{ $1 }+  | paren_identifier_declarator			{ $1 }+++unary_identifier_declarator :: { CDeclrR }+unary_identifier_declarator+  : postfix_identifier_declarator+  	{ $1 }++  | '*' identifier_declarator+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }++  | '*' attrs identifier_declarator+  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }++  | '*' type_qualifier_list identifier_declarator+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }++  | '*' type_qualifier_list attrs identifier_declarator+  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }++postfix_identifier_declarator :: { CDeclrR }+postfix_identifier_declarator+  : paren_identifier_declarator postfixing_abstract_declarator+  	{ $2 $1 }++   | '('  unary_identifier_declarator ')'+   	{ $2 }++   | '(' unary_identifier_declarator ')' postfixing_abstract_declarator+   	{ $4 $2 }++   | '(' attrs unary_identifier_declarator ')'+     { appendDeclrAttrs $2 $3 }++   | '(' attrs unary_identifier_declarator ')' postfixing_abstract_declarator+     { appendDeclrAttrs $2 ($5 $3) }+++-- just an identifier in any number of nested parenthesis+paren_identifier_declarator :: { CDeclrR }+paren_identifier_declarator+  : ident+  	{% withNodeInfo $1 $ mkVarDeclr $1 }++  | '(' paren_identifier_declarator ')'+  	{ $2 }++  | '(' attrs paren_identifier_declarator ')'+  	{ appendDeclrAttrs $2 $3 }++function_declarator_old :: { CDeclr }+function_declarator_old+  : old_function_declarator+    { reverseDeclr $1 }++old_function_declarator :: { CDeclrR }+old_function_declarator+  : postfix_old_function_declarator+  	{ $1 }++  | '*' old_function_declarator+  	{% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ???++  | '*' type_qualifier_list old_function_declarator+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }++postfix_old_function_declarator :: { CDeclrR }+postfix_old_function_declarator+  : paren_identifier_declarator '(' identifier_list ')'+  	{% withNodeInfo $2 $ funDeclr $1 (Left $ reverse $3) [] }++  | '(' old_function_declarator ')'+  	{ $2 }++  | '(' old_function_declarator ')' postfixing_abstract_declarator+  	{ $4 $2 }+++-- parse C parameter type list (C99 6.7.5)+--+parameter_type_list :: { ([CDecl], Bool) }+parameter_type_list+  : {- empty -}				{ ([], False)}+  | parameter_list			{ (reverse $1, False) }+  | parameter_list ',' "..."		{ (reverse $1, True) }++parameter_list :: { Reversed [CDecl] }+parameter_list+  : parameter_declaration				{ singleton $1 }+  | parameter_list ',' parameter_declaration	{ $1 `snoc` $3 }++parameter_declaration :: { CDecl }+parameter_declaration+  : declaration_specifier+  	{% withNodeInfo $1 $ CDecl $1 [] }++  | declaration_specifier abstract_declarator+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }++  | declaration_specifier identifier_declarator attrs_opt+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++  | declaration_specifier parameter_typedef_declarator attrs_opt+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++  | declaration_qualifier_list+  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }++  | declaration_qualifier_list abstract_declarator+  	{% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }++  | declaration_qualifier_list identifier_declarator attrs_opt+  	{% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++  | type_specifier+  	{% withNodeInfo $1 $ CDecl $1 [] }++  | type_specifier abstract_declarator+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }++  | type_specifier identifier_declarator attrs_opt+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++  | type_specifier parameter_typedef_declarator attrs_opt+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++  | type_qualifier_list+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [] }+  | type_qualifier_list attr+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }++  | type_qualifier_list abstract_declarator+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }++  | type_qualifier_list identifier_declarator attrs_opt+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr$ appendDeclrAttrs $3 $2), Nothing, Nothing)] }+++identifier_list :: { Reversed [Ident] }+identifier_list+  : ident				{ singleton $1 }+  | identifier_list ',' ident		{ $1 `snoc` $3 }+++-- parse C type name (C99 6.7.6)+--+type_name :: { CDecl }+type_name+  :  type_specifier+  	{% withNodeInfo $1 $ CDecl $1 [] }++  |  type_specifier abstract_declarator+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }++  |  type_qualifier_list attr+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }++  |  type_qualifier_list abstract_declarator+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }++-- parse C abstract declarator (C99 6.7.6)+--+-- postfix starts with '('+-- postfixing starts with '(' or '['+-- unary start with '*'+abstract_declarator :: { CDeclrR }+abstract_declarator+  : unary_abstract_declarator	    { $1 }+  | postfix_abstract_declarator		{ $1 }+  | postfixing_abstract_declarator  { $1 emptyDeclr }++--+-- FIXME+--  | postfixing_abstract_declarator attrs_opt	{ $1 emptyDeclr }+++postfixing_abstract_declarator :: { CDeclrR -> CDeclrR }+postfixing_abstract_declarator+  : array_abstract_declarator+  	{ $1 }++  | '(' parameter_type_list ')'+  	{% withNodeInfo $1 $ \at declr -> case $2 of+             (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at }+++-- * TODO: Note that we recognise but ignore the C99 static keyword (see C99 6.7.5.3)+--+-- * TODO: We do not distinguish in the AST between incomplete array types and+-- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)+--+array_abstract_declarator :: { CDeclrR -> CDeclrR }+array_abstract_declarator+  : postfix_array_abstract_declarator+  	{ $1 }++  | array_abstract_declarator postfix_array_abstract_declarator+  	{ \decl -> $2 ($1 decl) }++--+-- TODO: record static+postfix_array_abstract_declarator :: { CDeclrR -> CDeclrR }+postfix_array_abstract_declarator+  : '[' assignment_expression_opt ']'+  	{% withNodeInfo $1 $ \at declr -> arrDeclr declr [] False False $2 at }++  | '[' attrs assignment_expression_opt ']'+  	{% withAttributePF $1 $2 $ \at declr -> arrDeclr declr [] False False $3 at }++  | '[' type_qualifier_list assignment_expression_opt ']'+  	{% withNodeInfo $1 $ \at declr -> arrDeclr declr (reverse $2) False False $3 at }++  | '[' type_qualifier_list attrs assignment_expression_opt ']'+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (reverse $2) False False $4 at }++  | '[' static attrs_opt assignment_expression ']'+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] False True (Just $4) at }++  | '[' static type_qualifier_list attrs_opt assignment_expression ']'+  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $3) False True (Just $5) at }++  | '[' type_qualifier_list attrs_opt static attrs_opt assignment_expression ']'+  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) False True  (Just $6) at }++  | '[' '*' attrs_opt ']'+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at }+  | '[' attrs '*' attrs_opt ']'+  	{% withAttributePF $1 ($2 ++ $4) $ \at declr -> arrDeclr declr [] True False Nothing at }++  | '[' type_qualifier_list '*' attrs_opt ']'+  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }+  | '[' type_qualifier_list attrs '*' attrs_opt ']'+  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }++unary_abstract_declarator :: { CDeclrR }+unary_abstract_declarator+  : '*'+  	{% withNodeInfo $1 $ ptrDeclr emptyDeclr [] }++  | '*' type_qualifier_list attrs_opt+  	{% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2)  }++  | '*' abstract_declarator+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }++  | '*' type_qualifier_list abstract_declarator+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }++  | '*' attrs+  	{% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] }+  | '*' attrs abstract_declarator+  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }++-- postfix_ad starts with '(', postfixing with '(' or '[', unary_abstract starts with '*'+postfix_abstract_declarator :: { CDeclrR }+postfix_abstract_declarator+  : '(' unary_abstract_declarator ')'					{ $2 }+  | '(' postfix_abstract_declarator ')'					{ $2 }+  | '(' postfixing_abstract_declarator ')'				{ $2 emptyDeclr }+  | '(' unary_abstract_declarator ')' postfixing_abstract_declarator	{ $4 $2 }++-- FIX 0700+  | '(' attrs unary_abstract_declarator ')'				     	{ appendDeclrAttrs $2 $3 }+  | '(' attrs postfix_abstract_declarator ')'					{ appendDeclrAttrs $2 $3 }+  | '(' attrs postfixing_abstract_declarator ')'				{ appendDeclrAttrs $2 ($3 emptyDeclr) }+  | '(' attrs unary_abstract_declarator ')' postfixing_abstract_declarator	{ appendDeclrAttrs $2 ($5 $3) }+  | postfix_abstract_declarator attr						    { appendDeclrAttrs $2 $1 }+++-- parse C initializer (C99 6.7.8)+--+initializer :: { CInit }+initializer+  : assignment_expression		{% withNodeInfo $1 $ CInitExpr $1 }+  | '{' initializer_list '}'		{% withNodeInfo $1 $ CInitList (reverse $2) }+  | '{' initializer_list ',' '}'	{% withNodeInfo $1 $ CInitList (reverse $2) }+++initializer_opt :: { Maybe CInit }+initializer_opt+  : {- empty -}			{ Nothing }+  | '=' initializer		{ Just $2 }+++initializer_list :: { Reversed CInitList }+initializer_list+  : {- empty -}						{ empty }+  | initializer						{ singleton ([],$1) }+  | designation initializer				{ singleton ($1,$2) }+  | initializer_list ',' initializer			{ $1 `snoc` ([],$3) }+  | initializer_list ',' designation initializer	{ $1 `snoc` ($3,$4) }+++-- designation+--+-- * GNU extensions:+--     old style member designation: 'ident :'+--     array range designation+--+designation :: { [CDesignator] }+designation+  : designator_list '='		{ reverse $1 }+  | identifier ':'		{% withNodeInfo $1 $ \at -> [CMemberDesig $1 at] }+  | array_designator		{ [$1] }+++designator_list :: { Reversed [CDesignator] }+designator_list+ : designator				{ singleton $1 }+ | designator_list designator		{ $1 `snoc` $2 }+++designator :: { CDesignator }+designator+  : '[' constant_expression ']'		{% withNodeInfo $1 $ CArrDesig $2 }+  | '.' identifier			{% withNodeInfo $1 $ CMemberDesig $2 }+  | array_designator			{ $1 }+++array_designator :: { CDesignator }+array_designator+  : '[' constant_expression "..." constant_expression ']'+  	{% withNodeInfo $1 $ CRangeDesig $2 $4 }+++-- parse C primary expression (C99 6.5.1)+--+-- We cannot use a typedef name as a variable+--+-- * GNU extensions:+--     allow a compound statement as an expression+--     __builtin_va_arg+--     __builtin_offsetof+--     __builtin_types_compatible_p+primary_expression :: { CExpr }+primary_expression+  : ident		       {% withNodeInfo $1 $ CVar $1 }+  | constant	  	 { CConst $1 }+  | string_literal { CConst (liftStrLit $1) }+  | '(' expression ')'	{ $2 }++  -- GNU extensions+  | '(' compound_statement ')'+  	{% withNodeInfo $1 $ CStatExpr $2 }++  | "__builtin_va_arg" '(' assignment_expression ',' type_name ')'+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 }++  | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')'+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) }++  | "__builtin_types_compatible_p" '(' type_name ',' type_name ')'+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 }+++offsetof_member_designator :: { Reversed [CDesignator] }+offsetof_member_designator+  : identifier						                        {% withNodeInfo $1 $ singleton . CMemberDesig $1 }+  | offsetof_member_designator '.' identifier		  {% withNodeInfo $3 $ ($1 `snoc`) . CMemberDesig $3 }+  | offsetof_member_designator '[' expression ']'	{% withNodeInfo $3 $ ($1 `snoc`) . CArrDesig $3 }+++-- parse C postfix expression (C99 6.5.2)+--+postfix_expression :: { CExpr }+postfix_expression+  : primary_expression+  	{ $1 }++  | postfix_expression '[' expression ']'+  	{% withNodeInfo $2 $ CIndex $1 $3 }++  | postfix_expression '(' ')'+  	{% withNodeInfo $2 $ CCall $1 [] }++  | postfix_expression '(' argument_expression_list ')'+  	{% withNodeInfo $2 $ CCall $1 (reverse $3) }++  | postfix_expression '.' identifier+  	{% withNodeInfo $2 $ CMember $1 $3 False }++  | postfix_expression "->" identifier+  	{% withNodeInfo $2 $ CMember $1 $3 True }++  | postfix_expression "++"+  	{% withNodeInfo $2 $ CUnary CPostIncOp $1 }++  | postfix_expression "--"+  	{% withNodeInfo $2 $ CUnary CPostDecOp $1 }++  | '(' type_name ')' '{' initializer_list '}'+  	{% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }++  | '(' type_name ')' '{' initializer_list ',' '}'+  	{% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }+++argument_expression_list :: { Reversed [CExpr] }+argument_expression_list+  : assignment_expression				{ singleton $1 }+  | argument_expression_list ',' assignment_expression	{ $1 `snoc` $3 }+++-- parse C unary expression (C99 6.5.3)+--+-- * GNU extensions:+--     'alignof' expression or type+--     '__real' and '__imag' expression+--     '__extension__' to suppress warnings about extensions+--     allow taking address of a label with: && label+--+unary_expression :: { CExpr }+unary_expression+  : postfix_expression			{ $1 }+  | "++" unary_expression		{% withNodeInfo $1 $ CUnary CPreIncOp $2 }+  | "--" unary_expression		{% withNodeInfo $1 $ CUnary CPreDecOp $2 }+  | "__extension__" cast_expression	{ $2 }+  | unary_operator cast_expression	{% withNodeInfo $1 $ CUnary (unL $1) $2 }+  | sizeof unary_expression		{% withNodeInfo $1 $ CSizeofExpr $2 }+  | sizeof '(' type_name ')'		{% withNodeInfo $1 $ CSizeofType $3 }+  -- GNU: alignof, complex and && extension+  | alignof unary_expression		{% withNodeInfo $1 $ CAlignofExpr $2 }+  | alignof '(' type_name ')'		{% withNodeInfo $1 $ CAlignofType $3 }+  | "__real__" unary_expression    {% withNodeInfo $1 $ CComplexReal $2 }+  | "__imag__" unary_expression    {% withNodeInfo $1 $ CComplexImag $2 }+  | "&&" identifier			{% withNodeInfo $1 $ CLabAddrExpr $2 }+++unary_operator :: { Located CUnaryOp }+unary_operator+  : '&'		{ L CAdrOp  (posOf $1) }+  | '*'		{ L CIndOp  (posOf $1) }+  | '+'		{ L CPlusOp (posOf $1) }+  | '-'		{ L CMinOp  (posOf $1) }+  | '~'		{ L CCompOp (posOf $1) }+  | '!'		{ L CNegOp  (posOf $1) }+++-- parse C cast expression (C99 6.5.4)+--+cast_expression :: { CExpr }+cast_expression+  : unary_expression			{ $1 }+  | '(' type_name ')' cast_expression	{% withNodeInfo $1 $ CCast $2 $4 }+++-- parse C multiplicative expression (C99 6.5.5)+--+multiplicative_expression :: { CExpr }+multiplicative_expression+  : cast_expression+  	{ $1 }++  | multiplicative_expression '*' cast_expression+  	{% withNodeInfo $2 $ CBinary CMulOp $1 $3 }++  | multiplicative_expression '/' cast_expression+  	{% withNodeInfo $2 $ CBinary CDivOp $1 $3 }++  | multiplicative_expression '%' cast_expression+  	{% withNodeInfo $2 $ CBinary CRmdOp $1 $3 }+++-- parse C additive expression (C99 6.5.6)+--+additive_expression :: { CExpr }+additive_expression+  : multiplicative_expression+  	{ $1 }++  | additive_expression '+' multiplicative_expression+  	{% withNodeInfo $2 $ CBinary CAddOp $1 $3 }++  | additive_expression '-' multiplicative_expression+  	{% withNodeInfo $2 $ CBinary CSubOp $1 $3 }+++-- parse C shift expression (C99 6.5.7)+--+shift_expression :: { CExpr }+shift_expression+  : additive_expression+  	{ $1 }++  | shift_expression "<<" additive_expression+  	{% withNodeInfo $2 $ CBinary CShlOp $1 $3 }++  | shift_expression ">>" additive_expression+  	{% withNodeInfo $2 $ CBinary CShrOp $1 $3 }+++-- parse C relational expression (C99 6.5.8)+--+relational_expression :: { CExpr }+relational_expression+  : shift_expression+  	{ $1 }++  | relational_expression '<' shift_expression+  	{% withNodeInfo $2 $ CBinary CLeOp $1 $3 }++  | relational_expression '>' shift_expression+  	{% withNodeInfo $2 $ CBinary CGrOp $1 $3 }++  | relational_expression "<=" shift_expression+  	{% withNodeInfo $2 $ CBinary CLeqOp $1 $3 }++  | relational_expression ">=" shift_expression+  	{% withNodeInfo $2 $ CBinary CGeqOp $1 $3 }+++-- parse C equality expression (C99 6.5.9)+--+equality_expression :: { CExpr }+equality_expression+  : relational_expression+  	{ $1 }++  | equality_expression "==" relational_expression+  	{% withNodeInfo $2 $ CBinary CEqOp  $1 $3 }++  | equality_expression "!=" relational_expression+  	{% withNodeInfo $2 $ CBinary CNeqOp $1 $3 }+++-- parse C bitwise and expression (C99 6.5.10)+--+and_expression :: { CExpr }+and_expression+  : equality_expression+  	{ $1 }++  | and_expression '&' equality_expression+  	{% withNodeInfo $2 $ CBinary CAndOp $1 $3 }+++-- parse C bitwise exclusive or expression (C99 6.5.11)+--+exclusive_or_expression :: { CExpr }+exclusive_or_expression+  : and_expression+  	{ $1 }++  | exclusive_or_expression '^' and_expression+  	{% withNodeInfo $2 $ CBinary CXorOp $1 $3 }+++-- parse C bitwise or expression (C99 6.5.12)+--+inclusive_or_expression :: { CExpr }+inclusive_or_expression+  : exclusive_or_expression+  	{ $1 }++  | inclusive_or_expression '|' exclusive_or_expression+  	{% withNodeInfo $2 $ CBinary COrOp $1 $3 }+++-- parse C logical and expression (C99 6.5.13)+--+logical_and_expression :: { CExpr }+logical_and_expression+  : inclusive_or_expression+  	{ $1 }++  | logical_and_expression "&&" inclusive_or_expression+  	{% withNodeInfo $2 $ CBinary CLndOp $1 $3 }+++-- parse C logical or expression (C99 6.5.14)+--+logical_or_expression :: { CExpr }+logical_or_expression+  : logical_and_expression+  	{ $1 }++  | logical_or_expression "||" logical_and_expression+  	{% withNodeInfo $2 $ CBinary CLorOp $1 $3 }+++-- parse C conditional expression (C99 6.5.15)+--+-- * GNU extensions:+--     omitting the `then' part+conditional_expression :: { CExpr }+conditional_expression+  : logical_or_expression+  	{ $1 }++  | logical_or_expression '?' expression ':' conditional_expression+  	{% withNodeInfo $2 $ CCond $1 (Just $3) $5 }++  | logical_or_expression '?' ':' conditional_expression+  	{% withNodeInfo $2 $ CCond $1 Nothing $4 }+++-- parse C assignment expression (C99 6.5.16)+--+-- * NOTE: LHS of assignment is more restricted than in gcc.+--         `x ? y : z = 3' parses in gcc as `(x ? y : z) = 3',+--         but `x ? y : z' is not an unary expression.+assignment_expression :: { CExpr }+assignment_expression+  : conditional_expression+  	{ $1 }++  | unary_expression assignment_operator assignment_expression+  	{% withNodeInfo $2 $ CAssign (unL $2) $1 $3 }+++assignment_operator :: { Located CAssignOp }+assignment_operator+  : '='			{ L CAssignOp (posOf $1) }+  | "*="		{ L CMulAssOp (posOf $1) }+  | "/="		{ L CDivAssOp (posOf $1) }+  | "%="		{ L CRmdAssOp (posOf $1) }+  | "+="		{ L CAddAssOp (posOf $1) }+  | "-="		{ L CSubAssOp (posOf $1) }+  | "<<="		{ L CShlAssOp (posOf $1) }+  | ">>="		{ L CShrAssOp (posOf $1) }+  | "&="		{ L CAndAssOp (posOf $1) }+  | "^="		{ L CXorAssOp (posOf $1) }+  | "|="		{ L COrAssOp  (posOf $1) }+++-- parse C expression (C99 6.5.17)+--+expression :: { CExpr }+expression+  : assignment_expression+  	{ $1 }++  | assignment_expression ',' comma_expression+  	{% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) }++comma_expression :: { Reversed [CExpr] }+comma_expression+  : assignment_expression			{ singleton $1 }+  | comma_expression ',' assignment_expression	{ $1 `snoc` $3 }+++-- The following was used for clarity+expression_opt :: { Maybe CExpr }+expression_opt+  : {- empty -}		{ Nothing }+  | expression		{ Just $1 }+++-- The following was used for clarity+assignment_expression_opt :: { Maybe CExpr }+assignment_expression_opt+  : {- empty -}				{ Nothing }+  | assignment_expression		{ Just $1 }+++-- parse C constant expression (C99 6.6)+--+constant_expression :: { CExpr }+constant_expression+  : conditional_expression			{ $1 }+++-- parse C constants+--+constant :: { CConst }+constant+  : cint	  {% withNodeInfo $1 $ case $1 of CTokILit _ i -> CIntConst i }+  | cchar	  {% withNodeInfo $1 $ case $1 of CTokCLit _ c -> CCharConst c }+  | cfloat	{% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f }+++string_literal :: { CStrLit }+string_literal+  : cstr+  	{% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit s }++  | cstr string_literal_list+  	{% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse $2)) }+++string_literal_list :: { Reversed [CString] }+string_literal_list+  : cstr			{ case $1 of CTokSLit _ s -> singleton s }+  | string_literal_list cstr	{ case $2 of CTokSLit _ s -> $1 `snoc` s }+++identifier :: { Ident }+identifier+  : ident		{ $1 }+  | tyident		{ $1 }+++-- parse GNU C attribute annotation+attrs_opt ::	{ [CAttr] }+attrs_opt+  : {- empty -}						{ [] }+  | attrs         				{ $1 }++-- GNU C attribute annotation+attrs :: { [CAttr] }+attrs+  : attr						{ $1 }+  | attrs attr	    { $1 ++ $2 }++attr :: { [CAttr] }+attr+  : "__attribute__" '(' '(' attribute_list ')' ')'	{ reverse $4 }++attribute_list :: { Reversed [CAttr] }+  : attribute						          { case $1 of Nothing -> empty; Just attr -> singleton attr }+  | attribute_list ',' attribute	{ (maybe id (flip snoc) $3) $1 }+++attribute :: { Maybe CAttr }+attribute+  : {- empty -}						         { Nothing }+  | ident						               {% withNodeInfo $1 $ Just . CAttr $1  [] }+  | const						               {% withNodeInfo $1 $ Just . CAttr (internalIdent "const") [] }+  | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (reverse $3) }+  | ident '(' ')'					         {% withNodeInfo $1 $ Just . CAttr $1 [] }++attribute_params :: { Reversed [CExpr] }+attribute_params+  : constant_expression					              { singleton $1 }+  | attribute_params ',' constant_expression	{ $1 `snoc` $3 }+++{++--  sometimes it is neccessary to reverse an unreversed list+reverseList :: [a] -> Reversed [a]+reverseList = Reversed . List.reverse++-- We occasionally need things to have a location when they don't naturally+-- have one built in as tokens and most AST elements do.+--+data Located a = L !a !Position++unL :: Located a -> a+unL (L a pos) = a++instance Pos (Located a) where+  posOf (L _ pos) = pos++{-# INLINE withNodeInfo #-}+withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a+withNodeInfo node mkAttributedNode = do+  name <- getNewName+  let attrs = mkNodeInfo (posOf node) name+  attrs `seq` return (mkAttributedNode attrs)++data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo+reverseDeclr :: CDeclrR -> CDeclr+reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)+    = CDeclr ide (reverse reversedDDs) asmname cattrs at++{-# INLINE withAttribute #-}+withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR+withAttribute node cattrs mkDeclrNode = do+  name <- getNewName+  let attrs = mkNodeInfo (posOf node) name+  let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs+  attrs `seq` newDeclr `seq` return newDeclr++-- postfixing variant+{-# INLINE withAttributePF #-}+withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)+withAttributePF node cattrs mkDeclrCtor = do+  name <- getNewName+  let attrs = mkNodeInfo (posOf node) name+  let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs+  attrs `seq` newDeclr `seq` return newDeclr++-- add top level attributes for a declarator.+--+-- In the following example+--+-- > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));+--+-- the attributes `a1' and `a3' are top-level attributes for y.+-- The (pseudo)-AST for the second declarator is+--+-- > CDeclr "y"+-- >        [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]+-- >        (asm "$y")+-- >        [__attribute__((a1)), __attribute__((a3)) ]+--+-- So assembler names and preceeding and trailing attributes are recorded in object declarator.+--+appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr+appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)+    = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at+appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR+appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)+    = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at++setAsmName :: Maybe CStrLit  -> CDeclrR -> P CDeclrR+setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =+    case combineName mAsmName oldName of+        Left (n1,n2)       -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]+        Right newName      -> return $ CDeclrR ident indirections newName cattrs at+  where+  combineName Nothing Nothing = Right Nothing+  combineName Nothing oldname@(Just _)  = Right oldname+  combineName newname@(Just _) Nothing  = Right newname+  combineName (Just n1) (Just n2) = Left (n1,n2)+  showName (CStrLit cstr _) = show cstr++withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR+withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)++appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)+    = CDeclrR ident empty asmname (cattrs ++ newAttrs) at+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)+    = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where+    appendAttrs (CPtrDeclr typeQuals at)           = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at+    appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at+    appendAttrs (CFunDeclr parameters cattrs at)   = CFunDeclr parameters (cattrs ++ newAttrs) at++ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR+ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at+    = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat+funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR+funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at+    = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat+arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR+arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at+    = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )+    where+    arr_sz = case size_expr_opt of+                 Just e  -> CArrSize static_size e+                 Nothing -> CNoArrSize var_sized++liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]+liftTypeQuals (Reversed tyqs) = revmap [] tyqs+  where revmap a []     = a+        revmap a (x:xs) = revmap (CTypeQual x : a) xs++-- lift CAttrs to DeclSpecs+--+liftCAttrs :: [CAttr] -> [CDeclSpec]+liftCAttrs = map (CTypeQual . CAttrQual)++-- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list+-- needs special care when @decl_spec_n@ is a SUE definition+addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]+addTrailingAttrs declspecs new_attrs =+    case viewr declspecs of+        (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))+            -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))+        (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))+            -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))+        _ -> declspecs `rappend` (liftCAttrs new_attrs)++-- convenient instance, the position of a list of things is the position of+-- the first thing in the list+--+instance Pos a => Pos [a] where+  posOf (x:_) = posOf x++instance Pos a => Pos (Reversed a) where+  posOf (Reversed x) = posOf x++emptyDeclr     = CDeclrR Nothing empty Nothing [] (mkNodeInfoOnlyPos nopos)+mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []++-- Take the identifiers and use them to update the typedef'ed identifier set+-- if the decl is defining a typedef then we add it to the set,+-- if it's a var decl then that shadows typedefed identifiers+--+doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()+doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =+  case mIdent of+    Nothing -> return ()+    Just ident | any iypedef declspecs -> addTypedef ident+               | otherwise               -> shadowTypedef ident++  where iypedef (CStorageSpec (CTypedef _)) = True+        iypedef _                           = False++doFuncParamDeclIdent :: CDeclr -> P ()+doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =+  sequence_+    [ case getCDeclrIdent declr of+        Nothing -> return ()+        Just ident -> shadowTypedef ident+    | CDecl _ dle _  <- either (const []) fst params+    , (Just declr, _, _) <- dle ]+doFuncParamDeclIdent _ = return ()++-- extract all identifiers+getCDeclrIdent :: CDeclr -> Maybe Ident+getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent++happyError :: P a+happyError = parseError++-- * public interface++-- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.+parseC :: InputStream -> Position -> Either ParseError CTranslUnit+parseC input initialPosition =+  execParser header input initialPosition builtinTypeNames (namesStartingFrom 0)+}
+ src/Language/C/Parser/ParserMonad.hs view
@@ -0,0 +1,149 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Syntax.ParserMonad+-- Copyright   :  (c) [1999..2004] Manuel M T Chakravarty+--                (c) 2005-2007 Duncan Coutts+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Portability :  portable+--+-- Monad for the C lexer and parser+--+--  This monad has to be usable with Alex and Happy. Some things in it are+--  dictated by that, eg having to be able to remember the last token.+--+--  The monad also provides a unique name supply (via the Name module)+--+--  For parsing C we have to maintain a set of identifiers that we know to be+--  typedef'ed type identifiers. We also must deal correctly with scope so we+--  keep a list of sets of identifiers so we can save the outer scope when we+--  enter an inner scope.+module Language.C.Parser.ParserMonad (+  P,+  execParser,+  failP,+  getNewName,        -- :: P Name+  addTypedef,        -- :: Ident -> P ()+  shadowTypedef,     -- :: Ident -> P ()+  isTypeIdent,       -- :: Ident -> P Bool+  enterScope,        -- :: P ()+  leaveScope,        -- :: P ()+  setPos,            -- :: Position -> P ()+  getPos,            -- :: P Position+  getInput,          -- :: P String+  setInput,          -- :: String -> P ()+  getLastToken,      -- :: P CToken+  setLastToken,      -- :: CToken -> P ()+  ParseError(..),+  ) where+import Language.C.Data.Error (internalErr, showErrorInfo,ErrorInfo(..),ErrorLevel(..))+import Language.C.Data.Position  (Position(..))+import Language.C.Data.InputStream+import Language.C.Data.Name    (Name)+import Language.C.Data.Ident    (Ident)+import Language.C.Parser.Tokens (CToken)++import Data.Set  (Set)+import qualified Data.Set as Set (fromList, insert, member, delete)++newtype ParseError = ParseError ([String],Position)+instance Show ParseError where+    show (ParseError (msgs,pos)) = showErrorInfo "Syntax Error !" (ErrorInfo LevelError pos msgs)+++data ParseResult a+  = POk !PState a+  | PFailed [String] Position   -- The error message and position++data PState = PState {+        curPos     :: !Position,        -- position at current input location+        curInput   :: !InputStream,      -- the current input+        prevToken  ::  CToken,          -- the previous token+        namesupply :: ![Name],          -- the name unique supply+        tyidents   :: !(Set Ident),     -- the set of typedef'ed identifiers+        scopes     :: ![Set Ident]      -- the tyident sets for outer scopes+     }++newtype P a = P { unP :: PState -> ParseResult a }++instance Monad P where+  return = returnP+  (>>=) = thenP+  fail m = getPos >>= \pos -> failP pos [m]++execParser :: P a -> InputStream -> Position -> [Ident] -> [Name]+           -> Either ParseError a+execParser (P parser) input pos builtins names =+  case parser initialState of+    PFailed message errpos -> Left (ParseError (message,errpos))+    POk _ result -> Right result+  where initialState = PState {+          curPos = pos,+          curInput = input,+          prevToken = internalErr "CLexer.execParser: Touched undefined token!",+          namesupply = names,+          tyidents = Set.fromList builtins,+          scopes   = []+        }++{-# INLINE returnP #-}+returnP :: a -> P a+returnP a = P $ \s -> POk s a++{-# INLINE thenP #-}+thenP :: P a -> (a -> P b) -> P b+(P m) `thenP` k = P $ \s ->+        case m s of+                POk s' a        -> (unP (k a)) s'+                PFailed err pos -> PFailed err pos++failP :: Position -> [String] -> P a+failP pos msg = P $ \_ -> PFailed msg pos++getNewName :: P Name+getNewName = P $ \s@PState{namesupply=(n:ns)} -> POk s{namesupply=ns} n++setPos :: Position -> P ()+setPos pos = P $ \s -> POk s{curPos=pos} ()++getPos :: P Position+getPos = P $ \s@PState{curPos=pos} -> POk s pos++addTypedef :: Ident -> P ()+addTypedef ident = (P $ \s@PState{tyidents=tyids} ->+                             POk s{tyidents = ident `Set.insert` tyids} ())++shadowTypedef :: Ident -> P ()+shadowTypedef ident = (P $ \s@PState{tyidents=tyids} ->+                             -- optimisation: mostly the ident will not be in+                             -- the tyident set so do a member lookup to avoid+                             --  churn induced by calling delete+                             POk s{tyidents = if ident `Set.member` tyids+                                                then ident `Set.delete` tyids+                                                else tyids } ())++isTypeIdent :: Ident -> P Bool+isTypeIdent ident = P $ \s@PState{tyidents=tyids} ->+                             POk s $! Set.member ident tyids++enterScope :: P ()+enterScope = P $ \s@PState{tyidents=tyids,scopes=ss} ->+                     POk s{scopes=tyids:ss} ()++leaveScope :: P ()+leaveScope = P $ \s@PState{scopes=ss} ->+                     case ss of+                       []          -> error "leaveScope: already in global scope"+                       (tyids:ss') -> POk s{tyidents=tyids, scopes=ss'} ()++getInput :: P InputStream+getInput = P $ \s@PState{curInput=i} -> POk s i++setInput :: InputStream -> P ()+setInput i = P $ \s -> POk s{curInput=i} ()++getLastToken :: P CToken+getLastToken = P $ \s@PState{prevToken=tok} -> POk s tok++setLastToken :: CToken -> P ()+setLastToken tok = P $ \s -> POk s{prevToken=tok} ()
+ src/Language/C/Parser/Tokens.hs view
@@ -0,0 +1,344 @@+{-# OPTIONS  #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Parser.Tokens+-- Copyright   :  [1999..2004] Manuel M T Chakravarty+--                2005 Duncan Coutts+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Portability :  portable+--+--  C Tokens for the C lexer.+--+-----------------------------------------------------------------------------+module Language.C.Parser.Tokens (CToken(..), GnuCTok(..)) where++import Language.C.Data.Position  (Position, Pos(..))+import Language.C.Data.Ident    (Ident, identToString)+import Language.C.Syntax.Constants     (CChar, CInteger, CFloat, CString)++-- token definition+-- ----------------++-- possible tokens (EXPORTED)+--+data CToken = CTokLParen   !Position            -- `('+            | CTokRParen   !Position            -- `)'+            | CTokLBracket !Position            -- `['+            | CTokRBracket !Position            -- `]'+            | CTokArrow    !Position            -- `->'+            | CTokDot      !Position            -- `.'+            | CTokExclam   !Position            -- `!'+            | CTokTilde    !Position            -- `~'+            | CTokInc      !Position            -- `++'+            | CTokDec      !Position            -- `--'+            | CTokPlus     !Position            -- `+'+            | CTokMinus    !Position            -- `-'+            | CTokStar     !Position            -- `*'+            | CTokSlash    !Position            -- `/'+            | CTokPercent  !Position            -- `%'+            | CTokAmper    !Position            -- `&'+            | CTokShiftL   !Position            -- `<<'+            | CTokShiftR   !Position            -- `>>'+            | CTokLess     !Position            -- `<'+            | CTokLessEq   !Position            -- `<='+            | CTokHigh     !Position            -- `>'+            | CTokHighEq   !Position            -- `>='+            | CTokEqual    !Position            -- `=='+            | CTokUnequal  !Position            -- `!='+            | CTokHat      !Position            -- `^'+            | CTokBar      !Position            -- `|'+            | CTokAnd      !Position            -- `&&'+            | CTokOr       !Position            -- `||'+            | CTokQuest    !Position            -- `?'+            | CTokColon    !Position            -- `:'+            | CTokAssign   !Position            -- `='+            | CTokPlusAss  !Position            -- `+='+            | CTokMinusAss !Position            -- `-='+            | CTokStarAss  !Position            -- `*='+            | CTokSlashAss !Position            -- `/='+            | CTokPercAss  !Position            -- `%='+            | CTokAmpAss   !Position            -- `&='+            | CTokHatAss   !Position            -- `^='+            | CTokBarAss   !Position            -- `|='+            | CTokSLAss    !Position            -- `<<='+            | CTokSRAss    !Position            -- `>>='+            | CTokComma    !Position            -- `,'+            | CTokSemic    !Position            -- `;'+            | CTokLBrace   !Position            -- `{'+            | CTokRBrace   !Position            --+            | CTokEllipsis !Position            -- `...'+            | CTokAlignof  !Position            -- `alignof'+                                                -- (or `__alignof',+                                                -- `__alignof__')+            | CTokAsm      !Position            -- `asm'+                                                -- (or `__asm',+                                                -- `__asm__')+            | CTokAuto     !Position            -- `auto'+            | CTokBreak    !Position            -- `break'+            | CTokBool     !Position            -- `_Bool'+            | CTokCase     !Position            -- `case'+            | CTokChar     !Position            -- `char'+            | CTokConst    !Position            -- `const'+                                                -- (or `__const', `__const__')+            | CTokContinue !Position            -- `continue'+            | CTokComplex  !Position            -- `_Complex'+            | CTokDefault  !Position            -- `default'+            | CTokDo       !Position            -- `do'+            | CTokDouble   !Position            -- `double'+            | CTokElse     !Position            -- `else'+            | CTokEnum     !Position            -- `enum'+            | CTokExtern   !Position            -- `extern'+            | CTokFloat    !Position            -- `float'+            | CTokFor      !Position            -- `for'+            | CTokGoto     !Position            -- `goto'+            | CTokIf       !Position            -- `if'+            | CTokInline   !Position            -- `inline'+                                                -- (or `__inline',+                                                -- `__inline__')+            | CTokInt      !Position            -- `int'+            | CTokLong     !Position            -- `long'+            | CTokLabel    !Position            -- `__label__'+            | CTokRegister !Position            -- `register'+            | CTokRestrict !Position            -- `restrict'+                                                -- (or `__restrict',+                                                -- `__restrict__')+            | CTokReturn   !Position            -- `return'+            | CTokShort    !Position            -- `short'+            | CTokSigned   !Position            -- `signed'+                                                -- (or `__signed',+                                                -- `__signed__')+            | CTokSizeof   !Position            -- `sizeof'+            | CTokStatic   !Position            -- `static'+            | CTokStruct   !Position            -- `struct'+            | CTokSwitch   !Position            -- `switch'+            | CTokTypedef  !Position            -- `typedef'+            | CTokTypeof   !Position            -- `typeof'+            | CTokThread   !Position            -- `__thread'+            | CTokUnion    !Position            -- `union'+            | CTokUnsigned !Position            -- `unsigned'+            | CTokVoid     !Position            -- `void'+            | CTokVolatile !Position            -- `volatile'+                                                -- (or `__volatile',+                                                -- `__volatile__')+            | CTokWhile    !Position            -- `while'+            | CTokCLit     !Position !CChar     -- character constant+            | CTokILit     !Position !CInteger  -- integer constant+            | CTokFLit     !Position CFloat     -- float constant+            | CTokSLit     !Position CString    -- string constant+            | CTokIdent    !Position !Ident     -- identifier++              -- not generated here, but in `CParser.parseCHeader'+            | CTokTyIdent  !Position !Ident     -- `typedef-name' identifier+            | CTokGnuC !GnuCTok !Position       -- special GNU C tokens+            | CTokEof                           -- end of file++-- special tokens used in GNU C extensions to ANSI C+--+data GnuCTok = GnuCAttrTok              -- `__attribute__'+             | GnuCExtTok               -- `__extension__'+             | GnuCVaArg                -- `__builtin_va_arg'+             | GnuCOffsetof             -- `__builtin_offsetof'+             | GnuCTyCompat             -- `__builtin_types_compatible_p'+             | GnuCComplexReal          -- `__real__'+             | GnuCComplexImag          -- `__imag__'++instance Pos CToken where+  posOf (CTokLParen   pos  ) = pos+  posOf (CTokRParen   pos  ) = pos+  posOf (CTokLBracket pos  ) = pos+  posOf (CTokRBracket pos  ) = pos+  posOf (CTokArrow    pos  ) = pos+  posOf (CTokDot      pos  ) = pos+  posOf (CTokExclam   pos  ) = pos+  posOf (CTokTilde    pos  ) = pos+  posOf (CTokInc      pos  ) = pos+  posOf (CTokDec      pos  ) = pos+  posOf (CTokPlus     pos  ) = pos+  posOf (CTokMinus    pos  ) = pos+  posOf (CTokStar     pos  ) = pos+  posOf (CTokSlash    pos  ) = pos+  posOf (CTokPercent  pos  ) = pos+  posOf (CTokAmper    pos  ) = pos+  posOf (CTokShiftL   pos  ) = pos+  posOf (CTokShiftR   pos  ) = pos+  posOf (CTokLess     pos  ) = pos+  posOf (CTokLessEq   pos  ) = pos+  posOf (CTokHigh     pos  ) = pos+  posOf (CTokHighEq   pos  ) = pos+  posOf (CTokEqual    pos  ) = pos+  posOf (CTokUnequal  pos  ) = pos+  posOf (CTokHat      pos  ) = pos+  posOf (CTokBar      pos  ) = pos+  posOf (CTokAnd      pos  ) = pos+  posOf (CTokOr       pos  ) = pos+  posOf (CTokQuest    pos  ) = pos+  posOf (CTokColon    pos  ) = pos+  posOf (CTokAssign   pos  ) = pos+  posOf (CTokPlusAss  pos  ) = pos+  posOf (CTokMinusAss pos  ) = pos+  posOf (CTokStarAss  pos  ) = pos+  posOf (CTokSlashAss pos  ) = pos+  posOf (CTokPercAss  pos  ) = pos+  posOf (CTokAmpAss   pos  ) = pos+  posOf (CTokHatAss   pos  ) = pos+  posOf (CTokBarAss   pos  ) = pos+  posOf (CTokSLAss    pos  ) = pos+  posOf (CTokSRAss    pos  ) = pos+  posOf (CTokComma    pos  ) = pos+  posOf (CTokSemic    pos  ) = pos+  posOf (CTokLBrace   pos  ) = pos+  posOf (CTokRBrace   pos  ) = pos+  posOf (CTokEllipsis pos  ) = pos+  posOf (CTokAlignof  pos  ) = pos+  posOf (CTokAsm      pos  ) = pos+  posOf (CTokAuto     pos  ) = pos+  posOf (CTokBreak    pos  ) = pos+  posOf (CTokBool     pos  ) = pos+  posOf (CTokCase     pos  ) = pos+  posOf (CTokChar     pos  ) = pos+  posOf (CTokConst    pos  ) = pos+  posOf (CTokContinue pos  ) = pos+  posOf (CTokComplex  pos  ) = pos+  posOf (CTokDefault  pos  ) = pos+  posOf (CTokDo       pos  ) = pos+  posOf (CTokDouble   pos  ) = pos+  posOf (CTokElse     pos  ) = pos+  posOf (CTokEnum     pos  ) = pos+  posOf (CTokExtern   pos  ) = pos+  posOf (CTokFloat    pos  ) = pos+  posOf (CTokFor      pos  ) = pos+  posOf (CTokGoto     pos  ) = pos+  posOf (CTokInt      pos  ) = pos+  posOf (CTokInline   pos  ) = pos+  posOf (CTokIf       pos  ) = pos+  posOf (CTokLong     pos  ) = pos+  posOf (CTokLabel    pos  ) = pos+  posOf (CTokRegister pos  ) = pos+  posOf (CTokRestrict pos  ) = pos+  posOf (CTokReturn   pos  ) = pos+  posOf (CTokShort    pos  ) = pos+  posOf (CTokSigned   pos  ) = pos+  posOf (CTokSizeof   pos  ) = pos+  posOf (CTokStatic   pos  ) = pos+  posOf (CTokStruct   pos  ) = pos+  posOf (CTokSwitch   pos  ) = pos+  posOf (CTokTypedef  pos  ) = pos+  posOf (CTokTypeof   pos  ) = pos+  posOf (CTokThread   pos  ) = pos+  posOf (CTokUnion    pos  ) = pos+  posOf (CTokUnsigned pos  ) = pos+  posOf (CTokVoid     pos  ) = pos+  posOf (CTokVolatile pos  ) = pos+  posOf (CTokWhile    pos  ) = pos+  posOf (CTokCLit     pos _) = pos+  posOf (CTokILit     pos _) = pos+  posOf (CTokFLit     pos _) = pos+  posOf (CTokSLit     pos _) = pos+  posOf (CTokIdent    pos _) = pos+  posOf (CTokTyIdent  pos _) = pos+  posOf (CTokGnuC   _ pos  ) = pos+  posOf CTokEof = error "tokenPos: Eof"+instance Show CToken where+  showsPrec _ (CTokLParen   _  ) = showString "("+  showsPrec _ (CTokRParen   _  ) = showString ")"+  showsPrec _ (CTokLBracket _  ) = showString "["+  showsPrec _ (CTokRBracket _  ) = showString "]"+  showsPrec _ (CTokArrow    _  ) = showString "->"+  showsPrec _ (CTokDot      _  ) = showString "."+  showsPrec _ (CTokExclam   _  ) = showString "!"+  showsPrec _ (CTokTilde    _  ) = showString "~"+  showsPrec _ (CTokInc      _  ) = showString "++"+  showsPrec _ (CTokDec      _  ) = showString "--"+  showsPrec _ (CTokPlus     _  ) = showString "+"+  showsPrec _ (CTokMinus    _  ) = showString "-"+  showsPrec _ (CTokStar     _  ) = showString "*"+  showsPrec _ (CTokSlash    _  ) = showString "/"+  showsPrec _ (CTokPercent  _  ) = showString "%"+  showsPrec _ (CTokAmper    _  ) = showString "&"+  showsPrec _ (CTokShiftL   _  ) = showString "<<"+  showsPrec _ (CTokShiftR   _  ) = showString ">>"+  showsPrec _ (CTokLess     _  ) = showString "<"+  showsPrec _ (CTokLessEq   _  ) = showString "<="+  showsPrec _ (CTokHigh     _  ) = showString ">"+  showsPrec _ (CTokHighEq   _  ) = showString ">="+  showsPrec _ (CTokEqual    _  ) = showString "=="+  showsPrec _ (CTokUnequal  _  ) = showString "!="+  showsPrec _ (CTokHat      _  ) = showString "^"+  showsPrec _ (CTokBar      _  ) = showString "|"+  showsPrec _ (CTokAnd      _  ) = showString "&&"+  showsPrec _ (CTokOr       _  ) = showString "||"+  showsPrec _ (CTokQuest    _  ) = showString "?"+  showsPrec _ (CTokColon    _  ) = showString ":"+  showsPrec _ (CTokAssign   _  ) = showString "="+  showsPrec _ (CTokPlusAss  _  ) = showString "+="+  showsPrec _ (CTokMinusAss _  ) = showString "-="+  showsPrec _ (CTokStarAss  _  ) = showString "*="+  showsPrec _ (CTokSlashAss _  ) = showString "/="+  showsPrec _ (CTokPercAss  _  ) = showString "%="+  showsPrec _ (CTokAmpAss   _  ) = showString "&="+  showsPrec _ (CTokHatAss   _  ) = showString "^="+  showsPrec _ (CTokBarAss   _  ) = showString "|="+  showsPrec _ (CTokSLAss    _  ) = showString "<<="+  showsPrec _ (CTokSRAss    _  ) = showString ">>="+  showsPrec _ (CTokComma    _  ) = showString ","+  showsPrec _ (CTokSemic    _  ) = showString ";"+  showsPrec _ (CTokLBrace   _  ) = showString "{"+  showsPrec _ (CTokRBrace   _  ) = showString "}"+  showsPrec _ (CTokEllipsis _  ) = showString "..."+  showsPrec _ (CTokAlignof  _  ) = showString "alignof"+  showsPrec _ (CTokAsm      _  ) = showString "asm"+  showsPrec _ (CTokAuto     _  ) = showString "auto"+  showsPrec _ (CTokBool _)       = showString "_Bool"+  showsPrec _ (CTokBreak    _  ) = showString "break"+  showsPrec _ (CTokCase     _  ) = showString "case"+  showsPrec _ (CTokChar     _  ) = showString "char"+  showsPrec _ (CTokComplex _)    = showString "_Complex"+  showsPrec _ (CTokConst    _  ) = showString "const"+  showsPrec _ (CTokContinue _  ) = showString "continue"+  showsPrec _ (CTokDefault  _  ) = showString "default"+  showsPrec _ (CTokDouble   _  ) = showString "double"+  showsPrec _ (CTokDo       _  ) = showString "do"+  showsPrec _ (CTokElse     _  ) = showString "else"+  showsPrec _ (CTokEnum     _  ) = showString "enum"+  showsPrec _ (CTokExtern   _  ) = showString "extern"+  showsPrec _ (CTokFloat    _  ) = showString "float"+  showsPrec _ (CTokFor      _  ) = showString "for"+  showsPrec _ (CTokGoto     _  ) = showString "goto"+  showsPrec _ (CTokIf       _  ) = showString "if"+  showsPrec _ (CTokInline   _  ) = showString "inline"+  showsPrec _ (CTokInt      _  ) = showString "int"+  showsPrec _ (CTokLong     _  ) = showString "long"+  showsPrec _ (CTokLabel    _  ) = showString "__label__"+  showsPrec _ (CTokRegister _  ) = showString "register"+  showsPrec _ (CTokRestrict _  ) = showString "restrict"+  showsPrec _ (CTokReturn   _  ) = showString "return"+  showsPrec _ (CTokShort    _  ) = showString "short"+  showsPrec _ (CTokSigned   _  ) = showString "signed"+  showsPrec _ (CTokSizeof   _  ) = showString "sizeof"+  showsPrec _ (CTokStatic   _  ) = showString "static"+  showsPrec _ (CTokStruct   _  ) = showString "struct"+  showsPrec _ (CTokSwitch   _  ) = showString "switch"+  showsPrec _ (CTokTypedef  _  ) = showString "typedef"+  showsPrec _ (CTokTypeof   _  ) = showString "typeof"+  showsPrec _ (CTokThread   _  ) = showString "__thread"+  showsPrec _ (CTokUnion    _  ) = showString "union"+  showsPrec _ (CTokUnsigned _  ) = showString "unsigned"+  showsPrec _ (CTokVoid     _  ) = showString "void"+  showsPrec _ (CTokVolatile _  ) = showString "volatile"+  showsPrec _ (CTokWhile    _  ) = showString "while"+  showsPrec _ (CTokCLit     _ c) = shows c+  showsPrec _ (CTokILit     _ i) = shows i+  showsPrec _ (CTokFLit     _ f) = shows f+  showsPrec _ (CTokSLit     _ s) = shows s+  showsPrec _ (CTokIdent    _ i) = (showString . identToString) i+  showsPrec _ (CTokTyIdent  _ i) = (showString . identToString) i+  showsPrec _ (CTokGnuC GnuCAttrTok _) = showString "__attribute__"+  showsPrec _ (CTokGnuC GnuCExtTok  _) = showString "__extension__"+  showsPrec _ (CTokGnuC GnuCComplexReal _) = showString "__real__"+  showsPrec _ (CTokGnuC GnuCComplexImag  _) = showString "__imag__"+  showsPrec _ (CTokGnuC GnuCVaArg    _) = showString "__builtin_va_arg"+  showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof"+  showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p"+  showsPrec _ CTokEof = error "show CToken : CTokEof"+
+ src/Language/C/Pretty.hs view
@@ -0,0 +1,474 @@+{-# OPTIONS  #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Pretty+-- Copyright   :  Copyright (c) 2007 Bertram Felgenhauer+--                          (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : portable+--+-- This module provides a pretty printer for the parse tree+-- ('Language.C.Syntax.AST').+-----------------------------------------------------------------------------+module Language.C.Pretty (+    -- * Pretty Printing+    Pretty (..),+    -- * Testing+    prettyUsingInclude+) where+import Data.List (partition,nub,isSuffixOf)+import qualified Data.Set as Set+import Text.PrettyPrint.HughesPJ+import Debug.Trace {- for warnings -}++import Language.C.Data+import Language.C.Syntax++-- | A class of types which can be pretty printed+class Pretty p where+    -- | pretty print the given value+    pretty     :: p -> Doc+    -- | @prettyPrec prec p@ pretty prints p assuming+    -- that the surrounding context has a precedence of+    -- @prec@+    prettyPrec :: Int -> p -> Doc++    pretty       = prettyPrec 0+    prettyPrec _ = pretty++-- pretty print optional chunk+maybeP :: (p -> Doc) -> Maybe p -> Doc+maybeP = maybe empty++-- pretty print when flag is true+ifP :: Bool -> Doc -> Doc+ifP flag doc = if flag then doc else empty++-- pretty print _optional_ list, i.e. [] ~ Nothing and (x:xs) ~ Just (x:xs)+mlistP :: ([p] -> Doc) -> [p] -> Doc+mlistP pp xs = maybeP pp (if null xs then Nothing else Just xs)++-- pretty print identifier+identP :: Ident -> Doc+identP = text . identToString++-- pretty print attribute annotations+attrlistP :: [CAttr] -> Doc+attrlistP [] = empty+attrlistP attrs = text "__attribute__" <> parens (parens (hcat . punctuate comma . map pretty $ attrs))++-- analogous to showParen+parenPrec :: Int -> Int -> Doc -> Doc+parenPrec prec prec2 t = if prec <= prec2 then t else parens t++-- indent a chunk of code+ii :: Doc -> Doc+ii = nest 4++-- Pretty instances+instance Pretty CTranslUnit where+    pretty (CTranslUnit edecls _) = vcat (map pretty edecls)++-- | Pretty print the given tranlation unit, but replace declarations from header files with @#include@ directives.+--+-- The resulting file may not compile (because of missing @#define@ directives and similar things), but is very usefull+-- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers.+prettyUsingInclude :: CTranslUnit -> Doc+prettyUsingInclude (CTranslUnit edecls _) =+  includeWarning headerFiles+    $$+  (vcat $ map (either includeHeader pretty) mappedDecls)+  where+    (headerFiles,mappedDecls) = foldr addDecl (Set.empty,[]) $ map tagIncludedDecls edecls+    tagIncludedDecls edecl | isHeaderFile ((posFile . posOf) edecl) = Left ((posFile . posOf) edecl)+                           | otherwise = Right edecl+    addDecl decl@(Left headerRef) (headerSet, ds)+      | Set.member headerRef headerSet = (headerSet, ds)+      | otherwise = (Set.insert headerRef headerSet, decl : ds)+    addDecl decl (headerSet,ds) = (headerSet, decl : ds)+    includeHeader hFile = text "#include" <+> doubleQuotes (text hFile)+    isHeaderFile = (".h" `isSuffixOf`)+    includeWarning hs | Set.null hs = empty+                      | otherwise = text "/* Warning: The #include directives in this file aren't neccessarily correct. */"++-- TODO: Check need of __extension__+instance Pretty CExtDecl where+    pretty (CDeclExt decl) = pretty decl <> semi+    pretty (CFDefExt fund) = pretty fund+    pretty (CAsmExt  asmStmt) = text "asm" <> parens (pretty asmStmt) <> semi++-- TODO: Check that old-style and new-style aren't mixed+instance Pretty CFunDef where+    pretty (CFunDef declspecs declr decls stat _) =          -- Example:+            hsep (map pretty declspecs)                      -- __attribute__((noreturn)) static long+        <+> pretty declr                                     -- foo(b)+        $+$ (ii . vcat . map (<> semi) . map pretty) decls   --     register long b;+        $$ prettyPrec (-1) stat                              -- {  ...+                                                             -- }++instance Pretty CStat where+    pretty (CLabel ident stat cattrs _) = identP ident <> text ":" <+> attrlistP cattrs $$ pretty stat+    pretty (CCase expr stat _) =+        text "case" <+> pretty expr <> text ":" $$ pretty stat+    pretty (CCases expr1 expr2 stat _) =+        text "case" <+> pretty expr1 <+> text "..."+                    <+> pretty expr2 <> text ":" $$ pretty stat+    pretty (CDefault stat _) = text "default:" $$ pretty stat+    pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi+    pretty c@(CCompound _ _ _) = prettyPrec 0 c+    pretty (CIf expr stat estat _) =+        ii $  text "if" <+> text "(" <> pretty expr <> text ")"+                $+$ prettyPrec (-1) stat+              $$ maybeP prettyElse estat+      where+        prettyElse (CIf else_if_expr else_if_stat else_stat _) =+          text "else if" <+> text "(" <> pretty else_if_expr <> text ")"+            $+$ prettyPrec (-1) else_if_stat+          $$ maybeP prettyElse else_stat+        prettyElse else_stmt =+          text "else" <+> prettyPrec (-1) else_stmt++    pretty (CSwitch expr stat _) =+        ii $ text "switch" <+> text "(" <> pretty expr <> text ")"+               $+$ prettyPrec (-1) stat+    pretty (CWhile expr stat False _) =+        ii $ text "while" <+> text "(" <> pretty expr <> text ")"+               $+$ prettyPrec (-1) stat+    pretty (CWhile expr stat True _) =+        ii $ text "do" $+$ prettyPrec (-1) stat+               $$ text "while" <+> text "(" <> pretty expr <> text ");"+    pretty (CFor for_init cond step stat _) =+        ii $ text "for" <+> text "("+               <> either (maybeP pretty) pretty for_init <> semi+               <+> maybeP pretty cond <> semi+               <+> maybeP pretty step <> text ")" $+$ prettyPrec (-1) stat+    pretty (CGoto ident _) = ii $ text "goto" <+> identP ident <> semi+    pretty (CGotoPtr expr _) = ii $ text "goto" <+> text "*" <+> prettyPrec 30 expr <> semi+    pretty (CCont _) = ii $ text "continue" <> semi+    pretty (CBreak _) = ii $ text "break" <> semi+    pretty (CReturn Nothing _) = ii $ text "return" <> semi+    pretty (CReturn (Just e) _) = ii $ text "return" <+> pretty e <> semi+    pretty (CAsm asmStmt _) = pretty asmStmt+    prettyPrec p (CCompound localLabels bis _) =+        let inner = text "{" $+$ mlistP ppLblDecls localLabels $+$ vcat (map pretty bis) $$ text "}"+        in  if p == -1 then inner else ii inner+        where ppLblDecls =  vcat . map (\l -> text "__label__" <+> identP l <+> semi)+    prettyPrec _ p = pretty p++instance Pretty CAsmStmt where+    pretty (CAsmStmt tyQual expr outOps inOps clobbers _) =+        ii $ text "__asm__" <+>+             maybeP pretty tyQual <>+             parens asmStmt <> semi+      where+        asmStmt = pretty expr <+>+                  (if all null [inOps,outOps] && null clobbers then empty else ops)+        ops     =  text ":" <+> hcat (punctuate comma (map pretty outOps)) <+>+                   text ":" <+> hcat (punctuate comma (map pretty inOps)) <+>+                   (if null clobbers then empty else clobs)+        clobs   =  text ":" <+> hcat (punctuate comma (map pretty clobbers))++instance Pretty CAsmOperand where+    -- asm_operand :~ [operand-name] "constraint" ( expr )+    pretty (CAsmOperand mArgName cnstr expr _) =+        maybeP (\argName -> text "[" <> identP argName <> text "]") mArgName <+>+        pretty cnstr <+>+        parens (pretty expr)++-- TODO: Check need of __extension__+instance Pretty CBlockItem where+    pretty (CBlockStmt stat) = pretty stat+    pretty (CBlockDecl decl) = ii $ pretty decl <> semi+    pretty (CNestedFunDef fundef) = ii $ pretty fundef++instance Pretty CDecl where+    -- CAVEAT:+    -- we may not print __attribute__s directly after typespecs,+    -- as this may change the semantics of the declaration.+    -- The parser fixes this, but to avoid hard-to-track code generator+    -- errors, we enforce this invariant on the AST level.+    pretty (CDecl specs divs _) =+        hsep (map pretty checked_specs) <+> hsep (punctuate comma (map p divs))+            where+            -- possible hint for AST improvement - (declr, initializer, expr, attrs)+            -- currently there are no sensible attributes for unnamed bitfields though+            p (declr, initializer, expr) =+                maybeP (prettyDeclr False 0) declr <+>+                maybeP ((text ":" <+>) . pretty) expr <+>+                attrlistP (getAttrs declr) <+>+                maybeP ((text "=" <+>) . pretty) initializer+            checked_specs =+                case any isAttrAfterSUE  (zip specs (tail specs)) of+                    True -> trace+                              ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:"+++                               (show $ map pretty specs))+                            specs+                    False -> specs+            isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty+            isAttrAfterSUE _ = False+            getAttrs Nothing = []+            getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs++instance Pretty CDeclSpec where+    pretty (CStorageSpec sp) = pretty sp+    pretty (CTypeSpec sp) = pretty sp+    pretty (CTypeQual qu) = pretty qu++instance Pretty CStorageSpec where+    pretty sp = text (show sp)++instance Pretty CTypeSpec where+    pretty (CVoidType _)        = text "void"+    pretty (CCharType _)        = text "char"+    pretty (CShortType _)       = text "short"+    pretty (CIntType _)         = text "int"+    pretty (CLongType _)        = text "long"+    pretty (CFloatType _)       = text "float"+    pretty (CDoubleType _)      = text "double"+    pretty (CSignedType _)      = text "signed"+    pretty (CUnsigType _)       = text "unsigned"+    pretty (CBoolType _)        = text "_Bool"+    pretty (CComplexType _)     = text "_Complex"+    pretty (CSUType union _)    = pretty union+    pretty (CEnumType enum _)   = pretty enum+    pretty (CTypeDef ident _)   = identP ident+    pretty (CTypeOfExpr expr _) =+        text "typeof" <> text "(" <> pretty expr <> text ")"+    pretty (CTypeOfType decl _) =+        text "typeof" <> text "(" <> pretty decl <> text ")"++instance Pretty CTypeQual where+    pretty (CConstQual _) = text "const"+    pretty (CVolatQual _) = text "volatile"+    pretty (CRestrQual _) = text "__restrict"+    pretty (CInlineQual _) = text "inline"+    pretty (CAttrQual a)  = attrlistP [a]++instance Pretty CStructUnion where+    pretty (CStruct tag ident Nothing cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident+    pretty (CStruct tag ident (Just []) cattrs _) =+        pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{ }"+    pretty (CStruct tag ident (Just decls) cattrs _) = vcat [+        pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{",+        ii $ sep (map (<> semi) (map pretty decls)),+        text "}"]++instance Pretty CStructTag where+    pretty CStructTag = text "struct"+    pretty CUnionTag  = text "union"++instance Pretty CEnum where+    pretty (CEnum enum_ident Nothing cattrs _) = text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident+    pretty (CEnum enum_ident (Just vals) cattrs _) = vcat [+        text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident <+> text "{",+        ii $ sep (punctuate comma (map p vals)),+        text "}"] where+        p (ident, expr) = identP ident <+> maybeP ((text "=" <+>) . pretty) expr++--  Analyze a declarator and return a human-readable description+--   See C99 Spec p 115ff.+-- describeDeclr :: CDeclr -> Doc+-- describeDeclr declr =+--     let declrs = reverse (declrChain declr) in+--     endDescr (foldl descrDeclr undefined declrs)+--+--   where+--   declrChain declr@(CVarDeclr _ _ _ _) = [declr]+--   declrChain declr@(CPtrDeclr _ ideclr _)   = declr : declrChain ideclr+--   declrChain declr@(CArrDeclr ideclr _ _ _) = declr : declrChain ideclr+--   declrChain declr@(CFunDeclr ideclr _ _ _)   = declr : declrChain ideclr+--+--   descrDeclr _ (CVarDeclr ident asm cattrs _) = single False $ \_ ->+--       maybe (text "<anonymous>") identP ident <+>+--       maybeP (\asmname -> parens (text "asm:" <+> pretty asmname)) asm <+>+--       text "is" <+> (if null cattrs then empty else prettyList (map CAttrQual cattrs) <> comma)+--   descrDeclr (pre,isPlural) (CPtrDeclr quals declr _) = single isPlural $ \pluralize ->+--       pre <+> indefArticle isPlural <> prettyList quals <+> pluralize "pointer to" "pointers to"+--   descrDeclr (pre,isPlural) (CArrDeclr declr quals expr _) = plural isPlural $ \pluralize ->+--       pre <+> indefArticle' isPlural <> prettyList quals <+> pluralize "array of" "arrays of"+--   descrDeclr (pre,isPlural) (CFunDeclr declr params cattrs _) = single isPlural $ \pluralize ->+--       pre <+> indefArticle isPlural <> prettyList (map CAttrQual cattrs) <+> pluralize "function returning" "functions returning"+--   endDescr (pre, isPlural) =  pre <+> text (if isPlural then "<typed objects>" else "a <typed object>")+--   single :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)+--   single isPlural mkDescr = (mkDescr (pluralize isPlural), isPlural)+--   plural :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)+--   plural isPlural mkDescr = (mkDescr (pluralize isPlural), True)+--   indefArticle isPlural  = text$ if isPlural then "" else "a "+--   indefArticle' isPlural = text$ if isPlural then "" else "an "+--   pluralize isPlural s p = text (if isPlural then p else s)+--   prettyList :: (Pretty a) => [a] -> Doc+--   prettyList = hsep . punctuate comma . map pretty+instance Pretty CDeclr where+    prettyPrec prec declr = prettyDeclr True prec declr++prettyDeclr :: Bool -> Int -> CDeclr -> Doc+prettyDeclr show_attrs prec (CDeclr name derived_declrs asmname cattrs _) =+    ppDeclr prec (reverse derived_declrs) <+> prettyAsmName asmname <+> ifP show_attrs (attrlistP cattrs)+    where+    ppDeclr _ [] = maybeP identP name+    --'*' __attribute__? qualifiers declarator+    ppDeclr p (CPtrDeclr quals _ : declrs) =+        parenPrec p 5 $ text "*" <+> hsep (map pretty quals) <+> ppDeclr 5 declrs++    -- declarator[ __attribute__? qualifiers expr ]+    ppDeclr p (CArrDeclr quals size _ : declrs) =+        parenPrec p 6 $ ppDeclr 6 declrs <> brackets (hsep (map pretty quals) <+> pretty size)+    -- declarator ( arguments )+    -- or (__attribute__ declarator) (arguments)+    ppDeclr _ (CFunDeclr params fun_attrs _ : declrs) =+        (if not (null fun_attrs) then parens (attrlistP fun_attrs <+> ppDeclr 5 declrs) else ppDeclr 6 declrs)+        <> parens (prettyParams params)+    prettyParams (Right (decls, isVariadic)) =+     sep (punctuate comma (map pretty decls))+     <> (if isVariadic then text "," <+> text "..." else empty)+    prettyParams (Left oldStyleIds) =+     hsep (punctuate comma (map identP oldStyleIds))+    prettyAsmName asm_name_opt+        = maybe empty (\asm_name -> text "__asm__" <> parens (pretty asm_name)) asm_name_opt++instance Pretty CArrSize where+  pretty (CNoArrSize completeType) = ifP completeType (text "*")+  pretty (CArrSize staticMod expr) = ifP staticMod (text "static") <+> pretty expr+-- initializer :: { CInit }+-- initializer :- assignment_expression+--              | '{' (designation? initializer)_cs_list '}'+instance Pretty CInit where+    pretty (CInitExpr expr _) = pretty expr+    pretty (CInitList initl _) =+        text "{" <+> hsep (punctuate comma (map p initl)) <+> text "}" where+        p ([], initializer)     = pretty initializer+        p (desigs, initializer) = hsep (map pretty desigs) <+> text "=" <+> pretty initializer++-- designation :- designator_list '='+--             | array_range_designator+-- arr_designator :- '[' constant_expression ']'+-- member_designator :-  '.' identifier+-- arr_range _designator :- '[' constant_expression "..." constant_expression ']'++instance Pretty CDesignator where+    pretty (CArrDesig expr _) = text "[" <> pretty expr <> text "]"+    pretty (CMemberDesig ident _) = text "." <> identP ident+    pretty (CRangeDesig expr1 expr2 _) =+        text "[" <> pretty expr1 <+> text "..." <+> pretty expr2 <> text "]"++instance Pretty CAttr where+    pretty (CAttr attrName [] _) = identP attrName+    pretty (CAttr attrName attrParams _) = identP attrName <> parens (hsep . punctuate comma . map pretty $ attrParams)++instance Pretty CExpr where+    prettyPrec p (CComma exprs _) =+        parenPrec p (-1) $ hsep (punctuate comma (map (prettyPrec 2) exprs))+    prettyPrec p (CAssign op expr1 expr2 _) =+        parenPrec p 2 $ prettyPrec 3 expr1 <+> pretty op <+> prettyPrec 2 expr2+    prettyPrec p (CCond expr1 expr2 expr3 _) =+        parenPrec p 2 $ prettyPrec 4 expr1 <+> text "?" -- NB: assignment only has a higher precedence if cond is on the rhs+           <+> maybeP pretty expr2 <+> text ":" <+> prettyPrec 4 expr3+    prettyPrec p (CBinary op expr1 expr2 _) =+        let prec = binPrec op+        in  parenPrec p prec $ prettyPrec prec expr1+                             <+> pretty op <+> prettyPrec (prec + 1) expr2+    prettyPrec p (CCast decl expr _) =+        parenPrec p 25 $ text "(" <> pretty decl <> text ")"+                       <+> prettyPrec 25 expr+    prettyPrec p (CUnary CPostIncOp expr _) =+        parenPrec p 26 $ prettyPrec 26 expr <> text "++"+    prettyPrec p (CUnary CPostDecOp expr _) =+        parenPrec p 26 $ prettyPrec 26 expr <> text "--"+    prettyPrec p (CUnary op expr@(CUnary _ _ _) _) =+        --                             parens aren't neccessary, but look nicer imho+        parenPrec p 25 $ pretty op <+> parens (prettyPrec 25 expr)+    prettyPrec p (CUnary op expr _) =+        parenPrec p 25 $ pretty op <> prettyPrec 25 expr+    prettyPrec p (CSizeofExpr expr _) =+        parenPrec p 25 $ text "sizeof" <> parens (pretty expr)+    prettyPrec p (CSizeofType decl _) =+        parenPrec p 25 $ text "sizeof" <> parens (pretty decl)+    prettyPrec p (CAlignofExpr expr _) =+        parenPrec p 25 $ text "__alignof" <> parens (pretty expr)+    prettyPrec p (CAlignofType decl _) =+        parenPrec p 25 $ text "__alignof" <> parens (pretty decl)+    prettyPrec p (CComplexReal expr _) =+        parenPrec p 25 $ text "__real" <+> prettyPrec 25 expr+    prettyPrec p (CComplexImag expr _) =+        parenPrec p 25 $ text "__imag" <+> prettyPrec 25 expr+    prettyPrec p (CIndex expr1 expr2 _) =+        parenPrec p 26 $ prettyPrec 26 expr1+                       <> text "[" <> pretty expr2 <> text "]"+    prettyPrec p (CCall expr args _) =+        parenPrec p 30 $ prettyPrec 30 expr <> text "("+            <> (sep . punctuate comma . map pretty) args <> text ")"+    prettyPrec p (CMember expr ident deref _) =+        parenPrec p 26 $ prettyPrec 26 expr+                       <> text (if deref then "->" else ".") <> identP ident+    prettyPrec _p (CVar ident _) = identP ident+    prettyPrec _p (CConst constant) = pretty constant+    prettyPrec _p (CCompoundLit decl initl _) =+        parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where+        p ([], initializer)           = pretty initializer+        p ([struct_mem], initializer) = pretty struct_mem <+> text "=" <+> pretty initializer+        p (badDecls , initializer)  =+            error $ "Inconsistent AST: more than one left-hand-side in CCompoundLit init-list entry" +++                    (show $ (hsep $ punctuate comma $ map pretty badDecls) <+> text "=" <+> pretty initializer)++    prettyPrec _p (CStatExpr stat _) =+        text "(" <> pretty stat <> text ")"++    -- unary_expr :- && ident  {- address of label -}+    prettyPrec _p (CLabAddrExpr ident _) = text "&&" <> identP ident++    prettyPrec _p (CBuiltinExpr builtin) = pretty builtin++instance Pretty CBuiltin where+    pretty (CBuiltinVaArg expr ty_name _) =+        text "__builtin_va_arg" <+>+        (parens $ pretty expr <> comma <+> pretty ty_name)+    -- The first desig has to be a member field.+    pretty (CBuiltinOffsetOf ty_name (CMemberDesig field1 _ : desigs) _) =+        text "__builtin_offsetof" <+>+        (parens $ pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) )+    pretty (CBuiltinOffsetOf _ty_name otherDesigs _) =+        error $ "Inconsistent AST: Cannot interpret designators in offsetOf: "++ show (hcat$ map pretty otherDesigs)+    pretty (CBuiltinTypesCompatible ty1 ty2 _) =+        text "__builtin_types_compatible_p" <+>+        (parens $ pretty ty1 <> comma <+> pretty ty2)++instance Pretty CAssignOp where+    pretty = text . show++instance Pretty CBinaryOp where+    pretty = text . show++instance Pretty CUnaryOp where+    pretty = text . show++instance Pretty CConst where+    pretty (CIntConst   int_const _) = text (show int_const)+    pretty (CCharConst  chr _) = text (show chr)+    pretty (CFloatConst flt _) = text (show flt)+    pretty (CStrConst   str _) = text (show str)++instance Pretty CStrLit where+    pretty (CStrLit   str _) = text (show str)++-- precedence of C operators+binPrec :: CBinaryOp -> Int+binPrec CMulOp = 20+binPrec CDivOp = 20+binPrec CRmdOp = 20+binPrec CAddOp = 19+binPrec CSubOp = 19+binPrec CShlOp = 18+binPrec CShrOp = 18+binPrec CLeOp  = 17+binPrec CGrOp  = 17+binPrec CLeqOp = 17+binPrec CGeqOp = 17+binPrec CEqOp  = 16+binPrec CNeqOp = 16+binPrec CAndOp = 15+binPrec CXorOp = 14+binPrec COrOp  = 13+binPrec CLndOp = 12+binPrec CLorOp = 11
+ src/Language/C/Syntax.hs view
@@ -0,0 +1,20 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Syntax+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : ghc+--+-- Syntax of C files: The abstract syntax tree and constants.+-----------------------------------------------------------------------------+module Language.C.Syntax (+     -- * Constants+     module Language.C.Syntax.Constants,+     -- * Syntax tree+     module Language.C.Syntax.AST,+)+where+import Language.C.Syntax.AST+import Language.C.Syntax.Constants
+ src/Language/C/Syntax/AST.hs view
@@ -0,0 +1,731 @@+{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Syntax.AST+-- Copyright   :  (c) [1999..2007] Manuel M T Chakravarty+--                (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : ghc+--+-- Abstract syntax of C source and header files.+--+--  The tree structure is based on the grammar in Appendix A of K&R.  The+--  abstract syntax simplifies the concrete syntax by merging similar concrete+--  constructs into a single type of abstract tree structure: declarations are+--  merged with structure declarations, parameter declarations and type names,+--  and declarators are merged with abstract declarators.+--+--  With K&R we refer to ``The C Programming Language'', second edition, Brain+--  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all+--  of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several+--  GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>.+-----------------------------------------------------------------------------+module Language.C.Syntax.AST (+  -- * C translation units+  CTranslUnit(..),  CExtDecl(..),+  -- * Declarations+  CFunDef(..),  CDecl(..),+  CStructUnion(..),  CStructTag(..), CEnum(..),+  -- * Declaration attributes+  CDeclSpec(..), partitionDeclSpecs,+  CStorageSpec(..), CTypeSpec(..), isSUEDef, CTypeQual(..), CAttr(..),+  -- * Declarators+  CDeclr(..),CDerivedDeclr(..),CArrSize(..),+  -- * Initialization+  CInit(..), CInitList, CDesignator(..),+  -- * Statements+  CStat(..), CBlockItem(..),+  CAsmStmt(..), CAsmOperand(..),+  -- * Expressions+  CExpr(..),+  CAssignOp(..), CBinaryOp(..), CUnaryOp(..),+  CBuiltin(..),+  -- * Constants+  CConst(..),CStrLit(..),cstringOfLit,liftStrLit,+) where+import Data.List+import Language.C.Syntax.Constants+import Language.C.Syntax.Ops+import Language.C.Data.Ident+import Language.C.Data.Node+import Language.C.Data.Position+import Data.Generics++-- | Complete C tranlsation unit (C99 6.9, K&R A10)+--+-- A complete C translation unit, for example representing a C header or source file.+-- It consists of a list of external (i.e. toplevel) declarations.+data CTranslUnit = CTranslUnit [CExtDecl] NodeInfo+                   deriving (Data,Typeable {-! CNode !-})++-- | External C declaration (C99 6.9, K&R A10)+--+-- Either a toplevel declaration, function definition or external assembler.+data CExtDecl = CDeclExt CDecl+              | CFDefExt CFunDef+              | CAsmExt  CStrLit+              deriving (Data,Typeable {-! CNode !-})++-- | C function definition (C99 6.9.1, K&R A10.1)+--+-- A function definition is of the form @CFunDef specifiers declarator decllist? stmt@.+--+-- * @specifiers@ are the type and storage-class specifiers of the function.+--   The only storage-class specifiers allowed are /extern/ and /static/.+--+-- * The @declarator@ must be such that the declared identifier has /function type/.+--   The return type shall be void or an object type other than array type.+--+-- * The optional declaration list @decllist@ is for old-style function declarations.+--+-- * The statement @stmt@ is a compound statement.+data CFunDef = CFunDef [CDeclSpec]      -- type specifier and qualifier+                       CDeclr           -- declarator+                       [CDecl]          -- optional declaration list+                       CStat            -- compound statement+                       NodeInfo+               deriving (Data,Typeable {-! CNode !-})++-- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter+--   declarations and type names.+--+-- A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's+--  elements depends on the kind of declaration:+--+-- 1) Toplevel declarations (K&R A8, C99 6.7 declaration)+--+--   * C99 requires that there is at least one specifier, though this is merely a syntactic restriction+--+--   * at most one storage class specifier is allowed per declaration+--+--   * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@.+--      The declarator @declr@ has to be present and non-abstract and the initialization expression is+--      optional.+--+-- 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration)+--+--   Those are the declarations of a structure's members.+--+--   * do not allow storage specifiers+--+--   * in strict C99, the list of declarators has to be non-empty+--+--   * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@,+--     representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@,+--     for unnamed bitfields. @declr@ has to be non-abstract.+--+--   * no member of a structure shall have incomplete type+--+-- 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration)+--+--   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@,+--     i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed).+--+-- 4) Type names (A8.8, C99 6.7.6)+--+--   * do not allow storage specifiers+--+--   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@.+--     where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier)+--+data CDecl = CDecl [CDeclSpec]          -- type specifier and qualifier, __attribute__+                   [(Maybe CDeclr,      -- declarator (may be omitted)+                     Maybe CInit,       -- optional initialize+                     Maybe CExpr)]      -- optional size (const expr)+                   NodeInfo+             deriving (Data,Typeable {-! CNode !-})++-- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6)+--+-- A declarator declares a single object, function, or type. It is always associated with+-- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and+-- attributes, which apply to the declared object.+--+-- A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where+-- @name@ is the name of the declared object (missing for abstract declarators),+-- @declquals@ is a set of additional declaration specifiers,+-- @asm-name@ is the optional assembler name and attributes is a set of+-- attrs is a set of @__attribute__@ annotations for the declared object.+--+-- @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as+-- described below. If the /declaration/ specifies the non-derived type @T@,+-- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type+-- @(D1 `indirect` (D2 `indirect` ...  (Dn `indirect` T)))@, where+--+--  * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/+--+--  * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/+--+--  * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/+--+-- Examples (simplified attributes):+--+--  * /x/ is an int+--+-- > int x;+-- > CDeclr "x" []+--+--  * /x/ is a restrict pointer to a const pointer to int+--+-- > const int * const * restrict x;+-- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]]+--+--  * /f/ is an function return a constant pointer to int+--+-- > int* const f();+-- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]]+--+--  * /f/ is a constant pointer to a function returning int+--+-- > int (* const f)(); ==>+-- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []]+data CDeclr = CDeclr (Maybe Ident) [CDerivedDeclr] (Maybe CStrLit) [CAttr] NodeInfo+              deriving (Data,Typeable {-! CNode !-})++-- | Derived declarators, see 'CDeclr'+--+-- Indirections are qualified using type-qualifiers and generic attributes, and additionally+--+--    * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the+--      type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that+--      the supplied argument is an array of at least the given size.+--+--    * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the+--      form @Left (parameter-names)@+data CDerivedDeclr =+              CPtrDeclr [CTypeQual] NodeInfo+              -- ^ Pointer declarator @CPtrDeclr tyquals declr@+            | CArrDeclr [CTypeQual] (CArrSize) NodeInfo+              -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@+            | CFunDeclr (Either [Ident] ([CDecl],Bool)) [CAttr] NodeInfo+              -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@+            deriving (Data,Typeable {-! CNode !-})++-- | Size of an array+data CArrSize = CNoArrSize Bool     -- ^ @CUnknownSize isCompleteType@+              | CArrSize Bool CExpr -- ^ @CArrSize isStatic expr@+              deriving (Data,Typeable)++-- | C statement (K&R A9, C99 6.8)+--+data CStat = CLabel  Ident CStat [CAttr] NodeInfo  -- ^ An (attributed) label followed by a statement+           | CCase CExpr CStat NodeInfo            -- ^ A statement of the form @case expr : stmt@+           | CCases CExpr CExpr CStat NodeInfo     -- ^ A case range of the form @case lower ... upper : stmt@+           | CDefault CStat NodeInfo               -- ^ The default case @default : stmt@+           | CExpr (Maybe CExpr) NodeInfo+           -- ^ A simple statement, that is in C: evaluating an expression with side-effects+           --   and discarding the result.+           | CCompound [Ident] [CBlockItem] NodeInfo    -- ^ compound statement @CCompound localLabels blockItems at@+           | CIf CExpr CStat (Maybe CStat) NodeInfo     -- ^ conditional statement @CIf ifExpr thenStmt maybeElseStmt at@+           | CSwitch CExpr CStat NodeInfo+           -- ^ switch statement @CSwitch selectorExpr switchStmt@, where @switchStmt@ usually includes+           -- /case/, /break/ and /default/ statements+           | CWhile CExpr CStat Bool NodeInfo      -- ^ while or do-while statement @CWhile guard stmt isDoWhile at@+           | CFor (Either (Maybe CExpr) CDecl)+                  (Maybe CExpr)+                  (Maybe CExpr)+                  CStat+                  NodeInfo+           -- ^ for statement @CFor init expr-2 expr-3 stmt@, where @init@ is either a declaration or+           -- initializing expression+           | CGoto Ident NodeInfo            -- ^ goto statement @CGoto label@+           | CGotoPtr CExpr NodeInfo         -- ^ computed goto @CGotoPtr labelExpr@+           | CCont NodeInfo                  -- ^ continue statement+           | CBreak    NodeInfo              -- ^ break statement+           | CReturn (Maybe CExpr)NodeInfo   -- ^ return statement @CReturn returnExpr@+           | CAsm CAsmStmt NodeInfo          -- ^ assembly statement+           deriving (Data,Typeable {-! CNode !-})++-- | GNU Assembler statement+--+-- > CAsmStatement type-qual? asm-expr out-ops in-ops clobbers _+--+-- is an inline assembler statement.+-- The only type-qualifier (if any) allowed is /volatile/.+-- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input+-- and output operands of the statement.+-- @clobbers@ is a list of registers which are clobbered when executing the assembler statement+data CAsmStmt+  = CAsmStmt (Maybe CTypeQual)     -- maybe volatile+                    CStrLit        -- assembler expression (String)+                   [CAsmOperand]   -- output operands+                   [CAsmOperand]   -- input operands+                   [CStrLit]       -- Clobbers+                    NodeInfo+    deriving (Data,Typeable {-! CNode !-})+-- | Assembler operand+--+-- @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler+-- statement.+data CAsmOperand = CAsmOperand (Maybe Ident)   -- argument name+                                CStrLit        -- constraint expr+                                CExpr          -- argument+                                NodeInfo+                   deriving (Data,Typeable {-! CNode !-})+-- | C99 Block items+--+--  Things that may appear in compound statements: either statements, declarations+--   or nested function definitions.+data CBlockItem = CBlockStmt    CStat           -- ^ A statement+                | CBlockDecl    CDecl           -- ^ A local declaration+                | CNestedFunDef CFunDef         -- ^ A nested function (GNU C)+                  deriving (Data,Typeable {-! CNode !-})+-- | C declaration specifiers and qualifiers+--+-- Declaration specifiers include at most one storage-class specifier (C99 6.7.1),+-- type specifiers (6.7.2) and type qualifiers (6.7.3).+data CDeclSpec = CStorageSpec CStorageSpec  -- ^ storage-class specifier or typedef+               | CTypeSpec    CTypeSpec     -- ^ type name+               | CTypeQual    CTypeQual     -- ^ type qualifier+                 deriving (Data,Typeable {-! CNode !-})++-- | Seperate the declaration specifiers+--+-- Note that inline isn't actually a type qualifier, but a function specifier.+-- @__attribute__@ of a declaration qualify declarations or declarators (but not types),+-- and are therefore seperated as well.+partitionDeclSpecs :: [CDeclSpec] -> ([CStorageSpec], [CAttr], [CTypeQual], [CTypeSpec], Bool)+partitionDeclSpecs = foldr deals ([],[],[],[],False) where+    deals (CTypeQual (CInlineQual _)) (sts,ats,tqs,tss,_) = (sts,ats,tqs,tss,True)+    deals (CStorageSpec sp) (sts,ats,tqs,tss,inline)  = (sp:sts,ats,tqs,tss,inline)+    deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,inline)  = (sts,attr:ats,tqs,tss,inline)+    deals (CTypeQual tq) (sts,ats,tqs,tss,inline)     = (sts,ats,tq:tqs,tss,inline)+    deals (CTypeSpec ts) (sts,ats,tqs,tss,inline)     = (sts,ats,tqs,ts:tss,inline)++-- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)+data CStorageSpec = CAuto     NodeInfo     -- ^ auto+                  | CRegister NodeInfo     -- ^ register+                  | CStatic   NodeInfo     -- ^ static+                  | CExtern   NodeInfo     -- ^ extern+                  | CTypedef  NodeInfo     -- ^ typedef+                  | CThread   NodeInfo     -- ^ GNUC thread local storage+                 deriving (Eq,Ord,Data,Typeable {-! CNode !-})+instance Show CStorageSpec where+    show (CAuto _) = "auto"+    show (CRegister _) = "register"+    show (CStatic _) = "static"+    show (CExtern _) = "extern"+    show (CTypedef _) = "typedef"+    show (CThread _) = "__thread"++-- | C type specifier (K&R A8.2, C99 6.7.2)+--+-- Type specifiers are either basic types such as @char@ or @int@,+-- @struct@, @union@ or @enum@ specifiers or typedef names.+--+-- As a GNU extension, a @typeof@ expression also is a type specifier.+data CTypeSpec = CVoidType    NodeInfo+               | CCharType    NodeInfo+               | CShortType   NodeInfo+               | CIntType     NodeInfo+               | CLongType    NodeInfo+               | CFloatType   NodeInfo+               | CDoubleType  NodeInfo+               | CSignedType  NodeInfo+               | CUnsigType   NodeInfo+               | CBoolType    NodeInfo+               | CComplexType NodeInfo+               | CSUType      CStructUnion NodeInfo  -- ^ Struct or Union specifier+               | CEnumType    CEnum        NodeInfo  -- ^ Enumeration specifier+               | CTypeDef     Ident        NodeInfo  -- ^ Typedef name+               | CTypeOfExpr  CExpr        NodeInfo  -- ^ @typeof(expr)@+               | CTypeOfType  CDecl        NodeInfo  -- ^ @typeof(type)@+               deriving (Data,Typeable {-! CNode !-})++-- | returns @True@ if the given typespec is a struct, union or enum /definition/+isSUEDef :: CTypeSpec -> Bool+isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True+isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True+isSUEDef _ = False++-- | C type qualifiers (K&R A8.2, C99 6.7.3), function specifiers (C99 6.7.4), and attributes.+--+-- @const@, @volatile@ and @restrict@ type qualifiers and @inline@ function specifier.+-- Additionally, @__attribute__@ annotations for declarations and declarators.+data CTypeQual = CConstQual NodeInfo+               | CVolatQual NodeInfo+               | CRestrQual NodeInfo+               | CInlineQual NodeInfo+               | CAttrQual  CAttr+               deriving (Data,Typeable {-! CNode !-})++-- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1)+--+-- @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@).+--+--   * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present.+--+--     Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and+--     in @struct foo { int y; } x;@ both of them.+--+--   * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier+data CStructUnion = CStruct CStructTag+                            (Maybe Ident)+                            (Maybe [CDecl])    -- member declarations+                            [CAttr]            -- __attribute__s+                            NodeInfo+                    deriving (Data,Typeable {-! CNode !-})++-- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.+data CStructTag = CStructTag+                | CUnionTag+                deriving (Eq,Data,Typeable)++-- | C enumeration specifier (K&R A8.4, C99 6.7.2.2)+--+-- @CEnum identifier enumerator-list attrs@ represent as enum specifier+--+--  * Either the identifier or the enumerator-list (or both) have to be present.+--+--  * If @enumerator-list@ is present, it has to be non-empty.+--+--  * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter+--    is an optional constant integral expression.+--+--  * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier+data CEnum = CEnum (Maybe Ident)+                   (Maybe [(Ident,             -- variant name+                            Maybe CExpr)])     -- explicit variant value+                   [CAttr]                     -- __attribute__s+                   NodeInfo+             deriving (Data,Typeable {-! CNode !-})+++-- | C initialization (K&R A8.7, C99 6.7.8)+--+-- Initializers are either assignment expressions or initializer lists+-- (surrounded in curly braces), whose elements are themselves+-- initializers, paired with an optional list of designators.+data CInit = CInitExpr CExpr+                       NodeInfo            -- ^ assignment expression+           | CInitList CInitList+                       NodeInfo            -- ^ initialization list (see 'CInitList')+             deriving (Data,Typeable {-! CNode !-})++-- | Initializer List+--+-- The members of an initializer list are of the form @(designator-list,initializer)@.+-- @designator-list@ is allowed to be empty - in this case the initializer refers to the+-- ''next'' member of the compound type (see C99 6.7.8).+--+-- Examples (simplified expressions and identifiers):+--+-- > -- { [0], [3] = 4, [2] = 5, 8 }+-- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)+-- >     init2 = ([CArrDesig 2], CInitExpr 5)+-- >     init3 = ([], CInitExpr 8)+-- > in  CInitList [init1, init2, init3]+--+-- > -- { .s = { {2,3} , .a = { 1 } } }+-- > let init_1  = [ ([], CInitExpr 1) ]+-- >     init_23 = zip (repeat []) [CInitExpr 2, CInitExpr 3]+-- >     init_s_1 = ([], CInitList init_23)+-- >     init_s_a = ([CMemberDesig "a"], CInitList init_1)+-- >     init_s  = ((CMemberDesig "s"), CInitList [init_s_1,init_s_a])+-- > in  CInitList [init_s]+type CInitList = [([CDesignator], CInit)]++-- | Designators+--+-- A designator specifies a member of an object, either an element or range of an array,+-- or the named member of a struct \/ union.+data CDesignator = CArrDesig     CExpr+                                 NodeInfo  -- ^ array position designator+                 | CMemberDesig  Ident+                                 NodeInfo  -- ^ member designator+                 | CRangeDesig   CExpr+                                 CExpr+                                 NodeInfo  -- ^ array range designator @CRangeDesig from to _@ (GNU C)+                   deriving (Data,Typeable {-! CNode !-})++-- | @__attribute__@ annotations+--+-- Those are of the form @CAttr attribute-name attribute-parameters@,+-- and serve as generic properties of some syntax tree elements.+data CAttr = CAttr Ident [CExpr] NodeInfo+             deriving (Data,Typeable {-! CNode !-})++-- | C expression (K&R A7)+--+-- * these can be arbitrary expression, as the argument of `sizeof' can be+--   arbitrary, even if appearing in a constant expression+--+-- * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins+--+data CExpr = CComma       [CExpr]       -- comma expression list, n >= 2+                          NodeInfo+           | CAssign      CAssignOp     -- assignment operator+                          CExpr         -- l-value+                          CExpr         -- r-value+                          NodeInfo+           | CCond        CExpr         -- conditional+                   (Maybe CExpr)        -- true-expression (GNU allows omitting)+                          CExpr         -- false-expression+                          NodeInfo+           | CBinary      CBinaryOp     -- binary operator+                          CExpr         -- lhs+                          CExpr         -- rhs+                          NodeInfo+           | CCast        CDecl         -- type name+                          CExpr+                          NodeInfo+           | CUnary       CUnaryOp      -- unary operator+                          CExpr+                          NodeInfo+           | CSizeofExpr  CExpr+                          NodeInfo+           | CSizeofType  CDecl         -- type name+                          NodeInfo+           | CAlignofExpr CExpr+                          NodeInfo+           | CAlignofType CDecl         -- type name+                          NodeInfo+           | CComplexReal CExpr         -- real part of complex number+                          NodeInfo+           | CComplexImag CExpr         -- imaginary part of complex number+                          NodeInfo+           | CIndex       CExpr         -- array+                          CExpr         -- index+                          NodeInfo+           | CCall        CExpr         -- function+                          [CExpr]       -- arguments+                          NodeInfo+           | CMember      CExpr         -- structure+                          Ident         -- member name+                          Bool          -- deref structure? (True for `->')+                          NodeInfo+           | CVar         Ident         -- identifier (incl. enumeration const)+                          NodeInfo+           | CConst       CConst        -- ^ integer, character, floating point and string constants+           | CCompoundLit CDecl+                          CInitList     -- type name & initialiser list+                          NodeInfo      -- ^ C99 compound literal+           | CStatExpr    CStat NodeInfo  -- ^ GNU C compound statement as expr+           | CLabAddrExpr Ident NodeInfo  -- ^ GNU C address of label+           | CBuiltinExpr CBuiltin        -- ^ builtin expressions, see 'CBuiltin'+           deriving (Data,Typeable {-! CNode !-})+++-- | GNU Builtins, which cannot be typed in C99+data CBuiltin =+          CBuiltinVaArg CExpr CDecl NodeInfo            -- ^ @(expr, type)@+        | CBuiltinOffsetOf CDecl [CDesignator] NodeInfo -- ^ @(type, designator-list)@+        | CBuiltinTypesCompatible CDecl CDecl NodeInfo  -- ^ @(type,type)@+        deriving (Data,Typeable {-! CNode !-})++-- | C constant (K&R A2.5 & A7.2)+data CConst = CIntConst   CInteger NodeInfo+            | CCharConst  CChar NodeInfo+            | CFloatConst CFloat NodeInfo+            | CStrConst   CString NodeInfo+            deriving (Data,Typeable {-! CNode !-})++-- | Attributed string literals+data CStrLit = CStrLit CString NodeInfo+            deriving (Data,Typeable {-! CNode !-})++cstringOfLit :: CStrLit -> CString+cstringOfLit (CStrLit cstr _) = cstr++-- | Lift a string literal to a C constant+liftStrLit :: CStrLit -> CConst+liftStrLit (CStrLit str at) = CStrConst str at++++--------------------------------------------------------+-- DERIVES GENERATED CODE+-- DO NOT MODIFY BELOW THIS LINE+-- CHECKSUM: 1181183062++instance CNode CTranslUnit+    where nodeInfo (CTranslUnit _ nodeinfo) = nodeinfo+instance Pos CTranslUnit+    where posOf x = posOfNode (nodeInfo x)++instance CNode CExtDecl+    where nodeInfo (CDeclExt d) = nodeInfo d+          nodeInfo (CFDefExt d) = nodeInfo d+          nodeInfo (CAsmExt d) = nodeInfo d+instance Pos CExtDecl+    where posOf x = posOfNode (nodeInfo x)++instance CNode CFunDef+    where nodeInfo (CFunDef _ _ _ _ nodeinfo) = nodeinfo+instance Pos CFunDef+    where posOf x = posOfNode (nodeInfo x)++instance CNode CDecl+    where nodeInfo (CDecl _ _ nodeinfo) = nodeinfo+instance Pos CDecl+    where posOf x = posOfNode (nodeInfo x)++instance CNode CDeclr+    where nodeInfo (CDeclr _ _ _ _ nodeinfo) = nodeinfo+instance Pos CDeclr+    where posOf x = posOfNode (nodeInfo x)++instance CNode CDerivedDeclr+    where nodeInfo (CPtrDeclr _ nodeinfo) = nodeinfo+          nodeInfo (CArrDeclr _ _ nodeinfo) = nodeinfo+          nodeInfo (CFunDeclr _ _ nodeinfo) = nodeinfo+instance Pos CDerivedDeclr+    where posOf x = posOfNode (nodeInfo x)++instance CNode CStat+    where nodeInfo (CLabel _ _ _ nodeinfo) = nodeinfo+          nodeInfo (CCase _ _ nodeinfo) = nodeinfo+          nodeInfo (CCases _ _ _ nodeinfo) = nodeinfo+          nodeInfo (CDefault _ nodeinfo) = nodeinfo+          nodeInfo (CExpr _ nodeinfo) = nodeinfo+          nodeInfo (CCompound _ _ nodeinfo) = nodeinfo+          nodeInfo (CIf _ _ _ nodeinfo) = nodeinfo+          nodeInfo (CSwitch _ _ nodeinfo) = nodeinfo+          nodeInfo (CWhile _ _ _ nodeinfo) = nodeinfo+          nodeInfo (CFor _ _ _ _ nodeinfo) = nodeinfo+          nodeInfo (CGoto _ nodeinfo) = nodeinfo+          nodeInfo (CGotoPtr _ nodeinfo) = nodeinfo+          nodeInfo (CCont nodeinfo) = nodeinfo+          nodeInfo (CBreak nodeinfo) = nodeinfo+          nodeInfo (CReturn _ nodeinfo) = nodeinfo+          nodeInfo (CAsm _ nodeinfo) = nodeinfo+instance Pos CStat+    where posOf x = posOfNode (nodeInfo x)++instance CNode CAsmStmt+    where nodeInfo (CAsmStmt _ _ _ _ _ nodeinfo) = nodeinfo+instance Pos CAsmStmt+    where posOf x = posOfNode (nodeInfo x)++instance CNode CAsmOperand+    where nodeInfo (CAsmOperand _ _ _ nodeinfo) = nodeinfo+instance Pos CAsmOperand+    where posOf x = posOfNode (nodeInfo x)++instance CNode CBlockItem+    where nodeInfo (CBlockStmt d) = nodeInfo d+          nodeInfo (CBlockDecl d) = nodeInfo d+          nodeInfo (CNestedFunDef d) = nodeInfo d+instance Pos CBlockItem+    where posOf x = posOfNode (nodeInfo x)++instance CNode CDeclSpec+    where nodeInfo (CStorageSpec d) = nodeInfo d+          nodeInfo (CTypeSpec d) = nodeInfo d+          nodeInfo (CTypeQual d) = nodeInfo d+instance Pos CDeclSpec+    where posOf x = posOfNode (nodeInfo x)++instance CNode CStorageSpec+    where nodeInfo (CAuto nodeinfo) = nodeinfo+          nodeInfo (CRegister nodeinfo) = nodeinfo+          nodeInfo (CStatic nodeinfo) = nodeinfo+          nodeInfo (CExtern nodeinfo) = nodeinfo+          nodeInfo (CTypedef nodeinfo) = nodeinfo+          nodeInfo (CThread nodeinfo) = nodeinfo+instance Pos CStorageSpec+    where posOf x = posOfNode (nodeInfo x)++instance CNode CTypeSpec+    where nodeInfo (CVoidType nodeinfo) = nodeinfo+          nodeInfo (CCharType nodeinfo) = nodeinfo+          nodeInfo (CShortType nodeinfo) = nodeinfo+          nodeInfo (CIntType nodeinfo) = nodeinfo+          nodeInfo (CLongType nodeinfo) = nodeinfo+          nodeInfo (CFloatType nodeinfo) = nodeinfo+          nodeInfo (CDoubleType nodeinfo) = nodeinfo+          nodeInfo (CSignedType nodeinfo) = nodeinfo+          nodeInfo (CUnsigType nodeinfo) = nodeinfo+          nodeInfo (CBoolType nodeinfo) = nodeinfo+          nodeInfo (CComplexType nodeinfo) = nodeinfo+          nodeInfo (CSUType _ nodeinfo) = nodeinfo+          nodeInfo (CEnumType _ nodeinfo) = nodeinfo+          nodeInfo (CTypeDef _ nodeinfo) = nodeinfo+          nodeInfo (CTypeOfExpr _ nodeinfo) = nodeinfo+          nodeInfo (CTypeOfType _ nodeinfo) = nodeinfo+instance Pos CTypeSpec+    where posOf x = posOfNode (nodeInfo x)++instance CNode CTypeQual+    where nodeInfo (CConstQual nodeinfo) = nodeinfo+          nodeInfo (CVolatQual nodeinfo) = nodeinfo+          nodeInfo (CRestrQual nodeinfo) = nodeinfo+          nodeInfo (CInlineQual nodeinfo) = nodeinfo+          nodeInfo (CAttrQual d) = nodeInfo d+instance Pos CTypeQual+    where posOf x = posOfNode (nodeInfo x)++instance CNode CStructUnion+    where nodeInfo (CStruct _ _ _ _ nodeinfo) = nodeinfo+instance Pos CStructUnion+    where posOf x = posOfNode (nodeInfo x)++instance CNode CEnum+    where nodeInfo (CEnum _ _ _ nodeinfo) = nodeinfo+instance Pos CEnum+    where posOf x = posOfNode (nodeInfo x)++instance CNode CInit+    where nodeInfo (CInitExpr _ nodeinfo) = nodeinfo+          nodeInfo (CInitList _ nodeinfo) = nodeinfo+instance Pos CInit+    where posOf x = posOfNode (nodeInfo x)++instance CNode CDesignator+    where nodeInfo (CArrDesig _ nodeinfo) = nodeinfo+          nodeInfo (CMemberDesig _ nodeinfo) = nodeinfo+          nodeInfo (CRangeDesig _ _ nodeinfo) = nodeinfo+instance Pos CDesignator+    where posOf x = posOfNode (nodeInfo x)++instance CNode CAttr+    where nodeInfo (CAttr _ _ nodeinfo) = nodeinfo+instance Pos CAttr+    where posOf x = posOfNode (nodeInfo x)++instance CNode CExpr+    where nodeInfo (CComma _ nodeinfo) = nodeinfo+          nodeInfo (CAssign _ _ _ nodeinfo) = nodeinfo+          nodeInfo (CCond _ _ _ nodeinfo) = nodeinfo+          nodeInfo (CBinary _ _ _ nodeinfo) = nodeinfo+          nodeInfo (CCast _ _ nodeinfo) = nodeinfo+          nodeInfo (CUnary _ _ nodeinfo) = nodeinfo+          nodeInfo (CSizeofExpr _ nodeinfo) = nodeinfo+          nodeInfo (CSizeofType _ nodeinfo) = nodeinfo+          nodeInfo (CAlignofExpr _ nodeinfo) = nodeinfo+          nodeInfo (CAlignofType _ nodeinfo) = nodeinfo+          nodeInfo (CComplexReal _ nodeinfo) = nodeinfo+          nodeInfo (CComplexImag _ nodeinfo) = nodeinfo+          nodeInfo (CIndex _ _ nodeinfo) = nodeinfo+          nodeInfo (CCall _ _ nodeinfo) = nodeinfo+          nodeInfo (CMember _ _ _ nodeinfo) = nodeinfo+          nodeInfo (CVar _ nodeinfo) = nodeinfo+          nodeInfo (CConst d) = nodeInfo d+          nodeInfo (CCompoundLit _ _ nodeinfo) = nodeinfo+          nodeInfo (CStatExpr _ nodeinfo) = nodeinfo+          nodeInfo (CLabAddrExpr _ nodeinfo) = nodeinfo+          nodeInfo (CBuiltinExpr d) = nodeInfo d+instance Pos CExpr+    where posOf x = posOfNode (nodeInfo x)++instance CNode CBuiltin+    where nodeInfo (CBuiltinVaArg _ _ nodeinfo) = nodeinfo+          nodeInfo (CBuiltinOffsetOf _ _ nodeinfo) = nodeinfo+          nodeInfo (CBuiltinTypesCompatible _ _ nodeinfo) = nodeinfo+instance Pos CBuiltin+    where posOf x = posOfNode (nodeInfo x)++instance CNode CConst+    where nodeInfo (CIntConst _ nodeinfo) = nodeinfo+          nodeInfo (CCharConst _ nodeinfo) = nodeinfo+          nodeInfo (CFloatConst _ nodeinfo) = nodeinfo+          nodeInfo (CStrConst _ nodeinfo) = nodeinfo+instance Pos CConst+    where posOf x = posOfNode (nodeInfo x)++instance CNode CStrLit+    where nodeInfo (CStrLit _ nodeinfo) = nodeinfo+instance Pos CStrLit+    where posOf x = posOfNode (nodeInfo x)
+ src/Language/C/Syntax/Constants.hs view
@@ -0,0 +1,281 @@+{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Syntax.Constants+-- Copyright   :  (c) 2007..2008 Duncan Coutts, Benedikt Huber+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : ghc+--+-- This module provides support for representing, checking and exporting c+-- constants, i.e. integral, float, character and string constants.+-----------------------------------------------------------------------------+module Language.C.Syntax.Constants (+  -- * Utilities+  escapeChar, unescapeChar, unescapeString,+  Flags(..), noFlags, setFlag, clearFlag, testFlag,+  -- * C char constants (and multi-character character constants)+  cChar, cChar_w, cChars, CChar(..), getCChar, getCCharAsInt, isWideChar, showCharConst,+  -- * C integral constants+  CIntFlag(..), CIntRepr(..), cInteger, CInteger(..), getCInteger,readCInteger,+  -- * C floating point constants+  cFloat,  CFloat(..), readCFloat,+  -- * C string literals+  cString, cString_w, CString(..), getCString, showStringLit, concatCStrings,+)+where+import Data.Bits+import Data.Char+import Numeric (showOct, showHex, readHex, readOct, readDec)+import Language.C.Data.Node+import Language.C.Data.Position+import Data.Generics++-- | C char constants (abstract)+data CChar = CChar+              {-# UNPACK #-} !Char+              {-# UNPACK #-} !Bool  -- wide flag+           | CChars+                              [Char] -- multi-character character constant+              {-# UNPACK #-} !Bool   -- wide flag+           deriving (Eq,Ord,Data,Typeable)++instance Show CChar where+    showsPrec _ (CChar c wideflag)   = _showWideFlag wideflag . showCharConst c+    showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . (sQuote $ concatMap escapeCChar cs)++-- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@.+-- If neccessary uses octal or hexadecimal escape sequences.+showCharConst :: Char -> ShowS+showCharConst c = sQuote $ escapeCChar c++_showWideFlag :: Bool -> ShowS+_showWideFlag flag = if flag then showString "L" else id++-- | get the haskell representation of a char constant+getCChar :: CChar -> [Char]+getCChar (CChar  c _)   = [c]+getCChar (CChars  cs _) = cs++-- | get integer value of a C char constant+-- undefined result for multi-char char constants+getCCharAsInt :: CChar -> Integer+getCCharAsInt (CChar c _) = fromIntegral (fromEnum c)+getCCharAsInt (CChars _cs _) = error "integer value of multi-character character constants is implementation defined"++-- | return @true@ if the character constant is /wide/.+isWideChar :: CChar -> Bool+isWideChar (CChar _ wideFlag) = wideFlag+isWideChar (CChars _ wideFlag) = wideFlag++-- | construct a character constant from a haskell 'Char'+-- Use 'cchar_w' if you want a wide character constant.+cChar :: Char -> CChar+cChar c = CChar c False++-- | construct a wide chararacter constant+cChar_w :: Char -> CChar+cChar_w c = CChar c True++-- | create a multi-character character constant+cChars :: [Char] -> Bool -> CChar+cChars = CChars++-- | datatype for memorizing the representation of an integer+data CIntRepr = DecRepr | HexRepr | OctalRepr deriving (Eq,Ord,Enum,Bounded,Data,Typeable)++-- | datatype representing type flags for integers+data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag deriving (Eq,Ord,Enum,Bounded,Data,Typeable)+instance Show CIntFlag where+    show FlagUnsigned = "u"+    show FlagLong = "L"+    show FlagLongLong = "LL"+    show FlagImag = "i"++{-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}+{-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}+{-# SPECIALIZE testFlag :: CIntFlag -> Flags CIntFlag -> Bool #-}++data CInteger = CInteger+                 {-# UNPACK #-} !Integer+                 {-# UNPACK #-} !CIntRepr+                 {-# UNPACK #-} !(Flags CIntFlag)  -- integer flags+                 deriving (Eq,Ord,Data,Typeable)+instance Show CInteger where+    showsPrec _ (CInteger i repr flags) = showInt i . showString (concatMap showIFlag [FlagUnsigned .. ]) where+        showIFlag f = if testFlag f flags then show f else []+        showInt i = case repr of DecRepr -> shows i+                                 OctalRepr -> showString "0" . showOct i+                                 HexRepr -> showString "0x" . showHex i++-- To be used in the lexer+-- Note that the flag lexer won't scale+readCInteger :: CIntRepr -> String -> Either String CInteger+readCInteger repr str =+  case readNum str of+    [(n,suffix)] -> mkCInt n suffix+    parseFailed  -> Left $ "Bad Integer literal: "++show parseFailed+  where+    readNum = case repr of DecRepr -> readDec; HexRepr -> readHex; OctalRepr -> readOct+    mkCInt n suffix = either Left (Right . CInteger n (repr' str))  $ readSuffix suffix+    repr' ('0':[]) = DecRepr -- hacking away lexer bug+    repr' _ = repr+    readSuffix = parseFlags noFlags+    parseFlags flags [] = Right flags+    parseFlags flags ('l':'l':fs) = parseFlags (setFlag FlagLongLong flags) fs+    parseFlags flags ('L':'L':fs) = parseFlags (setFlag FlagLongLong flags) fs+    parseFlags flags (f:fs) =+      let go1 flag = parseFlags (setFlag flag flags) fs in+      case f of+        'l' -> go1 FlagLong ; 'L' -> go1 FlagLong+        'u' -> go1 FlagUnsigned ; 'U' -> go1 FlagUnsigned+        'i' -> go1 FlagImag ; 'I' -> go1 FlagImag; 'j' -> go1 FlagImag; 'J' -> go1 FlagImag+        _ -> Left $ "Unexpected flag " ++ show f++getCInteger :: CInteger -> Integer+getCInteger (CInteger i _ _) = i++-- | construct a integer constant (without type flags) from a haskell integer+cInteger :: Integer -> CInteger+cInteger i = CInteger i DecRepr noFlags+++-- | Floats (represented as strings)+data CFloat = CFloat+                {-# UNPACK #-} !String+                 deriving (Eq,Ord,Data,Typeable)+instance Show CFloat where+  showsPrec _ (CFloat internal) = showString internal++cFloat :: Float -> CFloat+cFloat = CFloat . show++-- dummy implementation+readCFloat :: String -> CFloat+readCFloat = CFloat++-- | C String literals+data CString = CString+                [Char]    -- characters+                Bool      -- wide flag+                deriving (Eq,Ord,Data,Typeable)+instance Show CString where+    showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str++-- construction+cString :: String -> CString+cString str = CString str False+cString_w :: String -> CString+cString_w str = CString str True++-- selectors+getCString :: CString -> String+getCString (CString str _) = str+isWideString :: CString -> Bool+isWideString (CString _ wideflag) = wideflag++-- | concatenate a list of C string literals+concatCStrings :: [CString] -> CString+concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs)++-- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@.+-- If neccessary it uses octal or hexadecimal escape sequences.+showStringLit :: String -> ShowS+showStringLit = dQuote . concatMap showStringChar+  where+  showStringChar c | isSChar c = return c+                     | c == '"'  = "\\\""+                     | otherwise = escapeChar c++++-- | @isAsciiSourceChar b@ returns @True@ if the given character is a character which+--   may appear in a ASCII C source file and is printable.+isAsciiSourceChar :: Char -> Bool+isAsciiSourceChar c = isAscii c && isPrint c++-- | @isCChar c@ returns true, if c is a source character which does not have to be escaped in+--   C char constants (C99: 6.4.4.4)+isCChar :: Char -> Bool+isCChar '\\' = False+isCChar '\'' = False+isCChar '\n' = False+isCChar c = isAsciiSourceChar c++-- | @escapeCChar c@ escapes c for use in a char constant+escapeCChar :: Char -> String+escapeCChar '\'' = "\\'"+escapeCChar c | isCChar c = [c]+              | otherwise = escapeChar c++-- | @isSChar c@ returns true if c is a source character which does not have to be escaped in C string+--  literals (C99: 6.4.5)+isSChar :: Char -> Bool+isSChar '\\' = False+isSChar '\"' = False+isSChar '\n' = False+isSChar c = isAsciiSourceChar c++escapeChar :: Char -> String+escapeChar '\\' = "\\\\"+escapeChar '\a' = "\\a"+escapeChar '\b' = "\\b"+escapeChar '\ESC' = "\\e";+escapeChar '\f' = "\\f"+escapeChar '\n' = "\\n"+escapeChar '\r' = "\\r"+escapeChar '\t' = "\\t"+escapeChar '\v' = "\\v"+escapeChar c  | (ord c) < 512   = '\\' : showOct (ord c) ""+              | otherwise       = '\\' : 'x'  : showHex (ord c) ""++unescapeChar :: String -> (Char, String)+unescapeChar ('\\':c:cs)  = case c of+       'n'  -> ('\n', cs)+       't'  -> ('\t', cs)+       'v'  -> ('\v', cs)+       'b'  -> ('\b', cs)+       'r'  -> ('\r', cs)+       'f'  -> ('\f', cs)+       'a'  -> ('\a', cs)+       'e'  -> ('\ESC', cs)  -- GNU extension+       'E'  -> ('\ESC', cs)  -- GNU extension+       '\\' -> ('\\', cs)+       '?'  -> ('?', cs)+       '\'' -> ('\'', cs)+       '"'  -> ('"', cs)+       'x'  -> case head' "bad escape sequence" (readHex cs) of+                 (i, cs') -> (toEnum i, cs')+       _    -> case head' "bad escape sequence" (readOct (c:cs)) of+                 (i, cs') -> (toEnum i, cs')+unescapeChar (c   :cs)    = (c, cs)+unescapeChar []  = error $ "unescape char: empty string"++unescapeString :: String -> String+unescapeString [] = []+unescapeString cs = case unescapeChar cs of+                        (c, cs') -> c : unescapeString cs'++-- helpers+sQuote :: String -> ShowS+sQuote s t = "'" ++ s ++ "'" ++ t+dQuote :: String -> ShowS+dQuote s t = ('"' : s) ++ "\"" ++ t+head' :: String -> [a] -> a+head' err []  = error err+head' _ (x:_) = x++-- TODO: Move to seperate file ?+newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable)+noFlags :: Flags f+noFlags = Flags 0+setFlag :: (Enum f) => f -> Flags f -> Flags f+setFlag flag (Flags k)   = Flags$ k  `setBit` fromEnum flag+clearFlag :: (Enum f) => f -> Flags f -> Flags f+clearFlag flag (Flags k) = Flags$ k `clearBit` fromEnum flag+testFlag :: (Enum f) => f -> Flags f -> Bool+testFlag flag (Flags k)  = k `testBit` fromEnum flag+++
+ src/Language/C/Syntax/Ops.hs view
@@ -0,0 +1,113 @@+{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Syntax.Ops+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : ghc+--+-- Unary, binary and asssignment operators. Exported via AST.+-----------------------------------------------------------------------------+module Language.C.Syntax.Ops (+-- * Assignment operators+CAssignOp(..),+-- * Unary operators+CUnaryOp(..),+-- * Binary operators+CBinaryOp(..),+)+where+import Data.Generics+-- | C assignment operators (K&R A7.17)+data CAssignOp = CAssignOp+               | CMulAssOp+               | CDivAssOp+               | CRmdAssOp              -- ^ remainder and assignment+               | CAddAssOp+               | CSubAssOp+               | CShlAssOp+               | CShrAssOp+               | CAndAssOp+               | CXorAssOp+               | COrAssOp+               deriving (Eq, Ord,Data,Typeable)+instance Show CAssignOp where+  show CAssignOp = "="+  show CMulAssOp = "*="+  show CDivAssOp = "/="+  show CRmdAssOp = "%="+  show CAddAssOp = "+="+  show CSubAssOp = "-="+  show CShlAssOp = "<<="+  show CShrAssOp = ">>="+  show CAndAssOp = "&="+  show CXorAssOp = "^="+  show COrAssOp  = "|="++-- | C binary operators (K&R A7.6-15)+--+data CBinaryOp = CMulOp+               | CDivOp+               | CRmdOp                 -- ^ remainder of division+               | CAddOp+               | CSubOp+               | CShlOp                 -- ^ shift left+               | CShrOp                 -- ^ shift right+               | CLeOp                  -- ^ less+               | CGrOp                  -- ^ greater+               | CLeqOp                 -- ^ less or equal+               | CGeqOp                 -- ^ greater or equal+               | CEqOp                  -- ^ equal+               | CNeqOp                 -- ^ not equal+               | CAndOp                 -- ^ bitwise and+               | CXorOp                 -- ^ exclusive bitwise or+               | COrOp                  -- ^ inclusive bitwise or+               | CLndOp                 -- ^ logical and+               | CLorOp                 -- ^ logical or+               deriving (Eq,Ord,Data,Typeable)+instance Show CBinaryOp where+  show CMulOp = "*"+  show CDivOp = "/"+  show CRmdOp = "%"+  show CAddOp = "+"+  show CSubOp = "-"+  show CShlOp = "<<"+  show CShrOp = ">>"+  show CLeOp  = "<"+  show CGrOp  = ">"+  show CLeqOp = "<="+  show CGeqOp = ">="+  show CEqOp  = "=="+  show CNeqOp = "!="+  show CAndOp = "&"+  show CXorOp = "^"+  show COrOp  = "|"+  show CLndOp = "&&"+  show CLorOp = "||"++-- | C unary operator (K&R A7.3-4)+--+data CUnaryOp = CPreIncOp               -- ^ prefix increment operator+              | CPreDecOp               -- ^ prefix decrement operator+              | CPostIncOp              -- ^ postfix increment operator+              | CPostDecOp              -- ^ postfix decrement operator+              | CAdrOp                  -- ^ address operator+              | CIndOp                  -- ^ indirection operator+              | CPlusOp                 -- ^ prefix plus+              | CMinOp                  -- ^ prefix minus+              | CCompOp                 -- ^ one's complement+              | CNegOp                  -- ^ logical negation+              deriving (Eq,Ord,Data,Typeable)+instance Show CUnaryOp where+  show CPreIncOp  = "++"+  show CPreDecOp  = "--"+  show CPostIncOp = "++"+  show CPostDecOp = "--"+  show CAdrOp     = "&"+  show CIndOp     = "*"+  show CPlusOp    = "+"+  show CMinOp     = "-"+  show CCompOp    = "~"+  show CNegOp     = "!"
+ src/Language/C/System/GCC.hs view
@@ -0,0 +1,106 @@+{-# LANGUAGE PatternGuards #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.System.Gcc+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  experimental+-- Portability :  portable+--+-- Invoking gcc for preprocessing and compiling.+-----------------------------------------------------------------------------+module Language.C.System.GCC (+    GCC,newGCC,+)+where+import Language.C.Data.RList as RList+import Language.C.System.Preprocess+import Data.Maybe+import System.Cmd+import System.Directory+import Data.List++-- | @GCC@ represents a reference to the gcc compiler+newtype GCC = GCC { gccPath :: FilePath }++-- | create a reference to @gcc@+newGCC :: FilePath -> GCC+newGCC = GCC++instance Preprocessor GCC where+    parseCPPArgs _ = gccParseCPPArgs+    runCPP gcc cpp_args =+        do  -- copy the input to the outputfile, because in case the input is preprocessed,+            -- gcc -E will do nothing.+            maybe (return()) (copyFile (inputFile cpp_args)) (outputFile cpp_args)+            rawSystem (gccPath gcc) (buildCppArgs cpp_args)++-- | Parse arguments for preprocessing via GCC.+--   At least one .c, .hc or .h file has to be present.+--   For now we only support the most important gcc options.+--+--   1) Parse all flags relevant to CppArgs+--   2) Move -c,-S,-M? to other_args+--   3) Strip -E+--   4) The rest goes into extra_args+gccParseCPPArgs :: [String] -> Either String (CppArgs, [String])+gccParseCPPArgs args =+    case mungeArgs ((Nothing,Nothing,RList.empty),(RList.empty,RList.empty)) args of+        Left err                   -> Left err+        Right ((Nothing,_,_),_)  -> Left "No .c / .hc / .h source file given"+        Right ((Just input_file,output_file_opt,cpp_opts),(extra_args,other_args))+            -> Right ((rawCppArgs (RList.reverse extra_args) input_file)+                      { outputFile = output_file_opt, cppOptions = RList.reverse cpp_opts },+                      RList.reverse other_args)+    where+    mungeArgs :: ParseArgsState -> [String] -> Either String ParseArgsState+    mungeArgs parsed@( cpp_args@(inp,out,cpp_opts),+                          unparsed@(extra,other))+              unparsed_args =+        case unparsed_args of+            ("-E":rest) -> mungeArgs parsed rest++            (flag:rest) |  flag == "-c"+                        || flag == "-S"+                        || "-M" `isPrefixOf` flag+                        -> mungeArgs (cpp_args,(extra,other `snoc` flag)) rest++            ("-o":file:rest)   | isJust out -> Left "two output files given"+                               | otherwise          -> mungeArgs ((inp,Just file,cpp_opts),unparsed) rest++            (cpp_opt:rest)     | Just (opt,rest') <- getArgOpt cpp_opt rest+                               -> mungeArgs ((inp,out,cpp_opts `snoc` opt),unparsed) rest'++            (cfile:rest)       | any (flip isSuffixOf cfile) (words ".c .hc .h")+                               -> if isJust inp+                                   then Left "two input files given"+                                   else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest++            (unknown:rest)     -> mungeArgs (cpp_args,(extra `snoc` unknown,other)) rest++            []                 -> Right parsed++    getArgOpt cpp_opt rest | "-I" `isPrefixOf` cpp_opt = Just (IncludeDir (drop 2 cpp_opt),rest)+                           | "-U" `isPrefixOf` cpp_opt = Just (Undefine (drop 2 cpp_opt),rest)+                           | "-D" `isPrefixOf` cpp_opt = Just (getDefine (drop 2 cpp_opt),rest)+    getArgOpt "-include" (f:rest')                     = Just (IncludeFile f, rest')+    getArgOpt _ _ = Nothing+    getDefine opt = let (key,val) = break (== '=') opt in Define key (if null val then "" else tail val)++type ParseArgsState = ((Maybe FilePath, Maybe FilePath, RList CppOption), (RList String, RList String))+++buildCppArgs :: CppArgs -> [String]+buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) = do+       (concatMap tOption options)+    ++ outputFileOpt+    ++ ["-E", input_file]+    ++ extra_args+    where+    tOption (IncludeDir incl)  = ["-I",incl]+    tOption (Define key value) = [ "-D" ++ key ++ (if null value then "" else "=" ++ value) ]+    tOption (Undefine key)     = [ "-U" ++ key ]+    tOption (IncludeFile f)    = [ "-include", f]+    outputFileOpt = concat [ ["-o",output_file] | output_file <- maybeToList output_file_opt ]+
+ src/Language/C/System/Preprocess.hs view
@@ -0,0 +1,119 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Wrapper.Preprocess+-- Copyright   :  (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  :  benedikt.huber@gmail.com+-- Stability   :  experimental+-- Portability :  portable+--+-- Invoking external preprocessors.+-----------------------------------------------------------------------------+module Language.C.System.Preprocess (+    Preprocessor(..),+    CppOption(..),+    CppArgs(..),rawCppArgs,addCppOption,addExtraOption,+    runPreprocessor,+    isPreprocessed,+)+where+import Language.C.Data.InputStream+import System.Exit+import System.Directory+import System.FilePath+import System.Environment+import System.IO+import Control.Exception+import Control.Monad+import Data.List++-- | 'Preprocessor' encapsulates the abstract interface for invoking C preprocessors+class Preprocessor cpp where+    -- | parse the given command line arguments, and return a pair of parsed and ignored arguments+    parseCPPArgs :: cpp -> [String] -> Either String (CppArgs, [String])+    -- | run the preprocessor+    runCPP :: cpp -> CppArgs -> IO ExitCode++-- | file extension of a preprocessed file+preprocessedExt :: String+preprocessedExt = ".i"++-- | Generic Options for the preprocessor+data CppOption =+        IncludeDir FilePath+      | Define String String+      | Undefine String+      | IncludeFile FilePath++-- | Generic arguments for the preprocessor+data CppArgs = CppArgs {+        cppOptions :: [CppOption],+        extraOptions :: [String],+        cppTmpDir  :: Maybe FilePath,+        inputFile  :: FilePath,+        outputFile :: Maybe FilePath+    }++-- | use the given preprocessor arguments without analyzing them+rawCppArgs :: [String] -> FilePath -> CppArgs+rawCppArgs opts input_file =+    CppArgs { inputFile = input_file, cppOptions = [], extraOptions = opts, outputFile = Nothing, cppTmpDir = Nothing }++-- | add a typed option to the given preprocessor arguments+addCppOption :: CppArgs -> CppOption -> CppArgs+addCppOption cpp_args opt =+    cpp_args { cppOptions = opt : (cppOptions cpp_args) }++-- | add a string option to the given preprocessor arguments+addExtraOption :: CppArgs -> String -> CppArgs+addExtraOption cpp_args extra =+    cpp_args { extraOptions = extra : (extraOptions cpp_args) }++-- | run the preprocessor and return an 'InputStream' if preprocesssing succeeded+runPreprocessor :: (Preprocessor cpp) => cpp -> CppArgs -> IO (Either ExitCode InputStream)+runPreprocessor cpp cpp_args = do+    bracket+        getActualOutFile+        -- remove outfile if it was temporary+        removeTmpOutFile+        -- invoke preprocessor+        invokeCpp+    where+    getActualOutFile :: IO FilePath+    getActualOutFile = maybe (mkOutputFile (cppTmpDir cpp_args) (inputFile cpp_args)) return (outputFile cpp_args)+    invokeCpp actual_out_file = do+        exit_code <- runCPP cpp (cpp_args { outputFile = Just actual_out_file})+        case exit_code of+            ExitSuccess   -> liftM Right (readInputStream actual_out_file)+            ExitFailure _ -> return $ Left exit_code+    removeTmpOutFile out_file = maybe (removeFile out_file) (\_ -> return ()) (outputFile cpp_args)++-- | create an output file, given  @Maybe tmpdir@ and @inputfile@+mkOutputFile :: Maybe FilePath -> FilePath -> IO FilePath+mkOutputFile tmp_dir_opt input_file =+    do tmpDir <- getTempDir tmp_dir_opt+       mkTmpFile tmpDir (getOutputFileName input_file)+    where+    getTempDir (Just tmpdir) = return tmpdir+    getTempDir Nothing       = getTemporaryDirectory++-- | compute output file name from input file name+getOutputFileName :: FilePath -> FilePath+getOutputFileName fp | hasExtension fp = replaceExtension filename preprocessedExt+                     | otherwise       = addExtension filename preprocessedExt+    where+    filename = takeFileName fp++-- | create a temporary file+mkTmpFile :: FilePath -> FilePath -> IO FilePath+mkTmpFile tmp_dir file_templ = do+    -- putStrLn $ "TmpDir: "++tmp_dir+    -- putStrLn $ "FileTempl: "++file_templ+    (path,file_handle) <- openTempFile tmp_dir file_templ+    hClose file_handle+    return path++-- | guess whether a file is preprocessed (file end with .i)+isPreprocessed :: FilePath -> Bool+isPreprocessed = (".i" `isSuffixOf`)+