[jboss-svn-commits] JBL Code SVN: r29494 - in labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0: dd/grammar/flex and 13 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Sep 28 12:14:48 EDT 2009


Author: adinn
Date: 2009-09-28 12:14:47 -0400 (Mon, 28 Sep 2009)
New Revision: 29494

Added:
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/EntryCheckAdapter.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/EntryTriggerAdapter.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/bugfixes/TestThrowAction.txt
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/bugfixes/TestWaitAfterSignalWakeMustMeet.txt
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/javaops/TestArray.txt
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/bugfixes/TestThrowAction.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/bugfixes/TestWaitAfterSignalWakeMustMeet.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/helpers/TestWaitAfterSignalWakeMustMeetHelper.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/javaops/TestArray.java
Modified:
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/dd/grammar/cup/ECAGrammar.cup
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/dd/grammar/flex/ECAToken.flex
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/Location.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/LineCheckAdapter.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/RuleTriggerMethodAdapter.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/Event.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/Rule.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/RuleElement.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ArithmeticExpression.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ArrayExpression.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ExpressionHelper.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ReturnExpression.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/StringLiteral.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/StringPlusExpression.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ThrowExpression.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ECAGrammarParser.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ECATokenLexer.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ParseNode.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/PrintableSymbol.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/sym.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/type/Type.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/type/TypeGroup.java
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/build.xml
   labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/Test.java
Log:
backported fixes and unit tests for 1.0.3.CP01 -- fixes BYTEMAN-27, BYTEMAN-30, BYTEMAN-31, BYTEMAN-35, BYTEMAN-36, BYTEMAN-39

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/dd/grammar/cup/ECAGrammar.cup
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/dd/grammar/cup/ECAGrammar.cup	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/dd/grammar/cup/ECAGrammar.cup	2009-09-28 16:14:47 UTC (rev 29494)
@@ -80,45 +80,67 @@
 
   private String file = "";
   private int errorCount = 0;
+  private StringBuffer errorBuffer = new StringBuffer();
 
   public void setFile(String file)
   {
     this.file = file;
   }
 
-  public void error(String message, int line, int col)
-  {
-        errorCount++;
-        System.out.println(file + " line " + line + " : " + message);
-  }
-
-  /** Report a non fatal error (or warning).  This method takes a message
-   *  string and an additional object (to be used by specializations
-   *  implemented in subclasses).  Here in the base class a very simple
-   *  implementation is provided which simply prints the message to
-   *  System.err.
+  /**
+   * Called by the parser when it detects a syntax error. This is overridden so
+   * that it does nothing. Instead the parser relies upon explicit calls to routine
+   * error(String) or error(String, int line, int column) which store details of
+   * synatx errors into an error buffer for retrieval after the parse call completes.
    *
    * @param message an error message.
    * @param info    an extra object reserved for use by specialized subclasses.
    */
+
   public void report_error(String message, Object info)
   {
-      /*
-      if (info instanceof Symbol) {
-          Symbol sym = (Symbol)info;
-          System.err.println(message + " at line " + sym.left +  " character " + sym.right);
-      } else {
-          System.err.println(message);
+  }
+
+  /**
+   * Called by the parser when it is unable to recover from one or more syntax errors
+   *
+   * @param cur_token the token current at the point in the token stream where the recovery
+   * process fails
+   */
+
+  public void unrecovered_syntax_error(Symbol cur_token)
+  {
+      int line = cur_token.left;
+      errorCount++;
+      errorBuffer.append('\n');
+      errorBuffer.append(file);
+      if (line >= 0) {
+          errorBuffer.append(" line ");
+          errorBuffer.append(cur_token.left);
       }
-      */
+      errorBuffer.append(" : unable to recover from previous errors");
   }
 
   public void error(String message)
   {
         errorCount++;
-        System.out.println(file + " : " + message);
+        errorBuffer.append('\n');
+        errorBuffer.append(file);
+        errorBuffer.append(" : ");
+        errorBuffer.append(message);
   }
 
+  public void error(String message, int line, int col)
+  {
+        errorCount++;
+        errorBuffer.append('\n');
+        errorBuffer.append(file);
+        errorBuffer.append(" line ");
+        errorBuffer.append(line);
+        errorBuffer.append(" : ");
+        errorBuffer.append(message);
+  }
+
   public String getFile()
   {
     return file;
@@ -129,6 +151,11 @@
     return errorCount;
   }
 
+  public String getErrors()
+  {
+    return errorBuffer.toString();
+  }
+
   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
 
   /** Do debug output for a reduce.
@@ -274,6 +301,8 @@
 
 /* names and paths */
 
+non terminal ParseNode typename;
+non terminal Integer arraydims;
 non terminal ParseNode name;
 non terminal ParseNode simple_name;
 non terminal ParseNode path;
@@ -287,8 +316,6 @@
 non terminal ParseNode ca_error;
 non terminal ParseNode ca_error_in_condition;
 non terminal ParseNode ca_error_in_action;
-non terminal ParseNode action_expr_list_error_invalid_action;
-non terminal ParseNode expr_list_error_invalid_expr;
 
 /* precedences from weakest to tightest binding */
 
@@ -385,10 +412,28 @@
 // a bound symbol can optionally be specified to be of a particular type
 
 bind_sym
-	::=	simple_name:var COLON name:type {: RESULT = node(ParseNode.COLON, varleft, varright, var, type); :}
+	::=	simple_name:var COLON typename:type {: RESULT = node(ParseNode.COLON, varleft, varright, var, type); :}
 	|	simple_name:var {: RESULT = var; :}
 	;
 
+// a typename is a simple type or an array type
+typename
+    ::= name:t arraydims:d
+        {:
+            ParseNode tmp = t;
+            for (int i = 0; i < d; i++) {
+                tmp =  node(ParseNode.ARRAY, tleft, tright, tmp);
+            }
+            RESULT = tmp;
+        :}
+    | name:t {: RESULT = t; :}
+    ;
+
+arraydims
+    ::= LSQUARE RSQUARE arraydims:a {: RESULT = a + 1; :}
+    |   LSQUARE RSQUARE  {: RESULT =  1; :}
+    ;
+
 // a condition is simply an expression. it not type-constrained by the grammar.
 // it's easier to do the type checking after parsing  n.b. we always have at
 // least one condition as an empty (i.e. vacuously true) condition is defined
@@ -413,15 +458,8 @@
 	|	expr:e COMMA action_expr_list:ael
 		{: RESULT = node(ParseNode.SEMI, eleft, eright, e, ael); :}
 	|	action_expr:ae {: RESULT = ae; :}
-    |   action_expr_list_error_invalid_action:ael {: RESULT = ael; :}
 	;
 
-action_expr_list_error_invalid_action
-    ::= error action_expr_list:ael
-        {: error("invalid action", aelleft, aelright);
-           RESULT = ael; :}
-    ;
-
 action_expr
 	::=	expr:e {: RESULT = e; :}
 	| throw_return_expr:tre {: RESULT = tre; :}
@@ -440,17 +478,12 @@
 
 expr_list
 	::=	expr:e {: RESULT = e; :}
-	|	expr:e COMMA expr_list:el
+	|   expr:e COMMA expr_list:el
 		{: RESULT = node(ParseNode.COMMA, eleft, eright, e, el); :}
-	|	expr_list_error_invalid_expr:el {: RESULT = el; :}
+	|	expr:e SEMI expr_list:el
+		{: RESULT = node(ParseNode.COMMA, eleft, eright, e, el); :}
 	;
 
-expr_list_error_invalid_expr
-    ::= error COMMA:c expr_list:el
-		{: error("invalid expression", cleft, cright);
-		   RESULT = node(ParseNode.COMMA, cleft, cright, null, el); :}
-    ;
-
 expr
     ::= ternary_oper_expr:e {: RESULT = e; :}
     |	binary_oper_expr:e {: RESULT = e; :}
@@ -460,6 +493,7 @@
 	|	meth_expr:e {: RESULT = e; :}
 	|	simple_expr:e {: RESULT = e; :}
 	|	simple_name:n {: RESULT = n; :}
+	|   error:err expr:e {: error("invalid expression", errleft, errright); RESULT = e; :}
 	;
 
 ternary_oper_expr
@@ -502,6 +536,8 @@
 array_expr
 	::=	simple_expr:se array_idx_list:ail
 		{: RESULT = node(ParseNode.ARRAY, seleft, seright, se, ail); :}
+	|	simple_name:name array_idx_list:ail
+		{: RESULT = node(ParseNode.ARRAY, nameleft, nameright, name, ail); :}
 	|	field_expr:fe array_idx_list:ail
 		{: RESULT = node(ParseNode.ARRAY, feleft, feright, fe, ail); :}
 	|	meth_expr:me array_idx_list:ail
@@ -509,9 +545,9 @@
 	;
 
 array_idx_list
-	::=	array_idx:ai {: RESULT = ai; :}
-	|	array_idx:ai array_idx_list:ail
+	::=	array_idx:ai array_idx_list:ail
 		{: RESULT =  node(ParseNode.SEMI, aileft, airight, ai, ail); :}
+	|   array_idx:ai {: RESULT = ai; :}
 	;
 
 array_idx

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/dd/grammar/flex/ECAToken.flex
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/dd/grammar/flex/ECAToken.flex	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/dd/grammar/flex/ECAToken.flex	2009-09-28 16:14:47 UTC (rev 29494)
@@ -262,8 +262,8 @@
 \\			{ string.append('\\'); }
 
 /* anything else is an error! */
-\n			{ throw new Error("Newline in string <"+ yytext()+">"); }
-.			{ throw new Error("Illegal character in string <"+ yytext()+">"); }
+\n			{ throw new Error("File " + file + " line " + (yyline + startLine) + " : newline in string"); }
+.			{ throw new Error("File " + file + " line " + (yyline + startLine) + " : illegal character in string <"+ yytext()+">"); }
 }
 
 <QUOTEDIDENT> {
@@ -272,7 +272,7 @@
 			  return symbol(sym.IDENTIFIER,
 					string.toString()); }
 /* anything else is an error! */
-{LineTerminator}			{ throw new Error("Newline in quoted identifier <"+ yytext()+">"); }
+{LineTerminator}			{ throw new Error("File " + file + " line " + (yyline + startLine) + " : newline in quoted identifier"); }
 }
 
 <COMMENT> {

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/Location.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/Location.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/Location.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -120,9 +120,7 @@
          * @return the required adapter
          */
         public RuleCheckAdapter getRuleCheckAdapter(ClassVisitor cv, Rule rule, String targetClass, String targetMethod) {
-            // a line check adapter with line -1 will do the job
-
-            return new LineCheckAdapter(cv, rule, targetClass, targetMethod, -1);
+            return new EntryCheckAdapter(cv, rule, targetClass, targetMethod);
         }
 
         /**
@@ -131,9 +129,7 @@
          * @return the required adapter
          */
         public RuleTriggerAdapter getRuleAdapter(ClassVisitor cv, Rule rule, String targetClass, String targetMethod) {
-            // a line adapter with line -1 will do the job
-
-            return new LineTriggerAdapter(cv, rule, targetClass, targetMethod, -1);
+            return new EntryTriggerAdapter(cv, rule, targetClass, targetMethod);
         }
 
         public String toString() {

Added: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/EntryCheckAdapter.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/EntryCheckAdapter.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/EntryCheckAdapter.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -0,0 +1,89 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008-9, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*
+* @authors Andrew Dinn
+*/
+package org.jboss.byteman.agent.adapter;
+
+import org.objectweb.asm.*;
+import org.jboss.byteman.rule.Rule;
+
+/**
+ * asm Adapter class used to check that the target method for a rule exists in a class
+ */
+public class EntryCheckAdapter extends RuleCheckAdapter
+{
+    public EntryCheckAdapter(ClassVisitor cv, Rule rule, String targetClass, String targetMethod)
+    {
+        super(cv, rule, targetClass, targetMethod);
+    }
+
+    public MethodVisitor visitMethod(
+        final int access,
+        final String name,
+        final String desc,
+        final String signature,
+        final String[] exceptions)
+    {
+        MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
+        if (matchTargetMethod(name, desc)) {
+            return new EntryCheckMethodAdapter(mv, rule, access, name, desc, signature, exceptions);
+        }
+
+        return mv;
+    }
+
+    /**
+     * a method visitor used to add a rule event trigger call to a method
+     */
+
+    private class EntryCheckMethodAdapter extends RuleCheckMethodAdapter
+    {
+        private int access;
+        private String name;
+        private String descriptor;
+        private String signature;
+        private String[] exceptions;
+
+        EntryCheckMethodAdapter(MethodVisitor mv, Rule rule, int access, String name, String descriptor, String signature, String[] exceptions)
+        {
+            super(mv, rule, access, name, descriptor);
+            this.access = access;
+            this.name = name;
+            this.descriptor = descriptor;
+            this.signature = signature;
+            this.exceptions = exceptions;
+        }
+
+        public void visitCode() {
+            // any instruction counts as a trigger point
+            setTriggerPoint();
+        }
+
+        public void visitEnd()
+        {
+            if (checkBindings()) {
+                setVisitOk();
+            }
+            super.visitEnd();
+        }
+    }
+}
\ No newline at end of file

Added: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/EntryTriggerAdapter.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/EntryTriggerAdapter.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/EntryTriggerAdapter.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -0,0 +1,247 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008-9, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*
+* @authors Andrew Dinn
+*/
+package org.jboss.byteman.agent.adapter;
+
+import org.jboss.byteman.rule.Rule;
+import org.jboss.byteman.rule.type.TypeHelper;
+import org.jboss.byteman.agent.Transformer;
+import org.objectweb.asm.*;
+import org.objectweb.asm.commons.Method;
+
+/**
+ * asm Adapter class used to add a rule event trigger call to a method of som egiven class
+ */
+public class EntryTriggerAdapter extends RuleTriggerAdapter
+{
+    public EntryTriggerAdapter(ClassVisitor cv, Rule rule, String targetClass, String targetMethod)
+    {
+        super(cv, rule, targetClass, targetMethod);
+    }
+
+    public MethodVisitor visitMethod(
+        final int access,
+        final String name,
+        final String desc,
+        final String signature,
+        final String[] exceptions)
+    {
+        MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
+        if (matchTargetMethod(name, desc)) {
+            if (name.equals("<init>")) {
+                return new EntryTriggerConstructorAdapter(mv, rule, access, name, desc, signature, exceptions);
+            } else {
+                return new EntryTriggerMethodAdapter(mv, rule, access, name, desc, signature, exceptions);
+            }
+        }
+        return mv;
+    }
+
+    /**
+     * a method visitor used to add a rule event trigger call to a method
+     */
+
+    private class EntryTriggerMethodAdapter extends RuleTriggerMethodAdapter
+    {
+        private int access;
+        private String name;
+        private String descriptor;
+        private String signature;
+        private String[] exceptions;
+        private Label startLabel;
+        private Label endLabel;
+        protected boolean unlatched;
+        /**
+         * flag which says whether a trigger has been injected into this method
+         */
+        private boolean visited;
+
+        EntryTriggerMethodAdapter(MethodVisitor mv, Rule rule, int access, String name, String descriptor, String signature, String[] exceptions)
+        {
+            super(mv, rule, access, name, descriptor);
+            this.access = access;
+            this.name = name;
+            this.descriptor = descriptor;
+            this.signature = signature;
+            this.exceptions = exceptions;
+            this.unlatched = true;  // subclass can manipulate this to postponne visit
+            startLabel = null;
+            endLabel = null;
+            visited = false;
+        }
+
+        /**
+         * inject the rule trigger code
+         */
+        private void injectTriggerPoint()
+        {
+            // we need to set this here to avoid recursive re-entry into inject routine
+
+            visited = true;
+            rule.setTypeInfo(targetClass, access, name, descriptor, exceptions);
+            String key = rule.getKey();
+            Type ruleType = Type.getType(TypeHelper.externalizeType("org.jboss.byteman.rule.Rule"));
+            Method method = Method.getMethod("void execute(String, Object, Object[])");
+            // we are at the relevant line in the method -- so add a trigger call here
+            if (Transformer.isVerbose()) {
+                System.out.println("AccessTriggerMethodAdapter.visitLineNumber : inserting trigger for " + rule.getName());
+            }
+            startLabel = newLabel();
+            endLabel = newLabel();
+            visitTriggerStart(startLabel);
+            push(key);
+            if ((access & Opcodes.ACC_STATIC) == 0) {
+                loadThis();
+            } else {
+                push((Type)null);
+            }
+            doArgLoad();
+            invokeStatic(ruleType, method);
+            visitTriggerEnd(endLabel);
+        }
+
+        // we need to override each visitXXXINsn operation so we see each instruction being generated. we
+        // inject a trigger point as soon as possible.
+        
+        @Override
+        public void visitInsn(int opcode) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitInsn(opcode);
+        }
+
+        @Override
+        public void visitIincInsn(int var, int increment) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitIincInsn(var, increment);
+        }
+
+        @Override
+        public void visitIntInsn(int opcode, int operand) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitIntInsn(opcode, operand);
+        }
+
+        @Override
+        public void visitLdcInsn(Object cst) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitLdcInsn(cst);
+        }
+
+        @Override
+        public void visitVarInsn(int opcode, int var) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitVarInsn(opcode, var);
+        }
+
+        @Override
+        public void visitTypeInsn(int opcode, String desc) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitTypeInsn(opcode, desc);
+        }
+
+        @Override
+        public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitFieldInsn(opcode, owner, name, desc);
+        }
+
+        @Override
+        public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitMethodInsn(opcode, owner, name, desc);
+        }
+
+        @Override
+        public void visitJumpInsn(int opcode, Label label) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitJumpInsn(opcode, label);
+        }
+
+        @Override
+        public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitTableSwitchInsn(min, max, dflt, labels);
+        }
+
+        @Override
+        public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitLookupSwitchInsn(dflt, keys, labels);
+        }
+
+        @Override
+        public void visitMultiANewArrayInsn(String desc, int dims) {
+            if (unlatched && !visited) {
+                injectTriggerPoint();
+            }
+            super.visitMultiANewArrayInsn(desc, dims);
+        }
+    }
+
+    /**
+     * a method visitor used to add a rule event trigger call to a constructor -- this has to make sure
+     * the super constructor has been called before allowing a trigger call to be compiled
+     */
+
+    private class EntryTriggerConstructorAdapter extends EntryTriggerMethodAdapter
+    {
+        EntryTriggerConstructorAdapter(MethodVisitor mv, Rule rule, int access, String name, String descriptor, String signature, String[] exceptions)
+        {
+            super(mv, rule, access, name, descriptor, signature, exceptions);
+            this.unlatched = false;
+        }
+
+        public void visitMethodInsn(
+            final int opcode,
+            final String owner,
+            final String name,
+            final String desc)
+        {
+            super.visitMethodInsn(opcode, owner, name, desc);
+            // hmm, this probably means the super constructor has been invoked :-)
+            unlatched |= (opcode == Opcodes.INVOKESPECIAL);
+        }
+    }
+}
\ No newline at end of file

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/LineCheckAdapter.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/LineCheckAdapter.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/LineCheckAdapter.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -63,7 +63,6 @@
         private String descriptor;
         private String signature;
         private String[] exceptions;
-        private boolean visited;
 
         LineCheckMethodAdapter(MethodVisitor mv, Rule rule, int access, String name, String descriptor, String signature, String[] exceptions)
         {
@@ -73,13 +72,13 @@
             this.descriptor = descriptor;
             this.signature = signature;
             this.exceptions = exceptions;
-            this.visited = false;
+            visitedLine = false;
         }
 
         public void visitLineNumber(final int line, final Label start) {
-            if (!visited && (targetLine <= line)) {
+            if (!visitedLine && (targetLine <= line)) {
                 // the relevant line occurs in the called method
-                visited = true;
+                visitedLine = true;
                 setTriggerPoint();
             }
             super.visitLineNumber(line, start);
@@ -95,4 +94,5 @@
     }
 
     private int targetLine;
+    private boolean visitedLine;
 }
\ No newline at end of file

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/RuleTriggerMethodAdapter.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/RuleTriggerMethodAdapter.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/agent/adapter/RuleTriggerMethodAdapter.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -664,7 +664,7 @@
             invokeVirtual(Type.getType(PrintStream.class), Method.getMethod("void println(String)"));
         }
         // rethrow an execute exception
-        throwException(EXECUTE_EXCEPTION_TYPE, rule.getName() + " execution exception ");
+        throwException();
 
         super.visitMaxs(maxStack, maxLocals);
 

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/Event.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/Event.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/Event.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -221,7 +221,7 @@
     {
         int tag = varTree.getTag();
 
-        // we expect either (COLON IDENTIFIER IDENTIFIER) or IDENTIFIER
+        // we expect either (COLON IDENTIFIER TYPE) or IDENTIFIER
         switch (tag) {
             case IDENTIFIER:
             {
@@ -233,11 +233,10 @@
                 ParseNode child1 = (ParseNode)varTree.getChild(1);
                 if (child0.getTag() != IDENTIFIER) {
                     throw new TypeException("Event.createBindings : unexpected token type in variable declaration" + child0.getTag() + " for token " + child0.getText() + child0.getPos());
-                } else if (child1.getTag() != IDENTIFIER) {
+                } else if (child1.getTag() != IDENTIFIER && child1.getTag() != ARRAY) {
                     throw new TypeException("Event.createBindings : unexpected token Type in variable type declaration" + child1.getTag()  + " for token " + child1.getText() + child1.getPos());
                 }
-                String typeName = child1.getText();
-                Type type = getTypeGroup().create(typeName);
+                Type type = getBindingType(child1);
                 if (type == null) {
                     throw new TypeException("Event.createBindings : incompatible type in declaration of variable " + child1.getText() + child1.getPos());
                 }
@@ -250,6 +249,38 @@
         }
     }
 
+    /**
+     * create and return a type for a binding or return null if the type cannot be created
+     * @param typeTree
+     * @return the binding type or null
+     */
+    private Type getBindingType(ParseNode typeTree)
+    {
+        int tag = typeTree.getTag();
+        // we expect either TYPE = (IDENTIFIER) or (ARRAY TYPE)
+        switch (tag) {
+            case IDENTIFIER:
+            {
+                String typeName = typeTree.getText();
+                return getTypeGroup().create(typeName);
+            }
+            case ARRAY:
+            {
+                ParseNode child0 = (ParseNode)typeTree.getChild(0);
+                Type baseType = getBindingType(child0);
+                if (baseType != null) {
+                    return getTypeGroup().createArray(baseType);
+                } else {
+                    return null;
+                }
+            }
+            default:
+            {
+                return null;
+            }
+        }
+    }
+
     public Object interpret(HelperAdapter helper)
             throws ExecuteException
     {

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/Rule.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/Rule.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/Rule.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -68,27 +68,6 @@
      */
     private ClassLoader loader;
     /**
-     * the name of the target class for this rule supplied in the rule script
-     */
-    private String targetClass;
-    /**
-     * the name of the triggering method on the target class for this rule supplied in the
-     * rule script
-     */
-    private String targetMethod;
-    /**
-     * the location at which the rule trigger point is attached
-     */
-    private Location targetLocation;
-    /**
-     * the line number for the start of the parseable rule text (the BIND clause)
-     */
-    private int line;
-    /**
-     * the name of the file which contains this rule
-     */
-    private String file;
-    /**
      * the parsed event derived from the script for this rule
      */
     private Event event;
@@ -183,21 +162,30 @@
         triggerDescriptor = null;
         triggerAccess = 0;
         returnType = null;
+        ECAGrammarParser parser = null;
         try {
+            String file = getFile();
             ECATokenLexer lexer = new ECATokenLexer(new StringReader(ruleScript.getRuleText()));
             lexer.setStartLine(getLine());
-            lexer.setFile(getFile());
-            ECAGrammarParser parser = new ECAGrammarParser(lexer);
+            lexer.setFile(file);
+            parser = new ECAGrammarParser(lexer);
             parser.setFile(file);
             Symbol parse = (debugParse ? parser.debug_parse() : parser.parse());
             if (parser.getErrorCount() != 0) {
-                throw new ParseException("org.jboss.byteman.rule.Rule : error parsing rule\n" + ruleScript.getRuleText());
+                String message = "rule " + ruleScript.getName();
+                message += parser.getErrors();
+                throw new ParseException(message);
             }
             ruleTree = (ParseNode) parse.value;
         } catch (ParseException pe) {
             throw pe;
-        } catch (Exception e) {
-            throw new ParseException("org.jboss.byteman.rule.Rule : error parsing rule\n" + ruleScript.getRuleText(), e);
+        } catch (Throwable th) {
+            String message = "rule " + ruleScript.getName();
+            if (parser != null && parser.getErrorCount() != 0) {
+                message += parser.getErrors();
+            }
+            message += "\n" + th.getMessage();
+            throw new ParseException(message);
         }
 
         ParseNode eventTree = (ParseNode)ruleTree.getChild(0);
@@ -370,7 +358,7 @@
                 PrintWriter writer = new PrintWriter(stringWriter);
                 writer.println("Rule.ensureTypeCheckedCompiled : error type checking rule " + getName());
                 te.printStackTrace(writer);
-                detail = writer.toString();
+                detail = stringWriter.toString();
                 System.out.println(detail);
             } catch (CompileException ce) {
                 checkFailed = true;
@@ -378,6 +366,8 @@
                 PrintWriter writer = new PrintWriter(stringWriter);
                 writer.println("Rule.ensureTypeCheckedCompiled : error compiling rule " + getName());
                 ce.printStackTrace(writer);
+                detail = stringWriter.toString();
+                System.out.println(detail);
             }
 
             ruleScript.recordCompile(triggerClass, loader, !checkFailed, detail);
@@ -572,7 +562,7 @@
                 throw e;
             } catch (Throwable throwable) {
                 System.out.println(getName() + " : " + throwable);
-                throw new ExecuteException(getName() + " unknnown error : " + throwable, throwable);
+                throw new ExecuteException(getName() + "  : caught " + throwable, throwable);
             }
         }
     }

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/RuleElement.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/RuleElement.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/RuleElement.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -33,6 +33,7 @@
 import org.jboss.byteman.rule.helper.HelperAdapter;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Label;
 
 import java.io.StringWriter;
 
@@ -204,8 +205,20 @@
     {
         assert toType == Type.STRING;
         if (fromType.isObject() || fromType.isArray()) {
-            // use the toString method
+            // use the toString method if the object is non null otherwise just replace it with null
+            Label elseLabel = new Label();
+            Label endLabel = new Label();
+            // if (object == null)
+            mv.visitInsn(Opcodes.DUP);
+            mv.visitJumpInsn(Opcodes.IFNONNULL, elseLabel);
+            // then string = "null"
+            mv.visitInsn(Opcodes.POP);
+            mv.visitLdcInsn("null");
+            mv.visitJumpInsn(Opcodes.GOTO, endLabel);
+            // else string = object.toString()
+            mv.visitLabel(elseLabel);
             mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;");
+            mv.visitLabel(endLabel);
         } else if (fromType == Type.Z) {
             // use the toString method
             mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Boolean", "toString", "(Z)Ljava/lang/String;");

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ArithmeticExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ArithmeticExpression.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ArithmeticExpression.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -283,8 +283,8 @@
         operand0.compile(mv, currentStackHeights, maxStackHeights);
         // do any required type conversion
         compileTypeConversion(type0, type, mv, currentStackHeights, maxStackHeights);
-        // compile lhs -- it adds 1 or 2 to the stack height
-        currentStackHeights.addStackCount((type0.getNBytes() > 4 ? 2 : 1));
+        // compile rhs -- it adds 1 or 2 to the stack height
+        operand1.compile(mv, currentStackHeights, maxStackHeights);
         // do any required type conversion
         compileTypeConversion(type1, type, mv, currentStackHeights, maxStackHeights);
 
@@ -419,7 +419,7 @@
 
         // check stack heights
         if (currentStackHeights.stackCount != currentStack + expectedStack) {
-            throw new CompileException("ArithmeticExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + currentStack + expectedStack);
+            throw new CompileException("ArithmeticExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + (currentStack + expectedStack));
         }
 
         // we needed room for 2 * expectedStack extra values on the stack -- make sure we got it

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ArrayExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ArrayExpression.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ArrayExpression.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -143,7 +143,7 @@
             // make sure the index is an integer
             compileTypeConversion(idxExpr.getType(), Type.I, mv, currentStackHeights, maxStackHeights);
 
-            if (valueType.isObject()) {
+            if (valueType.isObject() || valueType.isArray()) {
                 // compile load object - pops 2 and adds 1
                 mv.visitInsn(Opcodes.AALOAD);
                 expected = 1;
@@ -176,18 +176,16 @@
                 mv.visitInsn(Opcodes.DALOAD);
                 expected = 2;
             }
-            currentStackHeights.addStackCount(-2);
+            currentStackHeights.addStackCount(expected - 2);
             if (iterator.hasNext()) {
                 assert valueType.isArray();
                 valueType =valueType.getBaseType();
             }
         }
-        // the last value for expected is how many bytes extra should be on the stack
-        currentStackHeights.addStackCount(expected);
 
         // check stack height
         if (currentStackHeights.stackCount != currentStack + expected) {
-            throw new CompileException("ArrayExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + currentStack + expected);
+            throw new CompileException("ArrayExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + (currentStack + expected));
         }
 
         // we needed room for an aray and an index or for a one or two word result

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ExpressionHelper.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ExpressionHelper.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ExpressionHelper.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -54,6 +54,7 @@
         //                   (UNARYOP unary_oper expr) |
         //                   (BINOP infix_oper expr exp) |
         //                   (TERNOP simple_expr expr expr)
+        //                   (ARRAY typename)
         //                   (ARRAY expr expr_list)
         //                   (FIELD expr simple_name)
         //                   (METH simple_name expr expr_list)

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ReturnExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ReturnExpression.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ReturnExpression.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -168,7 +168,7 @@
 
     public void compile(MethodVisitor mv, StackHeights currentStackHeights, StackHeights maxStackHeights) throws CompileException
     {
-        Type returnType = (returnValue == null ? Type.VOID : returnValue.getType());
+        Type valueType = (returnValue == null ? Type.VOID : returnValue.getType());
         int currentStack = currentStackHeights.stackCount;
         int expected = 1;
         int extraSlots = 0;
@@ -193,13 +193,17 @@
         // stack any required return value or null -- adds 1 to stack but may use 2 slots
         if (returnValue != null) {
             returnValue.compile(mv, currentStackHeights, maxStackHeights);
-            if (returnType.isPrimitive()) {
+            // we may need to convert from the value type to the return type
+            if (valueType != type) {
+                compileTypeConversion(valueType, type,  mv, currentStackHeights, maxStackHeights);
+            }
+            if (type.isPrimitive()) {
                 // if the intermediate value used 2 words then at the peak we needed an extra stack slot
-                if (returnType.getNBytes() > 4) {
+                if (valueType.getNBytes() > 4) {
                     extraSlots++;
                 }
                 // we need an object not a primitive
-                compileBox(Type.boxType(returnType), mv, currentStackHeights, maxStackHeights);
+                compileBox(Type.boxType(type), mv, currentStackHeights, maxStackHeights);
             }
         } else {
             // just push null

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/StringLiteral.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/StringLiteral.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/StringLiteral.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -43,8 +43,9 @@
     public StringLiteral(Rule rule, ParseNode token)
     {
         super(rule, Type.STRING, token);
+        String string = ((String)token.getChild(0));
 
-        this.text = token.getText().intern();
+        this.text = string.intern();
     }
 
     /**

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/StringPlusExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/StringPlusExpression.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/StringPlusExpression.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -33,6 +33,7 @@
 import org.jboss.byteman.rule.grammar.ParseNode;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Label;
 
 /**
  * A binary string concatenation operator expression
@@ -60,7 +61,7 @@
         Object value1 = getOperand(0).interpret(helper);
         Object value2 = getOperand(1).interpret(helper);
         String string1 = value1.toString();
-        String string2 = value2.toString();
+        String string2 = (value2 == null ? "null" : value2.toString());
         return string1 + string2;
     }
 
@@ -72,7 +73,9 @@
         int currentStack = currentStackHeights.stackCount;
         int expected = 2;
 
-        // compile and type convert each operand
+        // compile and type convert each operand n.b. the type conversion will ensure that
+        // null operands are replaced with "null"
+        
         oper0.compile(mv, currentStackHeights, maxStackHeights);
         compileTypeConversion(oper0.getType(), type, mv, currentStackHeights, maxStackHeights);
         oper1.compile(mv, currentStackHeights, maxStackHeights);
@@ -82,6 +85,7 @@
         // by employing a StringBuffer but for now we will just evaluate the left and right operand and
         // then call concat to join them
         // add two strings leaving one string
+
         expected = 1;
         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "concat", "(Ljava/lang/String;)Ljava/lang/String;");
 

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ThrowExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ThrowExpression.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/expression/ThrowExpression.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -279,7 +279,6 @@
             int paramCount = (paramType.getNBytes() > 4 ? 2 : 1);
 
             // track extra storage used after type conversion
-            currentStackHeights.addStackCount(paramCount);
             extraParams += (paramCount);
             arguments.get(i).compile(mv, currentStackHeights, maxStackHeights);
             compileTypeConversion(argType, paramType, mv, currentStackHeights, maxStackHeights);
@@ -291,10 +290,26 @@
         // modify the stack height to account for the removed exception and params
         currentStackHeights.addStackCount(-(extraParams+1));
 
-        // we should only have the thrown exception on the stack
         if (currentStackHeights.stackCount != currentStack + expected) {
             throw new CompileException("ThrowExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + (currentStack + expected));
         }
+        // now create a ThrowException to wrap the user exception
+        // create the thrown exception instance -- adds 1 to stack [UE] --> [UE, THE]
+        exceptionClassName = "org/jboss/byteman/rule/exception/ThrowException";
+        mv.visitTypeInsn(Opcodes.NEW, exceptionClassName);
+        currentStackHeights.addStackCount(1);
+        // copy the ThrowException so we can init it [UE, THE] --> [THE, UE, THE]
+        mv.visitInsn(Opcodes.DUP_X1);
+        currentStackHeights.addStackCount(1);
+        // reverse the order of the top two words  [THE, UE, THE] --> [THE, THE, UE]
+        mv.visitInsn(Opcodes.SWAP);
+        // construct the exception [THE, THE, UE] --> [UE]
+        mv.visitMethodInsn(Opcodes.INVOKESPECIAL, exceptionClassName, "<init>", "(Ljava/lang/Throwable;)V");
+        // we should now have just the ThrowException on the stack
+        currentStackHeights.addStackCount(-2);
+        if (currentStackHeights.stackCount != currentStack + expected) {
+            throw new CompileException("ThrowExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + (currentStack + expected));
+        }
 
         // now throw the exception and decrement the stack height
 

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ECAGrammarParser.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ECAGrammarParser.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ECAGrammarParser.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -1,7 +1,7 @@
 
 //----------------------------------------------------
 // The following code was generated by CUP v0.10k
-// Tue Sep 01 15:26:43 BST 2009
+// Mon Sep 28 17:05:29 BST 2009
 //----------------------------------------------------
 
 package org.jboss.byteman.rule.grammar;
@@ -10,7 +10,7 @@
 import org.jboss.byteman.rule.grammar.ParseNode;
 
 /** CUP v0.10k generated parser.
-  * @version Tue Sep 01 15:26:43 BST 2009
+  * @version Mon Sep 28 17:05:29 BST 2009
   */
 public class ECAGrammarParser extends java_cup.runtime.lr_parser {
 
@@ -23,40 +23,41 @@
   /** Production table. */
   protected static final short _production_table[][] = 
     unpackFromStrings(new String[] {
-    "\000\153\000\002\003\003\000\002\002\004\000\002\003" +
-    "\003\000\002\004\010\000\002\004\003\000\002\037\003" +
-    "\000\002\037\003\000\002\037\003\000\002\050\002\000" +
-    "\002\040\011\000\002\051\002\000\002\041\011\000\002" +
-    "\042\010\000\002\005\006\000\002\005\003\000\002\043" +
-    "\003\000\002\043\003\000\002\052\002\000\002\044\007" +
-    "\000\002\045\006\000\002\006\003\000\002\006\003\000" +
+    "\000\156\000\002\003\003\000\002\002\004\000\002\003" +
+    "\003\000\002\004\010\000\002\004\003\000\002\041\003" +
+    "\000\002\041\003\000\002\041\003\000\002\050\002\000" +
+    "\002\042\011\000\002\051\002\000\002\043\011\000\002" +
+    "\044\010\000\002\005\006\000\002\005\003\000\002\045" +
+    "\003\000\002\045\003\000\002\052\002\000\002\046\007" +
+    "\000\002\047\006\000\002\006\003\000\002\006\003\000" +
     "\002\007\005\000\002\007\005\000\002\007\003\000\002" +
-    "\010\005\000\002\011\005\000\002\011\003\000\002\012" +
-    "\003\000\002\013\003\000\002\013\003\000\002\014\005" +
-    "\000\002\014\005\000\002\014\003\000\002\014\003\000" +
-    "\002\046\004\000\002\015\003\000\002\015\003\000\002" +
-    "\016\003\000\002\016\004\000\002\016\006\000\002\016" +
-    "\007\000\002\017\003\000\002\017\005\000\002\017\003" +
-    "\000\002\047\005\000\002\020\003\000\002\020\003\000" +
+    "\010\005\000\002\011\005\000\002\011\003\000\002\034" +
+    "\004\000\002\034\003\000\002\035\005\000\002\035\004" +
+    "\000\002\012\003\000\002\013\003\000\002\013\003\000" +
+    "\002\014\005\000\002\014\005\000\002\014\003\000\002" +
+    "\015\003\000\002\015\003\000\002\016\003\000\002\016" +
+    "\004\000\002\016\006\000\002\016\007\000\002\017\003" +
+    "\000\002\017\005\000\002\017\005\000\002\020\003\000" +
     "\002\020\003\000\002\020\003\000\002\020\003\000\002" +
-    "\020\003\000\002\020\003\000\002\020\003\000\002\021" +
-    "\007\000\002\022\005\000\002\022\005\000\002\022\005" +
+    "\020\003\000\002\020\003\000\002\020\003\000\002\020" +
+    "\003\000\002\020\004\000\002\021\007\000\002\022\005" +
     "\000\002\022\005\000\002\022\005\000\002\022\005\000" +
     "\002\022\005\000\002\022\005\000\002\022\005\000\002" +
     "\022\005\000\002\022\005\000\002\022\005\000\002\022" +
     "\005\000\002\022\005\000\002\022\005\000\002\022\005" +
-    "\000\002\023\004\000\002\023\004\000\002\023\004\000" +
-    "\002\024\004\000\002\024\004\000\002\024\004\000\002" +
-    "\032\003\000\002\032\004\000\002\033\005\000\002\025" +
-    "\005\000\002\025\003\000\002\026\005\000\002\026\005" +
-    "\000\002\026\005\000\002\027\005\000\002\027\006\000" +
-    "\002\027\007\000\002\027\010\000\002\027\003\000\002" +
-    "\030\007\000\002\030\010\000\002\030\007\000\002\030" +
-    "\010\000\002\030\007\000\002\030\010\000\002\031\003" +
-    "\000\002\031\003\000\002\031\003\000\002\031\003\000" +
-    "\002\031\003\000\002\031\005\000\002\034\003\000\002" +
-    "\034\005\000\002\035\003\000\002\036\003\000\002\036" +
-    "\005" });
+    "\000\002\022\005\000\002\022\005\000\002\023\004\000" +
+    "\002\023\004\000\002\023\004\000\002\024\004\000\002" +
+    "\024\004\000\002\024\004\000\002\024\004\000\002\032" +
+    "\004\000\002\032\003\000\002\033\005\000\002\025\005" +
+    "\000\002\025\003\000\002\026\005\000\002\026\005\000" +
+    "\002\026\005\000\002\027\005\000\002\027\006\000\002" +
+    "\027\007\000\002\027\010\000\002\027\003\000\002\030" +
+    "\007\000\002\030\010\000\002\030\007\000\002\030\010" +
+    "\000\002\030\007\000\002\030\010\000\002\031\003\000" +
+    "\002\031\003\000\002\031\003\000\002\031\003\000\002" +
+    "\031\003\000\002\031\005\000\002\036\003\000\002\036" +
+    "\005\000\002\037\003\000\002\040\003\000\002\040\005" +
+    "" });
 
   /** Access to production table. */
   public short[][] production_table() {return _production_table;}
@@ -64,413 +65,430 @@
   /** Parse-action table. */
   protected static final short[][] _action_table = 
     unpackFromStrings(new String[] {
-    "\000\267\000\006\004\015\005\014\001\002\000\004\002" +
+    "\000\272\000\006\004\015\005\014\001\002\000\004\002" +
     "\ufffb\001\002\000\004\002\ufff1\001\002\000\004\002\ufff2" +
     "\001\002\000\004\002\001\001\002\000\004\002\ufffc\001" +
     "\002\000\004\002\ufffd\001\002\000\004\002\uffff\001\002" +
-    "\000\004\002\ufffa\001\002\000\030\003\262\012\054\042" +
-    "\063\044\050\045\053\047\047\050\071\051\065\052\051" +
-    "\053\056\054\037\001\002\000\010\003\021\007\022\054" +
+    "\000\004\002\ufffa\001\002\000\030\003\265\012\061\042" +
+    "\070\044\055\045\060\047\054\050\077\051\073\052\056" +
+    "\053\063\054\040\001\002\000\010\003\021\007\022\054" +
     "\023\001\002\000\004\002\ufff3\001\002\000\004\002\020" +
     "\001\002\000\004\002\000\001\002\000\004\005\ufff9\001" +
-    "\002\000\004\005\uffed\001\002\000\074\002\uff99\005\uff99" +
-    "\006\uff99\012\uff99\013\uff99\014\uff99\015\uff99\016\uff99\017" +
-    "\uff99\020\uff99\021\uff99\022\uff99\023\uff99\024\uff99\025\uff99" +
-    "\026\uff99\027\uff99\030\uff99\031\uff99\032\uff99\033\uff99\034" +
-    "\uff99\035\uff99\036\uff99\037\uff99\040\uff99\041\uff99\042\uff99" +
-    "\043\uff99\001\002\000\004\005\217\001\002\000\004\021" +
-    "\044\001\002\000\006\021\uffe6\023\035\001\002\000\010" +
+    "\002\000\004\005\uffed\001\002\000\074\002\uff96\005\uff96" +
+    "\006\uff96\012\uff96\013\uff96\014\uff96\015\uff96\016\uff96\017" +
+    "\uff96\020\uff96\021\uff96\022\uff96\023\uff96\024\uff96\025\uff96" +
+    "\026\uff96\027\uff96\030\uff96\031\uff96\032\uff96\033\uff96\034" +
+    "\uff96\035\uff96\036\uff96\037\uff96\040\uff96\041\uff96\042\uff96" +
+    "\043\uff96\001\002\000\004\005\225\001\002\000\004\021" +
+    "\051\001\002\000\006\021\uffe6\023\035\001\002\000\010" +
     "\005\uffe9\016\032\017\031\001\002\000\004\005\uffec\001" +
     "\002\000\004\054\023\001\002\000\004\054\023\001\002" +
     "\000\004\005\uffea\001\002\000\004\005\uffeb\001\002\000" +
-    "\004\054\037\001\002\000\004\021\uffe7\001\002\000\072" +
-    "\002\uff99\005\uff99\006\uff99\012\uff99\013\uff99\015\uff99\016" +
-    "\uff99\017\uff99\020\uff98\021\uff99\022\uff99\023\uff99\024\uff99" +
-    "\025\uff99\026\uff99\027\uff99\030\uff99\031\uff99\032\uff99\033" +
-    "\uff99\034\uff99\035\uff99\036\uff99\037\uff99\040\uff99\041\uff99" +
-    "\042\uff99\043\uff99\001\002\000\004\020\042\001\002\000" +
-    "\006\012\uff9b\021\uff9b\001\002\000\004\054\043\001\002" +
-    "\000\010\012\uff9a\020\uff97\021\uff9a\001\002\000\026\012" +
-    "\054\042\063\044\050\045\053\047\047\050\071\051\065" +
-    "\052\051\053\056\054\037\001\002\000\052\005\uffe8\016" +
-    "\uffe8\017\uffe8\022\131\024\115\025\111\026\112\027\117" +
-    "\030\126\031\113\032\124\033\116\034\123\035\127\036" +
-    "\122\037\130\040\121\041\114\042\125\043\110\001\002" +
-    "\000\066\002\uffcf\005\uffcf\006\uffcf\013\uffcf\014\072\015" +
-    "\uffcf\016\uffcf\017\uffcf\022\uffcf\023\uffcf\024\uffcf\025\uffcf" +
-    "\026\uffcf\027\uffcf\030\uffcf\031\uffcf\032\uffcf\033\uffcf\034" +
-    "\uffcf\035\uffcf\036\uffcf\037\uffcf\040\uffcf\041\uffcf\042\uffcf" +
-    "\043\uffcf\001\002\000\070\002\uff9d\005\uff9d\006\uff9d\013" +
-    "\uff9d\014\uff9d\015\uff9d\016\uff9d\017\uff9d\020\uff9d\022\uff9d" +
-    "\023\uff9d\024\uff9d\025\uff9d\026\uff9d\027\uff9d\030\uff9d\031" +
-    "\uff9d\032\uff9d\033\uff9d\034\uff9d\035\uff9d\036\uff9d\037\uff9d" +
-    "\040\uff9d\041\uff9d\042\uff9d\043\uff9d\001\002\000\026\012" +
-    "\054\042\063\044\050\045\053\047\047\050\071\051\065" +
-    "\052\051\053\056\054\037\001\002\000\070\002\uff9f\005" +
-    "\uff9f\006\uff9f\013\uff9f\014\uff9f\015\uff9f\016\uff9f\017\uff9f" +
-    "\020\uff9f\022\uff9f\023\uff9f\024\uff9f\025\uff9f\026\uff9f\027" +
-    "\uff9f\030\uff9f\031\uff9f\032\uff9f\033\uff9f\034\uff9f\035\uff9f" +
-    "\036\uff9f\037\uff9f\040\uff9f\041\uff9f\042\uff9f\043\uff9f\001" +
-    "\002\000\066\002\uffcc\005\uffcc\006\uffcc\012\211\013\uffcc" +
-    "\015\uffcc\016\uffcc\017\uffcc\022\uffcc\023\uffcc\024\uffcc\025" +
+    "\004\054\040\001\002\000\006\014\045\021\uffe4\001\002" +
+    "\000\004\021\uffe7\001\002\000\074\002\uff96\005\uff96\006" +
+    "\uff96\012\uff96\013\uff96\014\uff96\015\uff96\016\uff96\017\uff96" +
+    "\020\uff95\021\uff96\022\uff96\023\uff96\024\uff96\025\uff96\026" +
+    "\uff96\027\uff96\030\uff96\031\uff96\032\uff96\033\uff96\034\uff96" +
+    "\035\uff96\036\uff96\037\uff96\040\uff96\041\uff96\042\uff96\043" +
+    "\uff96\001\002\000\004\020\043\001\002\000\010\012\uff98" +
+    "\014\uff98\021\uff98\001\002\000\004\054\044\001\002\000" +
+    "\012\012\uff97\014\uff97\020\uff94\021\uff97\001\002\000\004" +
+    "\015\047\001\002\000\004\021\uffe5\001\002\000\006\014" +
+    "\045\021\uffe2\001\002\000\004\021\uffe3\001\002\000\030" +
+    "\003\072\012\061\042\070\044\055\045\060\047\054\050" +
+    "\077\051\073\052\056\053\063\054\040\001\002\000\052" +
+    "\005\uffe8\016\uffe8\017\uffe8\022\134\024\117\025\113\026" +
+    "\114\027\122\030\131\031\115\032\130\033\121\034\126" +
+    "\035\132\036\125\037\133\040\124\041\116\042\127\043" +
+    "\112\001\002\000\066\002\uffce\005\uffce\006\uffce\013\uffce" +
+    "\014\100\015\uffce\016\uffce\017\uffce\022\uffce\023\uffce\024" +
+    "\uffce\025\uffce\026\uffce\027\uffce\030\uffce\031\uffce\032\uffce" +
+    "\033\uffce\034\uffce\035\uffce\036\uffce\037\uffce\040\uffce\041" +
+    "\uffce\042\uffce\043\uffce\001\002\000\070\002\uff9a\005\uff9a" +
+    "\006\uff9a\013\uff9a\014\uff9a\015\uff9a\016\uff9a\017\uff9a\020" +
+    "\uff9a\022\uff9a\023\uff9a\024\uff9a\025\uff9a\026\uff9a\027\uff9a" +
+    "\030\uff9a\031\uff9a\032\uff9a\033\uff9a\034\uff9a\035\uff9a\036" +
+    "\uff9a\037\uff9a\040\uff9a\041\uff9a\042\uff9a\043\uff9a\001\002" +
+    "\000\030\003\072\012\061\042\070\044\055\045\060\047" +
+    "\054\050\077\051\073\052\056\053\063\054\040\001\002" +
+    "\000\070\002\uff9c\005\uff9c\006\uff9c\013\uff9c\014\uff9c\015" +
+    "\uff9c\016\uff9c\017\uff9c\020\uff9c\022\uff9c\023\uff9c\024\uff9c" +
+    "\025\uff9c\026\uff9c\027\uff9c\030\uff9c\031\uff9c\032\uff9c\033" +
+    "\uff9c\034\uff9c\035\uff9c\036\uff9c\037\uff9c\040\uff9c\041\uff9c" +
+    "\042\uff9c\043\uff9c\001\002\000\070\002\uffcb\005\uffcb\006" +
+    "\uffcb\012\217\013\uffcb\014\100\015\uffcb\016\uffcb\017\uffcb" +
+    "\022\uffcb\023\uffcb\024\uffcb\025\uffcb\026\uffcb\027\uffcb\030" +
+    "\uffcb\031\uffcb\032\uffcb\033\uffcb\034\uffcb\035\uffcb\036\uffcb" +
+    "\037\uffcb\040\uffcb\041\uffcb\042\uffcb\043\uffcb\001\002\000" +
+    "\030\003\072\012\061\042\070\044\055\045\060\047\054" +
+    "\050\077\051\073\052\056\053\063\054\040\001\002\000" +
+    "\030\003\072\012\061\042\070\044\055\045\060\047\054" +
+    "\050\077\051\073\052\056\053\063\054\040\001\002\000" +
+    "\070\002\uffcc\005\uffcc\006\uffcc\013\uffcc\014\100\015\uffcc" +
+    "\016\uffcc\017\uffcc\020\205\022\uffcc\023\uffcc\024\uffcc\025" +
     "\uffcc\026\uffcc\027\uffcc\030\uffcc\031\uffcc\032\uffcc\033\uffcc" +
     "\034\uffcc\035\uffcc\036\uffcc\037\uffcc\040\uffcc\041\uffcc\042" +
-    "\uffcc\043\uffcc\001\002\000\026\012\054\042\063\044\050" +
-    "\045\053\047\047\050\071\051\065\052\051\053\056\054" +
-    "\037\001\002\000\026\012\054\042\063\044\050\045\053" +
-    "\047\047\050\071\051\065\052\051\053\056\054\037\001" +
-    "\002\000\070\002\uffcd\005\uffcd\006\uffcd\013\uffcd\014\072" +
-    "\015\uffcd\016\uffcd\017\uffcd\020\200\022\uffcd\023\uffcd\024" +
-    "\uffcd\025\uffcd\026\uffcd\027\uffcd\030\uffcd\031\uffcd\032\uffcd" +
-    "\033\uffcd\034\uffcd\035\uffcd\036\uffcd\037\uffcd\040\uffcd\041" +
-    "\uffcd\042\uffcd\043\uffcd\001\002\000\070\002\uff9e\005\uff9e" +
+    "\uffcc\043\uffcc\001\002\000\070\002\uff9b\005\uff9b\006\uff9b" +
+    "\013\uff9b\014\uff9b\015\uff9b\016\uff9b\017\uff9b\020\uff9b\022" +
+    "\uff9b\023\uff9b\024\uff9b\025\uff9b\026\uff9b\027\uff9b\030\uff9b" +
+    "\031\uff9b\032\uff9b\033\uff9b\034\uff9b\035\uff9b\036\uff9b\037" +
+    "\uff9b\040\uff9b\041\uff9b\042\uff9b\043\uff9b\001\002\000\064" +
+    "\002\uffd1\005\uffd1\006\uffd1\013\uffd1\015\uffd1\016\uffd1\017" +
+    "\uffd1\022\uffd1\023\uffd1\024\uffd1\025\uffd1\026\uffd1\027\uffd1" +
+    "\030\uffd1\031\uffd1\032\uffd1\033\uffd1\034\uffd1\035\uffd1\036" +
+    "\uffd1\037\uffd1\040\uffd1\041\uffd1\042\uffd1\043\uffd1\001\002" +
+    "\000\070\002\uffad\005\uffad\006\uffad\013\uffad\014\uffad\015" +
+    "\uffad\016\uffad\017\uffad\020\176\022\uffad\023\uffad\024\uffad" +
+    "\025\uffad\026\uffad\027\uffad\030\uffad\031\uffad\032\uffad\033" +
+    "\uffad\034\uffad\035\uffad\036\uffad\037\uffad\040\uffad\041\uffad" +
+    "\042\uffad\043\uffad\001\002\000\004\020\167\001\002\000" +
+    "\064\002\uffd2\005\uffd2\006\uffd2\013\uffd2\015\uffd2\016\uffd2" +
+    "\017\uffd2\022\uffd2\023\uffd2\024\uffd2\025\uffd2\026\uffd2\027" +
+    "\uffd2\030\uffd2\031\uffd2\032\uffd2\033\uffd2\034\uffd2\035\uffd2" +
+    "\036\uffd2\037\uffd2\040\uffd2\041\uffd2\042\uffd2\043\uffd2\001" +
+    "\002\000\030\003\072\012\061\042\070\044\055\045\060" +
+    "\047\054\050\077\051\073\052\056\053\063\054\040\001" +
+    "\002\000\070\002\uffa5\005\uffa5\006\uffa5\013\uffa5\014\uffa5" +
+    "\015\uffa5\016\uffa5\017\uffa5\020\uffa5\022\uffa5\023\uffa5\024" +
+    "\uffa5\025\uffa5\026\uffa5\027\uffa5\030\uffa5\031\uffa5\032\uffa5" +
+    "\033\uffa5\034\uffa5\035\uffa5\036\uffa5\037\uffa5\040\uffa5\041" +
+    "\uffa5\042\uffa5\043\uffa5\001\002\000\030\003\072\012\061" +
+    "\042\070\044\055\045\060\047\054\050\077\051\073\052" +
+    "\056\053\063\054\040\001\002\000\070\002\uff9e\005\uff9e" +
     "\006\uff9e\013\uff9e\014\uff9e\015\uff9e\016\uff9e\017\uff9e\020" +
     "\uff9e\022\uff9e\023\uff9e\024\uff9e\025\uff9e\026\uff9e\027\uff9e" +
     "\030\uff9e\031\uff9e\032\uff9e\033\uff9e\034\uff9e\035\uff9e\036" +
     "\uff9e\037\uff9e\040\uff9e\041\uff9e\042\uff9e\043\uff9e\001\002" +
-    "\000\064\002\uffd2\005\uffd2\006\uffd2\013\uffd2\015\uffd2\016" +
-    "\uffd2\017\uffd2\022\uffd2\023\uffd2\024\uffd2\025\uffd2\026\uffd2" +
-    "\027\uffd2\030\uffd2\031\uffd2\032\uffd2\033\uffd2\034\uffd2\035" +
-    "\uffd2\036\uffd2\037\uffd2\040\uffd2\041\uffd2\042\uffd2\043\uffd2" +
-    "\001\002\000\070\002\uffb0\005\uffb0\006\uffb0\013\uffb0\014" +
-    "\uffb0\015\uffb0\016\uffb0\017\uffb0\020\171\022\uffb0\023\uffb0" +
-    "\024\uffb0\025\uffb0\026\uffb0\027\uffb0\030\uffb0\031\uffb0\032" +
-    "\uffb0\033\uffb0\034\uffb0\035\uffb0\036\uffb0\037\uffb0\040\uffb0" +
-    "\041\uffb0\042\uffb0\043\uffb0\001\002\000\004\020\162\001" +
-    "\002\000\064\002\uffd3\005\uffd3\006\uffd3\013\uffd3\015\uffd3" +
-    "\016\uffd3\017\uffd3\022\uffd3\023\uffd3\024\uffd3\025\uffd3\026" +
-    "\uffd3\027\uffd3\030\uffd3\031\uffd3\032\uffd3\033\uffd3\034\uffd3" +
-    "\035\uffd3\036\uffd3\037\uffd3\040\uffd3\041\uffd3\042\uffd3\043" +
-    "\uffd3\001\002\000\026\012\054\042\063\044\050\045\053" +
-    "\047\047\050\071\051\065\052\051\053\056\054\037\001" +
-    "\002\000\070\002\uffa8\005\uffa8\006\uffa8\013\uffa8\014\uffa8" +
-    "\015\uffa8\016\uffa8\017\uffa8\020\uffa8\022\uffa8\023\uffa8\024" +
-    "\uffa8\025\uffa8\026\uffa8\027\uffa8\030\uffa8\031\uffa8\032\uffa8" +
-    "\033\uffa8\034\uffa8\035\uffa8\036\uffa8\037\uffa8\040\uffa8\041" +
-    "\uffa8\042\uffa8\043\uffa8\001\002\000\070\002\uffa1\005\uffa1" +
-    "\006\uffa1\013\uffa1\014\uffa1\015\uffa1\016\uffa1\017\uffa1\020" +
-    "\uffa1\022\uffa1\023\uffa1\024\uffa1\025\uffa1\026\uffa1\027\uffa1" +
-    "\030\uffa1\031\uffa1\032\uffa1\033\uffa1\034\uffa1\035\uffa1\036" +
-    "\uffa1\037\uffa1\040\uffa1\041\uffa1\042\uffa1\043\uffa1\001\002" +
-    "\000\064\002\uffd0\005\uffd0\006\uffd0\013\uffd0\015\uffd0\016" +
-    "\uffd0\017\uffd0\022\uffd0\023\uffd0\024\uffd0\025\uffd0\026\uffd0" +
-    "\027\uffd0\030\uffd0\031\uffd0\032\uffd0\033\uffd0\034\uffd0\035" +
-    "\uffd0\036\uffd0\037\uffd0\040\uffd0\041\uffd0\042\uffd0\043\uffd0" +
-    "\001\002\000\064\002\uffd1\005\uffd1\006\uffd1\013\uffd1\015" +
-    "\uffd1\016\uffd1\017\uffd1\022\uffd1\023\uffd1\024\uffd1\025\uffd1" +
-    "\026\uffd1\027\uffd1\030\uffd1\031\uffd1\032\uffd1\033\uffd1\034" +
-    "\uffd1\035\uffd1\036\uffd1\037\uffd1\040\uffd1\041\uffd1\042\uffd1" +
-    "\043\uffd1\001\002\000\070\002\uffce\005\uffce\006\uffce\013" +
-    "\uffce\014\072\015\uffce\016\uffce\017\uffce\020\075\022\uffce" +
-    "\023\uffce\024\uffce\025\uffce\026\uffce\027\uffce\030\uffce\031" +
-    "\uffce\032\uffce\033\uffce\034\uffce\035\uffce\036\uffce\037\uffce" +
-    "\040\uffce\041\uffce\042\uffce\043\uffce\001\002\000\070\002" +
-    "\uffa0\005\uffa0\006\uffa0\013\uffa0\014\uffa0\015\uffa0\016\uffa0" +
-    "\017\uffa0\020\uffa0\022\uffa0\023\uffa0\024\uffa0\025\uffa0\026" +
-    "\uffa0\027\uffa0\030\uffa0\031\uffa0\032\uffa0\033\uffa0\034\uffa0" +
-    "\035\uffa0\036\uffa0\037\uffa0\040\uffa0\041\uffa0\042\uffa0\043" +
-    "\uffa0\001\002\000\026\012\054\042\063\044\050\045\053" +
-    "\047\047\050\071\051\065\052\051\053\056\054\037\001" +
-    "\002\000\064\002\uffb5\005\uffb5\006\uffb5\013\uffb5\015\uffb5" +
-    "\016\uffb5\017\uffb5\022\uffb5\023\uffb5\024\uffb5\025\uffb5\026" +
-    "\uffb5\027\uffb5\030\uffb5\031\uffb5\032\uffb5\033\uffb5\034\uffb5" +
-    "\035\uffb5\036\uffb5\037\uffb5\040\uffb5\041\uffb5\042\uffb5\043" +
-    "\uffb5\001\002\000\066\002\uffb4\005\uffb4\006\uffb4\013\uffb4" +
-    "\014\072\015\uffb4\016\uffb4\017\uffb4\022\uffb4\023\uffb4\024" +
-    "\uffb4\025\uffb4\026\uffb4\027\uffb4\030\uffb4\031\uffb4\032\uffb4" +
-    "\033\uffb4\034\uffb4\035\uffb4\036\uffb4\037\uffb4\040\uffb4\041" +
-    "\uffb4\042\uffb4\043\uffb4\001\002\000\004\054\023\001\002" +
-    "\000\072\002\uffae\005\uffae\006\uffae\012\077\013\uffae\014" +
-    "\uffae\015\uffae\016\uffae\017\uffae\020\uffae\022\uffae\023\uffae" +
-    "\024\uffae\025\uffae\026\uffae\027\uffae\030\uffae\031\uffae\032" +
-    "\uffae\033\uffae\034\uffae\035\uffae\036\uffae\037\uffae\040\uffae" +
-    "\041\uffae\042\uffae\043\uffae\001\002\000\032\003\103\012" +
-    "\054\013\101\042\063\044\050\045\053\047\047\050\071" +
-    "\051\065\052\051\053\056\054\037\001\002\000\050\013" +
-    "\uffd7\017\120\022\131\024\115\025\111\026\112\027\117" +
-    "\030\126\031\113\032\124\033\116\034\123\035\127\036" +
-    "\122\037\130\040\121\041\114\042\125\043\110\001\002" +
-    "\000\070\002\uffa5\005\uffa5\006\uffa5\013\uffa5\014\uffa5\015" +
-    "\uffa5\016\uffa5\017\uffa5\020\uffa5\022\uffa5\023\uffa5\024\uffa5" +
-    "\025\uffa5\026\uffa5\027\uffa5\030\uffa5\031\uffa5\032\uffa5\033" +
-    "\uffa5\034\uffa5\035\uffa5\036\uffa5\037\uffa5\040\uffa5\041\uffa5" +
-    "\042\uffa5\043\uffa5\001\002\000\004\013\uffd5\001\002\000" +
-    "\004\017\106\001\002\000\004\013\105\001\002\000\070" +
-    "\002\uffa4\005\uffa4\006\uffa4\013\uffa4\014\uffa4\015\uffa4\016" +
-    "\uffa4\017\uffa4\020\uffa4\022\uffa4\023\uffa4\024\uffa4\025\uffa4" +
-    "\026\uffa4\027\uffa4\030\uffa4\031\uffa4\032\uffa4\033\uffa4\034" +
-    "\uffa4\035\uffa4\036\uffa4\037\uffa4\040\uffa4\041\uffa4\042\uffa4" +
-    "\043\uffa4\001\002\000\030\003\103\012\054\042\063\044" +
-    "\050\045\053\047\047\050\071\051\065\052\051\053\056" +
-    "\054\037\001\002\000\004\013\uffd4\001\002\000\026\012" +
-    "\054\042\063\044\050\045\053\047\047\050\071\051\065" +
-    "\052\051\053\056\054\037\001\002\000\026\012\054\042" +
-    "\063\044\050\045\053\047\047\050\071\051\065\052\051" +
-    "\053\056\054\037\001\002\000\026\012\054\042\063\044" +
-    "\050\045\053\047\047\050\071\051\065\052\051\053\056" +
-    "\054\037\001\002\000\026\012\054\042\063\044\050\045" +
-    "\053\047\047\050\071\051\065\052\051\053\056\054\037" +
-    "\001\002\000\026\012\054\042\063\044\050\045\053\047" +
-    "\047\050\071\051\065\052\051\053\056\054\037\001\002" +
-    "\000\026\012\054\042\063\044\050\045\053\047\047\050" +
-    "\071\051\065\052\051\053\056\054\037\001\002\000\026" +
-    "\012\054\042\063\044\050\045\053\047\047\050\071\051" +
-    "\065\052\051\053\056\054\037\001\002\000\026\012\054" +
-    "\042\063\044\050\045\053\047\047\050\071\051\065\052" +
-    "\051\053\056\054\037\001\002\000\030\003\103\012\054" +
-    "\042\063\044\050\045\053\047\047\050\071\051\065\052" +
-    "\051\053\056\054\037\001\002\000\026\012\054\042\063" +
-    "\044\050\045\053\047\047\050\071\051\065\052\051\053" +
-    "\056\054\037\001\002\000\026\012\054\042\063\044\050" +
-    "\045\053\047\047\050\071\051\065\052\051\053\056\054" +
-    "\037\001\002\000\026\012\054\042\063\044\050\045\053" +
-    "\047\047\050\071\051\065\052\051\053\056\054\037\001" +
-    "\002\000\026\012\054\042\063\044\050\045\053\047\047" +
-    "\050\071\051\065\052\051\053\056\054\037\001\002\000" +
-    "\026\012\054\042\063\044\050\045\053\047\047\050\071" +
-    "\051\065\052\051\053\056\054\037\001\002\000\026\012" +
-    "\054\042\063\044\050\045\053\047\047\050\071\051\065" +
-    "\052\051\053\056\054\037\001\002\000\026\012\054\042" +
-    "\063\044\050\045\053\047\047\050\071\051\065\052\051" +
-    "\053\056\054\037\001\002\000\026\012\054\042\063\044" +
-    "\050\045\053\047\047\050\071\051\065\052\051\053\056" +
-    "\054\037\001\002\000\026\012\054\042\063\044\050\045" +
-    "\053\047\047\050\071\051\065\052\051\053\056\054\037" +
-    "\001\002\000\046\022\131\023\133\024\115\025\111\026" +
-    "\112\027\117\030\126\031\113\032\124\033\116\034\123" +
-    "\035\127\036\122\037\130\040\121\041\114\042\125\043" +
-    "\110\001\002\000\026\012\054\042\063\044\050\045\053" +
-    "\047\047\050\071\051\065\052\051\053\056\054\037\001" +
-    "\002\000\064\002\uffcb\005\uffcb\006\uffcb\013\uffcb\015\uffcb" +
-    "\016\uffcb\017\uffcb\022\131\023\uffcb\024\115\025\111\026" +
-    "\112\027\117\030\126\031\113\032\124\033\116\034\123" +
-    "\035\127\036\122\037\130\040\121\041\114\042\125\043" +
-    "\110\001\002\000\064\002\uffbd\005\uffbd\006\uffbd\013\uffbd" +
-    "\015\uffbd\016\uffbd\017\uffbd\022\uffbd\023\uffbd\024\uffbd\025" +
-    "\uffbd\026\uffbd\027\uffbd\030\uffbd\031\uffbd\032\uffbd\033\uffbd" +
-    "\034\123\035\127\036\122\037\uffbd\040\uffbd\041\uffbd\042" +
-    "\uffbd\043\uffbd\001\002\000\064\002\uffc1\005\uffc1\006\uffc1" +
-    "\013\uffc1\015\uffc1\016\uffc1\017\uffc1\022\uffc1\023\uffc1\024" +
-    "\uffc1\025\uffc1\026\uffc1\027\uffc1\030\uffc1\031\uffc1\032\uffc1" +
-    "\033\uffc1\034\uffc1\035\uffc1\036\uffc1\037\uffc1\040\uffc1\041" +
-    "\uffc1\042\uffc1\043\uffc1\001\002\000\060\002\uffc6\005\uffc6" +
-    "\006\uffc6\013\uffc6\015\uffc6\016\uffc6\017\uffc6\022\uffc6\023" +
-    "\uffc6\024\uffc6\025\uffc6\026\112\027\117\032\124\033\116" +
-    "\034\123\035\127\036\122\037\130\040\121\041\114\042" +
-    "\125\043\110\001\002\000\064\002\uffbe\005\uffbe\006\uffbe" +
-    "\013\uffbe\015\uffbe\016\uffbe\017\uffbe\022\uffbe\023\uffbe\024" +
-    "\uffbe\025\uffbe\026\uffbe\027\uffbe\030\uffbe\031\uffbe\032\uffbe" +
-    "\033\uffbe\034\123\035\127\036\122\037\130\040\121\041" +
-    "\uffbe\042\uffbe\043\110\001\002\000\064\002\uffc4\005\uffc4" +
-    "\006\uffc4\013\uffc4\015\uffc4\016\uffc4\017\uffc4\022\uffc4\023" +
-    "\uffc4\024\uffc4\025\uffc4\026\uffc4\027\uffc4\030\uffc4\031\uffc4" +
-    "\032\uffc4\033\uffc4\034\123\035\127\036\122\037\130\040" +
-    "\121\041\114\042\125\043\110\001\002\000\064\002\uffc2" +
-    "\005\uffc2\006\uffc2\013\uffc2\015\uffc2\016\uffc2\017\uffc2\022" +
-    "\uffc2\023\uffc2\024\uffc2\025\uffc2\026\uffc2\027\uffc2\030\uffc2" +
-    "\031\uffc2\032\uffc2\033\uffc2\034\uffc2\035\uffc2\036\uffc2\037" +
-    "\uffc2\040\uffc2\041\uffc2\042\uffc2\043\uffc2\001\002\000\064" +
-    "\002\uffc0\005\uffc0\006\uffc0\013\uffc0\015\uffc0\016\uffc0\017" +
-    "\uffc0\022\uffc0\023\uffc0\024\uffc0\025\uffc0\026\uffc0\027\uffc0" +
-    "\030\uffc0\031\uffc0\032\uffc0\033\uffc0\034\uffc0\035\uffc0\036" +
-    "\uffc0\037\uffc0\040\uffc0\041\uffc0\042\uffc0\043\uffc0\001\002" +
-    "\000\064\002\uffbc\005\uffbc\006\uffbc\013\uffbc\015\uffbc\016" +
-    "\uffbc\017\uffbc\022\uffbc\023\uffbc\024\uffbc\025\uffbc\026\uffbc" +
-    "\027\uffbc\030\uffbc\031\uffbc\032\uffbc\033\uffbc\034\123\035" +
-    "\127\036\122\037\uffbc\040\uffbc\041\uffbc\042\uffbc\043\uffbc" +
-    "\001\002\000\004\013\uffd6\001\002\000\064\002\uffc7\005" +
-    "\uffc7\006\uffc7\013\uffc7\015\uffc7\016\uffc7\017\uffc7\022\uffc7" +
-    "\023\uffc7\024\uffc7\025\uffc7\026\uffc7\027\uffc7\030\uffc7\031" +
-    "\uffc7\032\uffc7\033\uffc7\034\123\035\127\036\122\037\130" +
-    "\040\121\041\114\042\125\043\110\001\002\000\064\002" +
-    "\uffc3\005\uffc3\006\uffc3\013\uffc3\015\uffc3\016\uffc3\017\uffc3" +
-    "\022\uffc3\023\uffc3\024\uffc3\025\uffc3\026\uffc3\027\uffc3\030" +
-    "\uffc3\031\uffc3\032\uffc3\033\uffc3\034\123\035\127\036\122" +
-    "\037\130\040\121\041\114\042\125\043\110\001\002\000" +
-    "\064\002\uffca\005\uffca\006\uffca\013\uffca\015\uffca\016\uffca" +
-    "\017\uffca\022\uffca\023\uffca\024\uffca\025\uffca\026\112\027" +
-    "\117\030\126\031\113\032\124\033\116\034\123\035\127" +
-    "\036\122\037\130\040\121\041\114\042\125\043\110\001" +
+    "\000\064\002\uffcf\005\uffcf\006\uffcf\013\uffcf\015\uffcf\016" +
+    "\uffcf\017\uffcf\022\uffcf\023\uffcf\024\uffcf\025\uffcf\026\uffcf" +
+    "\027\uffcf\030\uffcf\031\uffcf\032\uffcf\033\uffcf\034\uffcf\035" +
+    "\uffcf\036\uffcf\037\uffcf\040\uffcf\041\uffcf\042\uffcf\043\uffcf" +
+    "\001\002\000\064\002\uffd0\005\uffd0\006\uffd0\013\uffd0\015" +
+    "\uffd0\016\uffd0\017\uffd0\022\uffd0\023\uffd0\024\uffd0\025\uffd0" +
+    "\026\uffd0\027\uffd0\030\uffd0\031\uffd0\032\uffd0\033\uffd0\034" +
+    "\uffd0\035\uffd0\036\uffd0\037\uffd0\040\uffd0\041\uffd0\042\uffd0" +
+    "\043\uffd0\001\002\000\070\002\uffcd\005\uffcd\006\uffcd\013" +
+    "\uffcd\014\100\015\uffcd\016\uffcd\017\uffcd\020\103\022\uffcd" +
+    "\023\uffcd\024\uffcd\025\uffcd\026\uffcd\027\uffcd\030\uffcd\031" +
+    "\uffcd\032\uffcd\033\uffcd\034\uffcd\035\uffcd\036\uffcd\037\uffcd" +
+    "\040\uffcd\041\uffcd\042\uffcd\043\uffcd\001\002\000\070\002" +
+    "\uff9d\005\uff9d\006\uff9d\013\uff9d\014\uff9d\015\uff9d\016\uff9d" +
+    "\017\uff9d\020\uff9d\022\uff9d\023\uff9d\024\uff9d\025\uff9d\026" +
+    "\uff9d\027\uff9d\030\uff9d\031\uff9d\032\uff9d\033\uff9d\034\uff9d" +
+    "\035\uff9d\036\uff9d\037\uff9d\040\uff9d\041\uff9d\042\uff9d\043" +
+    "\uff9d\001\002\000\030\003\072\012\061\042\070\044\055" +
+    "\045\060\047\054\050\077\051\073\052\056\053\063\054" +
+    "\040\001\002\000\064\002\uffb2\005\uffb2\006\uffb2\013\uffb2" +
+    "\015\uffb2\016\uffb2\017\uffb2\022\uffb2\023\uffb2\024\uffb2\025" +
+    "\uffb2\026\uffb2\027\uffb2\030\uffb2\031\uffb2\032\uffb2\033\uffb2" +
+    "\034\uffb2\035\uffb2\036\uffb2\037\uffb2\040\uffb2\041\uffb2\042" +
+    "\uffb2\043\uffb2\001\002\000\066\002\uffb0\005\uffb0\006\uffb0" +
+    "\013\uffb0\014\100\015\uffb0\016\uffb0\017\uffb0\022\uffb0\023" +
+    "\uffb0\024\uffb0\025\uffb0\026\uffb0\027\uffb0\030\uffb0\031\uffb0" +
+    "\032\uffb0\033\uffb0\034\uffb0\035\uffb0\036\uffb0\037\uffb0\040" +
+    "\uffb0\041\uffb0\042\uffb0\043\uffb0\001\002\000\004\054\023" +
+    "\001\002\000\072\002\uffab\005\uffab\006\uffab\012\105\013" +
+    "\uffab\014\uffab\015\uffab\016\uffab\017\uffab\020\uffab\022\uffab" +
+    "\023\uffab\024\uffab\025\uffab\026\uffab\027\uffab\030\uffab\031" +
+    "\uffab\032\uffab\033\uffab\034\uffab\035\uffab\036\uffab\037\uffab" +
+    "\040\uffab\041\uffab\042\uffab\043\uffab\001\002\000\032\003" +
+    "\072\012\061\013\107\042\070\044\055\045\060\047\054" +
+    "\050\077\051\073\052\056\053\063\054\040\001\002\000" +
+    "\052\013\uffd5\016\120\017\123\022\134\024\117\025\113" +
+    "\026\114\027\122\030\131\031\115\032\130\033\121\034" +
+    "\126\035\132\036\125\037\133\040\124\041\116\042\127" +
+    "\043\112\001\002\000\070\002\uffa2\005\uffa2\006\uffa2\013" +
+    "\uffa2\014\uffa2\015\uffa2\016\uffa2\017\uffa2\020\uffa2\022\uffa2" +
+    "\023\uffa2\024\uffa2\025\uffa2\026\uffa2\027\uffa2\030\uffa2\031" +
+    "\uffa2\032\uffa2\033\uffa2\034\uffa2\035\uffa2\036\uffa2\037\uffa2" +
+    "\040\uffa2\041\uffa2\042\uffa2\043\uffa2\001\002\000\004\013" +
+    "\111\001\002\000\070\002\uffa1\005\uffa1\006\uffa1\013\uffa1" +
+    "\014\uffa1\015\uffa1\016\uffa1\017\uffa1\020\uffa1\022\uffa1\023" +
+    "\uffa1\024\uffa1\025\uffa1\026\uffa1\027\uffa1\030\uffa1\031\uffa1" +
+    "\032\uffa1\033\uffa1\034\uffa1\035\uffa1\036\uffa1\037\uffa1\040" +
+    "\uffa1\041\uffa1\042\uffa1\043\uffa1\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\030\003\072" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\046\022\134" +
+    "\023\136\024\117\025\113\026\114\027\122\030\131\031" +
+    "\115\032\130\033\121\034\126\035\132\036\125\037\133" +
+    "\040\124\041\116\042\127\043\112\001\002\000\030\003" +
+    "\072\012\061\042\070\044\055\045\060\047\054\050\077" +
+    "\051\073\052\056\053\063\054\040\001\002\000\064\002" +
+    "\uffc9\005\uffc9\006\uffc9\013\uffc9\015\uffc9\016\uffc9\017\uffc9" +
+    "\022\134\023\uffc9\024\117\025\113\026\114\027\122\030" +
+    "\131\031\115\032\130\033\121\034\126\035\132\036\125" +
+    "\037\133\040\124\041\116\042\127\043\112\001\002\000" +
+    "\064\002\uffbb\005\uffbb\006\uffbb\013\uffbb\015\uffbb\016\uffbb" +
+    "\017\uffbb\022\uffbb\023\uffbb\024\uffbb\025\uffbb\026\uffbb\027" +
+    "\uffbb\030\uffbb\031\uffbb\032\uffbb\033\uffbb\034\126\035\132" +
+    "\036\125\037\uffbb\040\uffbb\041\uffbb\042\uffbb\043\uffbb\001" +
     "\002\000\064\002\uffbf\005\uffbf\006\uffbf\013\uffbf\015\uffbf" +
     "\016\uffbf\017\uffbf\022\uffbf\023\uffbf\024\uffbf\025\uffbf\026" +
-    "\uffbf\027\uffbf\030\uffbf\031\uffbf\032\uffbf\033\uffbf\034\123" +
-    "\035\127\036\122\037\130\040\121\041\uffbf\042\uffbf\043" +
-    "\110\001\002\000\060\002\uffc5\005\uffc5\006\uffc5\013\uffc5" +
-    "\015\uffc5\016\uffc5\017\uffc5\022\uffc5\023\uffc5\024\uffc5\025" +
-    "\uffc5\026\112\027\117\032\124\033\116\034\123\035\127" +
-    "\036\122\037\130\040\121\041\114\042\125\043\110\001" +
+    "\uffbf\027\uffbf\030\uffbf\031\uffbf\032\uffbf\033\uffbf\034\uffbf" +
+    "\035\uffbf\036\uffbf\037\uffbf\040\uffbf\041\uffbf\042\uffbf\043" +
+    "\uffbf\001\002\000\060\002\uffc4\005\uffc4\006\uffc4\013\uffc4" +
+    "\015\uffc4\016\uffc4\017\uffc4\022\uffc4\023\uffc4\024\uffc4\025" +
+    "\uffc4\026\114\027\122\032\130\033\121\034\126\035\132" +
+    "\036\125\037\133\040\124\041\116\042\127\043\112\001" +
+    "\002\000\064\002\uffc2\005\uffc2\006\uffc2\013\uffc2\015\uffc2" +
+    "\016\uffc2\017\uffc2\022\uffc2\023\uffc2\024\uffc2\025\uffc2\026" +
+    "\uffc2\027\uffc2\030\uffc2\031\uffc2\032\uffc2\033\uffc2\034\126" +
+    "\035\132\036\125\037\133\040\124\041\116\042\127\043" +
+    "\112\001\002\000\064\002\uffbc\005\uffbc\006\uffbc\013\uffbc" +
+    "\015\uffbc\016\uffbc\017\uffbc\022\uffbc\023\uffbc\024\uffbc\025" +
+    "\uffbc\026\uffbc\027\uffbc\030\uffbc\031\uffbc\032\uffbc\033\uffbc" +
+    "\034\126\035\132\036\125\037\133\040\124\041\uffbc\042" +
+    "\uffbc\043\112\001\002\000\064\002\uffc0\005\uffc0\006\uffc0" +
+    "\013\uffc0\015\uffc0\016\uffc0\017\uffc0\022\uffc0\023\uffc0\024" +
+    "\uffc0\025\uffc0\026\uffc0\027\uffc0\030\uffc0\031\uffc0\032\uffc0" +
+    "\033\uffc0\034\uffc0\035\uffc0\036\uffc0\037\uffc0\040\uffc0\041" +
+    "\uffc0\042\uffc0\043\uffc0\001\002\000\064\002\uffbe\005\uffbe" +
+    "\006\uffbe\013\uffbe\015\uffbe\016\uffbe\017\uffbe\022\uffbe\023" +
+    "\uffbe\024\uffbe\025\uffbe\026\uffbe\027\uffbe\030\uffbe\031\uffbe" +
+    "\032\uffbe\033\uffbe\034\uffbe\035\uffbe\036\uffbe\037\uffbe\040" +
+    "\uffbe\041\uffbe\042\uffbe\043\uffbe\001\002\000\064\002\uffba" +
+    "\005\uffba\006\uffba\013\uffba\015\uffba\016\uffba\017\uffba\022" +
+    "\uffba\023\uffba\024\uffba\025\uffba\026\uffba\027\uffba\030\uffba" +
+    "\031\uffba\032\uffba\033\uffba\034\126\035\132\036\125\037" +
+    "\uffba\040\uffba\041\uffba\042\uffba\043\uffba\001\002\000\004" +
+    "\013\uffd4\001\002\000\064\002\uffc5\005\uffc5\006\uffc5\013" +
+    "\uffc5\015\uffc5\016\uffc5\017\uffc5\022\uffc5\023\uffc5\024\uffc5" +
+    "\025\uffc5\026\uffc5\027\uffc5\030\uffc5\031\uffc5\032\uffc5\033" +
+    "\uffc5\034\126\035\132\036\125\037\133\040\124\041\116" +
+    "\042\127\043\112\001\002\000\064\002\uffc1\005\uffc1\006" +
+    "\uffc1\013\uffc1\015\uffc1\016\uffc1\017\uffc1\022\uffc1\023\uffc1" +
+    "\024\uffc1\025\uffc1\026\uffc1\027\uffc1\030\uffc1\031\uffc1\032" +
+    "\uffc1\033\uffc1\034\126\035\132\036\125\037\133\040\124" +
+    "\041\116\042\127\043\112\001\002\000\004\013\uffd3\001" +
     "\002\000\064\002\uffc8\005\uffc8\006\uffc8\013\uffc8\015\uffc8" +
     "\016\uffc8\017\uffc8\022\uffc8\023\uffc8\024\uffc8\025\uffc8\026" +
-    "\uffc8\027\uffc8\030\uffc8\031\uffc8\032\uffc8\033\uffc8\034\123" +
-    "\035\127\036\122\037\130\040\121\041\114\042\125\043" +
-    "\110\001\002\000\064\002\uffc9\005\uffc9\006\uffc9\013\uffc9" +
-    "\015\uffc9\016\uffc9\017\uffc9\022\uffc9\023\uffc9\024\uffc9\025" +
-    "\uffc9\026\112\027\117\030\126\031\113\032\124\033\116" +
-    "\034\123\035\127\036\122\037\130\040\121\041\114\042" +
-    "\125\043\110\001\002\000\064\002\uffbb\005\uffbb\006\uffbb" +
-    "\013\uffbb\015\uffbb\016\uffbb\017\uffbb\022\uffbb\023\uffbb\024" +
-    "\uffbb\025\uffbb\026\uffbb\027\uffbb\030\uffbb\031\uffbb\032\uffbb" +
-    "\033\uffbb\034\123\035\127\036\122\037\uffbb\040\uffbb\041" +
-    "\uffbb\042\uffbb\043\uffbb\001\002\000\064\002\uffb3\005\uffb3" +
-    "\006\uffb3\013\uffb3\015\uffb3\016\uffb3\017\uffb3\022\uffb3\023" +
-    "\uffb3\024\uffb3\025\uffb3\026\uffb3\027\uffb3\030\uffb3\031\uffb3" +
-    "\032\uffb3\033\uffb3\034\uffb3\035\uffb3\036\uffb3\037\uffb3\040" +
-    "\uffb3\041\uffb3\042\uffb3\043\uffb3\001\002\000\046\015\160" +
-    "\022\131\024\115\025\111\026\112\027\117\030\126\031" +
-    "\113\032\124\033\116\034\123\035\127\036\122\037\130" +
-    "\040\121\041\114\042\125\043\110\001\002\000\066\002" +
-    "\uffb2\005\uffb2\006\uffb2\013\uffb2\014\uffb2\015\uffb2\016\uffb2" +
-    "\017\uffb2\022\uffb2\023\uffb2\024\uffb2\025\uffb2\026\uffb2\027" +
-    "\uffb2\030\uffb2\031\uffb2\032\uffb2\033\uffb2\034\uffb2\035\uffb2" +
-    "\036\uffb2\037\uffb2\040\uffb2\041\uffb2\042\uffb2\043\uffb2\001" +
-    "\002\000\064\002\uffb8\005\uffb8\006\uffb8\013\uffb8\015\uffb8" +
-    "\016\uffb8\017\uffb8\022\uffb8\023\uffb8\024\uffb8\025\uffb8\026" +
-    "\uffb8\027\uffb8\030\uffb8\031\uffb8\032\uffb8\033\uffb8\034\uffb8" +
-    "\035\uffb8\036\uffb8\037\uffb8\040\uffb8\041\uffb8\042\uffb8\043" +
-    "\uffb8\001\002\000\004\054\163\001\002\000\072\002\uff99" +
-    "\005\uff99\006\uff99\012\uff99\013\uff99\014\uff99\015\uff99\016" +
-    "\uff99\017\uff99\020\uff97\022\uff99\023\uff99\024\uff99\025\uff99" +
-    "\026\uff99\027\uff99\030\uff99\031\uff99\032\uff99\033\uff99\034" +
-    "\uff99\035\uff99\036\uff99\037\uff99\040\uff99\041\uff99\042\uff99" +
-    "\043\uff99\001\002\000\070\002\uffb1\005\uffb1\006\uffb1\012" +
-    "\165\013\uffb1\014\uffb1\015\uffb1\016\uffb1\017\uffb1\022\uffb1" +
-    "\023\uffb1\024\uffb1\025\uffb1\026\uffb1\027\uffb1\030\uffb1\031" +
-    "\uffb1\032\uffb1\033\uffb1\034\uffb1\035\uffb1\036\uffb1\037\uffb1" +
-    "\040\uffb1\041\uffb1\042\uffb1\043\uffb1\001\002\000\032\003" +
-    "\103\012\054\013\166\042\063\044\050\045\053\047\047" +
-    "\050\071\051\065\052\051\053\056\054\037\001\002\000" +
-    "\070\002\uffaa\005\uffaa\006\uffaa\013\uffaa\014\uffaa\015\uffaa" +
-    "\016\uffaa\017\uffaa\020\uffaa\022\uffaa\023\uffaa\024\uffaa\025" +
-    "\uffaa\026\uffaa\027\uffaa\030\uffaa\031\uffaa\032\uffaa\033\uffaa" +
-    "\034\uffaa\035\uffaa\036\uffaa\037\uffaa\040\uffaa\041\uffaa\042" +
-    "\uffaa\043\uffaa\001\002\000\004\013\170\001\002\000\070" +
-    "\002\uffa9\005\uffa9\006\uffa9\013\uffa9\014\uffa9\015\uffa9\016" +
-    "\uffa9\017\uffa9\020\uffa9\022\uffa9\023\uffa9\024\uffa9\025\uffa9" +
-    "\026\uffa9\027\uffa9\030\uffa9\031\uffa9\032\uffa9\033\uffa9\034" +
-    "\uffa9\035\uffa9\036\uffa9\037\uffa9\040\uffa9\041\uffa9\042\uffa9" +
-    "\043\uffa9\001\002\000\004\054\023\001\002\000\072\002" +
-    "\uffad\005\uffad\006\uffad\012\173\013\uffad\014\uffad\015\uffad" +
-    "\016\uffad\017\uffad\020\uffad\022\uffad\023\uffad\024\uffad\025" +
-    "\uffad\026\uffad\027\uffad\030\uffad\031\uffad\032\uffad\033\uffad" +
-    "\034\uffad\035\uffad\036\uffad\037\uffad\040\uffad\041\uffad\042" +
-    "\uffad\043\uffad\001\002\000\032\003\103\012\054\013\174" +
-    "\042\063\044\050\045\053\047\047\050\071\051\065\052" +
-    "\051\053\056\054\037\001\002\000\070\002\uffa3\005\uffa3" +
+    "\114\027\122\030\131\031\115\032\130\033\121\034\126" +
+    "\035\132\036\125\037\133\040\124\041\116\042\127\043" +
+    "\112\001\002\000\064\002\uffbd\005\uffbd\006\uffbd\013\uffbd" +
+    "\015\uffbd\016\uffbd\017\uffbd\022\uffbd\023\uffbd\024\uffbd\025" +
+    "\uffbd\026\uffbd\027\uffbd\030\uffbd\031\uffbd\032\uffbd\033\uffbd" +
+    "\034\126\035\132\036\125\037\133\040\124\041\uffbd\042" +
+    "\uffbd\043\112\001\002\000\060\002\uffc3\005\uffc3\006\uffc3" +
+    "\013\uffc3\015\uffc3\016\uffc3\017\uffc3\022\uffc3\023\uffc3\024" +
+    "\uffc3\025\uffc3\026\114\027\122\032\130\033\121\034\126" +
+    "\035\132\036\125\037\133\040\124\041\116\042\127\043" +
+    "\112\001\002\000\064\002\uffc6\005\uffc6\006\uffc6\013\uffc6" +
+    "\015\uffc6\016\uffc6\017\uffc6\022\uffc6\023\uffc6\024\uffc6\025" +
+    "\uffc6\026\uffc6\027\uffc6\030\uffc6\031\uffc6\032\uffc6\033\uffc6" +
+    "\034\126\035\132\036\125\037\133\040\124\041\116\042" +
+    "\127\043\112\001\002\000\064\002\uffc7\005\uffc7\006\uffc7" +
+    "\013\uffc7\015\uffc7\016\uffc7\017\uffc7\022\uffc7\023\uffc7\024" +
+    "\uffc7\025\uffc7\026\114\027\122\030\131\031\115\032\130" +
+    "\033\121\034\126\035\132\036\125\037\133\040\124\041" +
+    "\116\042\127\043\112\001\002\000\064\002\uffb9\005\uffb9" +
+    "\006\uffb9\013\uffb9\015\uffb9\016\uffb9\017\uffb9\022\uffb9\023" +
+    "\uffb9\024\uffb9\025\uffb9\026\uffb9\027\uffb9\030\uffb9\031\uffb9" +
+    "\032\uffb9\033\uffb9\034\126\035\132\036\125\037\uffb9\040" +
+    "\uffb9\041\uffb9\042\uffb9\043\uffb9\001\002\000\064\002\uffb1" +
+    "\005\uffb1\006\uffb1\013\uffb1\015\uffb1\016\uffb1\017\uffb1\022" +
+    "\uffb1\023\uffb1\024\uffb1\025\uffb1\026\uffb1\027\uffb1\030\uffb1" +
+    "\031\uffb1\032\uffb1\033\uffb1\034\uffb1\035\uffb1\036\uffb1\037" +
+    "\uffb1\040\uffb1\041\uffb1\042\uffb1\043\uffb1\001\002\000\046" +
+    "\015\164\022\134\024\117\025\113\026\114\027\122\030" +
+    "\131\031\115\032\130\033\121\034\126\035\132\036\125" +
+    "\037\133\040\124\041\116\042\127\043\112\001\002\000" +
+    "\066\002\uffaf\005\uffaf\006\uffaf\013\uffaf\014\uffaf\015\uffaf" +
+    "\016\uffaf\017\uffaf\022\uffaf\023\uffaf\024\uffaf\025\uffaf\026" +
+    "\uffaf\027\uffaf\030\uffaf\031\uffaf\032\uffaf\033\uffaf\034\uffaf" +
+    "\035\uffaf\036\uffaf\037\uffaf\040\uffaf\041\uffaf\042\uffaf\043" +
+    "\uffaf\001\002\000\064\002\uffca\005\uffca\006\uffca\013\uffca" +
+    "\015\uffca\016\uffca\017\uffca\022\134\023\uffca\024\117\025" +
+    "\113\026\114\027\122\030\131\031\115\032\130\033\121" +
+    "\034\126\035\132\036\125\037\133\040\124\041\116\042" +
+    "\127\043\112\001\002\000\064\002\uffb6\005\uffb6\006\uffb6" +
+    "\013\uffb6\015\uffb6\016\uffb6\017\uffb6\022\uffb6\023\uffb6\024" +
+    "\uffb6\025\uffb6\026\uffb6\027\uffb6\030\uffb6\031\uffb6\032\uffb6" +
+    "\033\uffb6\034\uffb6\035\uffb6\036\uffb6\037\uffb6\040\uffb6\041" +
+    "\uffb6\042\uffb6\043\uffb6\001\002\000\004\054\170\001\002" +
+    "\000\072\002\uff96\005\uff96\006\uff96\012\uff96\013\uff96\014" +
+    "\uff96\015\uff96\016\uff96\017\uff96\020\uff94\022\uff96\023\uff96" +
+    "\024\uff96\025\uff96\026\uff96\027\uff96\030\uff96\031\uff96\032" +
+    "\uff96\033\uff96\034\uff96\035\uff96\036\uff96\037\uff96\040\uff96" +
+    "\041\uff96\042\uff96\043\uff96\001\002\000\070\002\uffae\005" +
+    "\uffae\006\uffae\012\172\013\uffae\014\uffae\015\uffae\016\uffae" +
+    "\017\uffae\022\uffae\023\uffae\024\uffae\025\uffae\026\uffae\027" +
+    "\uffae\030\uffae\031\uffae\032\uffae\033\uffae\034\uffae\035\uffae" +
+    "\036\uffae\037\uffae\040\uffae\041\uffae\042\uffae\043\uffae\001" +
+    "\002\000\032\003\072\012\061\013\173\042\070\044\055" +
+    "\045\060\047\054\050\077\051\073\052\056\053\063\054" +
+    "\040\001\002\000\070\002\uffa7\005\uffa7\006\uffa7\013\uffa7" +
+    "\014\uffa7\015\uffa7\016\uffa7\017\uffa7\020\uffa7\022\uffa7\023" +
+    "\uffa7\024\uffa7\025\uffa7\026\uffa7\027\uffa7\030\uffa7\031\uffa7" +
+    "\032\uffa7\033\uffa7\034\uffa7\035\uffa7\036\uffa7\037\uffa7\040" +
+    "\uffa7\041\uffa7\042\uffa7\043\uffa7\001\002\000\004\013\175" +
+    "\001\002\000\070\002\uffa6\005\uffa6\006\uffa6\013\uffa6\014" +
+    "\uffa6\015\uffa6\016\uffa6\017\uffa6\020\uffa6\022\uffa6\023\uffa6" +
+    "\024\uffa6\025\uffa6\026\uffa6\027\uffa6\030\uffa6\031\uffa6\032" +
+    "\uffa6\033\uffa6\034\uffa6\035\uffa6\036\uffa6\037\uffa6\040\uffa6" +
+    "\041\uffa6\042\uffa6\043\uffa6\001\002\000\004\054\023\001" +
+    "\002\000\072\002\uffaa\005\uffaa\006\uffaa\012\200\013\uffaa" +
+    "\014\uffaa\015\uffaa\016\uffaa\017\uffaa\020\uffaa\022\uffaa\023" +
+    "\uffaa\024\uffaa\025\uffaa\026\uffaa\027\uffaa\030\uffaa\031\uffaa" +
+    "\032\uffaa\033\uffaa\034\uffaa\035\uffaa\036\uffaa\037\uffaa\040" +
+    "\uffaa\041\uffaa\042\uffaa\043\uffaa\001\002\000\032\003\072" +
+    "\012\061\013\201\042\070\044\055\045\060\047\054\050" +
+    "\077\051\073\052\056\053\063\054\040\001\002\000\070" +
+    "\002\uffa0\005\uffa0\006\uffa0\013\uffa0\014\uffa0\015\uffa0\016" +
+    "\uffa0\017\uffa0\020\uffa0\022\uffa0\023\uffa0\024\uffa0\025\uffa0" +
+    "\026\uffa0\027\uffa0\030\uffa0\031\uffa0\032\uffa0\033\uffa0\034" +
+    "\uffa0\035\uffa0\036\uffa0\037\uffa0\040\uffa0\041\uffa0\042\uffa0" +
+    "\043\uffa0\001\002\000\004\013\203\001\002\000\070\002" +
+    "\uff9f\005\uff9f\006\uff9f\013\uff9f\014\uff9f\015\uff9f\016\uff9f" +
+    "\017\uff9f\020\uff9f\022\uff9f\023\uff9f\024\uff9f\025\uff9f\026" +
+    "\uff9f\027\uff9f\030\uff9f\031\uff9f\032\uff9f\033\uff9f\034\uff9f" +
+    "\035\uff9f\036\uff9f\037\uff9f\040\uff9f\041\uff9f\042\uff9f\043" +
+    "\uff9f\001\002\000\064\002\uffb5\005\uffb5\006\uffb5\013\uffb5" +
+    "\015\uffb5\016\uffb5\017\uffb5\022\uffb5\023\uffb5\024\uffb5\025" +
+    "\uffb5\026\uffb5\027\uffb5\030\uffb5\031\uffb5\032\uffb5\033\uffb5" +
+    "\034\uffb5\035\uffb5\036\uffb5\037\uffb5\040\uffb5\041\uffb5\042" +
+    "\uffb5\043\uffb5\001\002\000\004\054\023\001\002\000\072" +
+    "\002\uffac\005\uffac\006\uffac\012\207\013\uffac\014\uffac\015" +
+    "\uffac\016\uffac\017\uffac\020\uffac\022\uffac\023\uffac\024\uffac" +
+    "\025\uffac\026\uffac\027\uffac\030\uffac\031\uffac\032\uffac\033" +
+    "\uffac\034\uffac\035\uffac\036\uffac\037\uffac\040\uffac\041\uffac" +
+    "\042\uffac\043\uffac\001\002\000\032\003\072\012\061\013" +
+    "\210\042\070\044\055\045\060\047\054\050\077\051\073" +
+    "\052\056\053\063\054\040\001\002\000\070\002\uffa4\005" +
+    "\uffa4\006\uffa4\013\uffa4\014\uffa4\015\uffa4\016\uffa4\017\uffa4" +
+    "\020\uffa4\022\uffa4\023\uffa4\024\uffa4\025\uffa4\026\uffa4\027" +
+    "\uffa4\030\uffa4\031\uffa4\032\uffa4\033\uffa4\034\uffa4\035\uffa4" +
+    "\036\uffa4\037\uffa4\040\uffa4\041\uffa4\042\uffa4\043\uffa4\001" +
+    "\002\000\004\013\212\001\002\000\070\002\uffa3\005\uffa3" +
     "\006\uffa3\013\uffa3\014\uffa3\015\uffa3\016\uffa3\017\uffa3\020" +
     "\uffa3\022\uffa3\023\uffa3\024\uffa3\025\uffa3\026\uffa3\027\uffa3" +
     "\030\uffa3\031\uffa3\032\uffa3\033\uffa3\034\uffa3\035\uffa3\036" +
     "\uffa3\037\uffa3\040\uffa3\041\uffa3\042\uffa3\043\uffa3\001\002" +
-    "\000\004\013\176\001\002\000\070\002\uffa2\005\uffa2\006" +
-    "\uffa2\013\uffa2\014\uffa2\015\uffa2\016\uffa2\017\uffa2\020\uffa2" +
-    "\022\uffa2\023\uffa2\024\uffa2\025\uffa2\026\uffa2\027\uffa2\030" +
-    "\uffa2\031\uffa2\032\uffa2\033\uffa2\034\uffa2\035\uffa2\036\uffa2" +
-    "\037\uffa2\040\uffa2\041\uffa2\042\uffa2\043\uffa2\001\002\000" +
-    "\064\002\uffb7\005\uffb7\006\uffb7\013\uffb7\015\uffb7\016\uffb7" +
-    "\017\uffb7\022\uffb7\023\uffb7\024\uffb7\025\uffb7\026\uffb7\027" +
-    "\uffb7\030\uffb7\031\uffb7\032\uffb7\033\uffb7\034\uffb7\035\uffb7" +
-    "\036\uffb7\037\uffb7\040\uffb7\041\uffb7\042\uffb7\043\uffb7\001" +
-    "\002\000\004\054\023\001\002\000\072\002\uffaf\005\uffaf" +
-    "\006\uffaf\012\202\013\uffaf\014\uffaf\015\uffaf\016\uffaf\017" +
-    "\uffaf\020\uffaf\022\uffaf\023\uffaf\024\uffaf\025\uffaf\026\uffaf" +
-    "\027\uffaf\030\uffaf\031\uffaf\032\uffaf\033\uffaf\034\uffaf\035" +
-    "\uffaf\036\uffaf\037\uffaf\040\uffaf\041\uffaf\042\uffaf\043\uffaf" +
-    "\001\002\000\032\003\103\012\054\013\203\042\063\044" +
-    "\050\045\053\047\047\050\071\051\065\052\051\053\056" +
-    "\054\037\001\002\000\070\002\uffa7\005\uffa7\006\uffa7\013" +
-    "\uffa7\014\uffa7\015\uffa7\016\uffa7\017\uffa7\020\uffa7\022\uffa7" +
-    "\023\uffa7\024\uffa7\025\uffa7\026\uffa7\027\uffa7\030\uffa7\031" +
-    "\uffa7\032\uffa7\033\uffa7\034\uffa7\035\uffa7\036\uffa7\037\uffa7" +
-    "\040\uffa7\041\uffa7\042\uffa7\043\uffa7\001\002\000\004\013" +
-    "\205\001\002\000\070\002\uffa6\005\uffa6\006\uffa6\013\uffa6" +
-    "\014\uffa6\015\uffa6\016\uffa6\017\uffa6\020\uffa6\022\uffa6\023" +
-    "\uffa6\024\uffa6\025\uffa6\026\uffa6\027\uffa6\030\uffa6\031\uffa6" +
-    "\032\uffa6\033\uffa6\034\uffa6\035\uffa6\036\uffa6\037\uffa6\040" +
-    "\uffa6\041\uffa6\042\uffa6\043\uffa6\001\002\000\046\013\207" +
-    "\022\131\024\115\025\111\026\112\027\117\030\126\031" +
-    "\113\032\124\033\116\034\123\035\127\036\122\037\130" +
-    "\040\121\041\114\042\125\043\110\001\002\000\070\002" +
-    "\uff9c\005\uff9c\006\uff9c\013\uff9c\014\uff9c\015\uff9c\016\uff9c" +
-    "\017\uff9c\020\uff9c\022\uff9c\023\uff9c\024\uff9c\025\uff9c\026" +
-    "\uff9c\027\uff9c\030\uff9c\031\uff9c\032\uff9c\033\uff9c\034\uff9c" +
-    "\035\uff9c\036\uff9c\037\uff9c\040\uff9c\041\uff9c\042\uff9c\043" +
-    "\uff9c\001\002\000\064\002\uffb9\005\uffb9\006\uffb9\013\uffb9" +
-    "\015\uffb9\016\uffb9\017\uffb9\022\uffb9\023\uffb9\024\uffb9\025" +
-    "\uffb9\026\uffb9\027\uffb9\030\uffb9\031\uffb9\032\uffb9\033\uffb9" +
-    "\034\uffb9\035\uffb9\036\uffb9\037\uffb9\040\uffb9\041\uffb9\042" +
-    "\uffb9\043\uffb9\001\002\000\032\003\103\012\054\013\212" +
-    "\042\063\044\050\045\053\047\047\050\071\051\065\052" +
-    "\051\053\056\054\037\001\002\000\070\002\uffac\005\uffac" +
-    "\006\uffac\013\uffac\014\uffac\015\uffac\016\uffac\017\uffac\020" +
-    "\uffac\022\uffac\023\uffac\024\uffac\025\uffac\026\uffac\027\uffac" +
-    "\030\uffac\031\uffac\032\uffac\033\uffac\034\uffac\035\uffac\036" +
-    "\uffac\037\uffac\040\uffac\041\uffac\042\uffac\043\uffac\001\002" +
-    "\000\004\013\214\001\002\000\070\002\uffab\005\uffab\006" +
-    "\uffab\013\uffab\014\uffab\015\uffab\016\uffab\017\uffab\020\uffab" +
-    "\022\uffab\023\uffab\024\uffab\025\uffab\026\uffab\027\uffab\030" +
-    "\uffab\031\uffab\032\uffab\033\uffab\034\uffab\035\uffab\036\uffab" +
-    "\037\uffab\040\uffab\041\uffab\042\uffab\043\uffab\001\002\000" +
-    "\064\002\uffba\005\uffba\006\uffba\013\uffba\015\uffba\016\uffba" +
-    "\017\uffba\022\uffba\023\uffba\024\uffba\025\uffba\026\112\027" +
-    "\117\030\126\031\113\032\124\033\116\034\123\035\127" +
-    "\036\122\037\130\040\121\041\114\042\125\043\110\001" +
-    "\002\000\064\002\uffb6\005\uffb6\006\uffb6\013\uffb6\015\uffb6" +
-    "\016\uffb6\017\uffb6\022\uffb6\023\uffb6\024\uffb6\025\uffb6\026" +
-    "\uffb6\027\uffb6\030\uffb6\031\uffb6\032\uffb6\033\uffb6\034\uffb6" +
-    "\035\uffb6\036\uffb6\037\uffb6\040\uffb6\041\uffb6\042\uffb6\043" +
-    "\uffb6\001\002\000\030\003\221\012\054\042\063\044\050" +
-    "\045\053\047\047\050\071\051\065\052\051\053\056\054" +
-    "\037\001\002\000\046\006\uffe5\022\131\024\115\025\111" +
-    "\026\112\027\117\030\126\031\113\032\124\033\116\034" +
-    "\123\035\127\036\122\037\130\040\121\041\114\042\125" +
-    "\043\110\001\002\000\004\006\ufff7\001\002\000\004\006" +
-    "\223\001\002\000\036\003\232\007\230\010\226\011\234" +
-    "\012\054\042\063\044\050\045\053\047\047\050\071\051" +
-    "\065\052\051\053\056\054\037\001\002\000\004\002\uffe0" +
-    "\001\002\000\052\002\uffdd\016\246\017\247\022\131\024" +
-    "\115\025\111\026\112\027\117\030\126\031\113\032\124" +
-    "\033\116\034\123\035\127\036\122\037\130\040\121\041" +
-    "\114\042\125\043\110\001\002\000\030\002\uffdb\012\054" +
-    "\042\063\044\050\045\053\047\047\050\071\051\065\052" +
-    "\051\053\056\054\037\001\002\000\004\002\ufffe\001\002" +
-    "\000\004\002\uffe4\001\002\000\004\002\uffe3\001\002\000" +
-    "\036\002\ufff5\003\244\010\226\011\234\012\054\042\063" +
-    "\044\050\045\053\047\047\050\071\051\065\052\051\053" +
-    "\056\054\037\001\002\000\004\002\uffdf\001\002\000\004" +
-    "\054\037\001\002\000\004\002\uffdc\001\002\000\004\012" +
-    "\237\001\002\000\032\003\103\012\054\013\240\042\063" +
-    "\044\050\045\053\047\047\050\071\051\065\052\051\053" +
-    "\056\054\037\001\002\000\004\002\uffd9\001\002\000\004" +
-    "\013\242\001\002\000\004\002\uffd8\001\002\000\004\002" +
-    "\uffde\001\002\000\034\003\244\010\226\011\234\012\054" +
-    "\042\063\044\050\045\053\047\047\050\071\051\065\052" +
-    "\051\053\056\054\037\001\002\000\046\002\uffda\022\131" +
-    "\024\115\025\111\026\112\027\117\030\126\031\113\032" +
-    "\124\033\116\034\123\035\127\036\122\037\130\040\121" +
-    "\041\114\042\125\043\110\001\002\000\034\003\244\010" +
-    "\226\011\234\012\054\042\063\044\050\045\053\047\047" +
-    "\050\071\051\065\052\051\053\056\054\037\001\002\000" +
-    "\034\003\244\010\226\011\234\012\054\042\063\044\050" +
-    "\045\053\047\047\050\071\051\065\052\051\053\056\054" +
-    "\037\001\002\000\004\002\uffe1\001\002\000\004\002\uffe2" +
-    "\001\002\000\004\006\253\001\002\000\036\003\244\007" +
-    "\230\010\226\011\234\012\054\042\063\044\050\045\053" +
-    "\047\047\050\071\051\065\052\051\053\056\054\037\001" +
-    "\002\000\004\002\ufff6\001\002\000\004\005\256\001\002" +
-    "\000\026\012\054\042\063\044\050\045\053\047\047\050" +
-    "\071\051\065\052\051\053\056\054\037\001\002\000\004" +
-    "\006\260\001\002\000\036\003\244\007\230\010\226\011" +
-    "\234\012\054\042\063\044\050\045\053\047\047\050\071" +
-    "\051\065\052\051\053\056\054\037\001\002\000\004\002" +
-    "\ufff8\001\002\000\004\006\ufff0\001\002\000\004\006\264" +
-    "\001\002\000\036\003\266\007\230\010\226\011\234\012" +
-    "\054\042\063\044\050\045\053\047\047\050\071\051\065" +
-    "\052\051\053\056\054\037\001\002\000\004\002\ufff4\001" +
-    "\002\000\036\002\uffee\003\244\010\226\011\234\012\054" +
-    "\042\063\044\050\045\053\047\047\050\071\051\065\052" +
-    "\051\053\056\054\037\001\002\000\004\006\270\001\002" +
-    "\000\036\003\244\007\230\010\226\011\234\012\054\042" +
-    "\063\044\050\045\053\047\047\050\071\051\065\052\051" +
-    "\053\056\054\037\001\002\000\004\002\uffef\001\002" });
+    "\000\046\013\214\022\134\024\117\025\113\026\114\027" +
+    "\122\030\131\031\115\032\130\033\121\034\126\035\132" +
+    "\036\125\037\133\040\124\041\116\042\127\043\112\001" +
+    "\002\000\070\002\uff99\005\uff99\006\uff99\013\uff99\014\uff99" +
+    "\015\uff99\016\uff99\017\uff99\020\uff99\022\uff99\023\uff99\024" +
+    "\uff99\025\uff99\026\uff99\027\uff99\030\uff99\031\uff99\032\uff99" +
+    "\033\uff99\034\uff99\035\uff99\036\uff99\037\uff99\040\uff99\041" +
+    "\uff99\042\uff99\043\uff99\001\002\000\064\002\uffb7\005\uffb7" +
+    "\006\uffb7\013\uffb7\015\uffb7\016\uffb7\017\uffb7\022\uffb7\023" +
+    "\uffb7\024\uffb7\025\uffb7\026\uffb7\027\uffb7\030\uffb7\031\uffb7" +
+    "\032\uffb7\033\uffb7\034\uffb7\035\uffb7\036\uffb7\037\uffb7\040" +
+    "\uffb7\041\uffb7\042\uffb7\043\uffb7\001\002\000\064\002\uffb4" +
+    "\005\uffb4\006\uffb4\013\uffb4\015\uffb4\016\uffb4\017\uffb4\022" +
+    "\uffb4\023\uffb4\024\uffb4\025\uffb4\026\uffb4\027\uffb4\030\uffb4" +
+    "\031\uffb4\032\uffb4\033\uffb4\034\uffb4\035\uffb4\036\uffb4\037" +
+    "\uffb4\040\uffb4\041\uffb4\042\uffb4\043\uffb4\001\002\000\032" +
+    "\003\072\012\061\013\220\042\070\044\055\045\060\047" +
+    "\054\050\077\051\073\052\056\053\063\054\040\001\002" +
+    "\000\070\002\uffa9\005\uffa9\006\uffa9\013\uffa9\014\uffa9\015" +
+    "\uffa9\016\uffa9\017\uffa9\020\uffa9\022\uffa9\023\uffa9\024\uffa9" +
+    "\025\uffa9\026\uffa9\027\uffa9\030\uffa9\031\uffa9\032\uffa9\033" +
+    "\uffa9\034\uffa9\035\uffa9\036\uffa9\037\uffa9\040\uffa9\041\uffa9" +
+    "\042\uffa9\043\uffa9\001\002\000\004\013\222\001\002\000" +
+    "\070\002\uffa8\005\uffa8\006\uffa8\013\uffa8\014\uffa8\015\uffa8" +
+    "\016\uffa8\017\uffa8\020\uffa8\022\uffa8\023\uffa8\024\uffa8\025" +
+    "\uffa8\026\uffa8\027\uffa8\030\uffa8\031\uffa8\032\uffa8\033\uffa8" +
+    "\034\uffa8\035\uffa8\036\uffa8\037\uffa8\040\uffa8\041\uffa8\042" +
+    "\uffa8\043\uffa8\001\002\000\064\002\uffb8\005\uffb8\006\uffb8" +
+    "\013\uffb8\015\uffb8\016\uffb8\017\uffb8\022\uffb8\023\uffb8\024" +
+    "\uffb8\025\uffb8\026\114\027\122\030\131\031\115\032\130" +
+    "\033\121\034\126\035\132\036\125\037\133\040\124\041" +
+    "\116\042\127\043\112\001\002\000\064\002\uffb3\005\uffb3" +
+    "\006\uffb3\013\uffb3\015\uffb3\016\uffb3\017\uffb3\022\uffb3\023" +
+    "\uffb3\024\uffb3\025\uffb3\026\uffb3\027\uffb3\030\uffb3\031\uffb3" +
+    "\032\uffb3\033\uffb3\034\uffb3\035\uffb3\036\uffb3\037\uffb3\040" +
+    "\uffb3\041\uffb3\042\uffb3\043\uffb3\001\002\000\030\003\227" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\046\006\uffe1" +
+    "\022\134\024\117\025\113\026\114\027\122\030\131\031" +
+    "\115\032\130\033\121\034\126\035\132\036\125\037\133" +
+    "\040\124\041\116\042\127\043\112\001\002\000\032\003" +
+    "\072\006\ufff7\012\061\042\070\044\055\045\060\047\054" +
+    "\050\077\051\073\052\056\053\063\054\040\001\002\000" +
+    "\004\006\231\001\002\000\036\003\240\007\236\010\234" +
+    "\011\241\012\061\042\070\044\055\045\060\047\054\050" +
+    "\077\051\073\052\056\053\063\054\040\001\002\000\004" +
+    "\002\uffdc\001\002\000\052\002\uffdb\016\251\017\252\022" +
+    "\134\024\117\025\113\026\114\027\122\030\131\031\115" +
+    "\032\130\033\121\034\126\035\132\036\125\037\133\040" +
+    "\124\041\116\042\127\043\112\001\002\000\032\002\uffd9" +
+    "\003\072\012\061\042\070\044\055\045\060\047\054\050" +
+    "\077\051\073\052\056\053\063\054\040\001\002\000\004" +
+    "\002\ufffe\001\002\000\004\002\uffe0\001\002\000\004\002" +
+    "\uffdf\001\002\000\032\002\ufff5\003\072\012\061\042\070" +
+    "\044\055\045\060\047\054\050\077\051\073\052\056\053" +
+    "\063\054\040\001\002\000\004\054\040\001\002\000\004" +
+    "\002\uffda\001\002\000\004\012\244\001\002\000\032\003" +
+    "\072\012\061\013\245\042\070\044\055\045\060\047\054" +
+    "\050\077\051\073\052\056\053\063\054\040\001\002\000" +
+    "\004\002\uffd7\001\002\000\004\013\247\001\002\000\004" +
+    "\002\uffd6\001\002\000\046\002\uffd8\022\134\024\117\025" +
+    "\113\026\114\027\122\030\131\031\115\032\130\033\121" +
+    "\034\126\035\132\036\125\037\133\040\124\041\116\042" +
+    "\127\043\112\001\002\000\034\003\072\010\234\011\241" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\034\003\072" +
+    "\010\234\011\241\012\061\042\070\044\055\045\060\047" +
+    "\054\050\077\051\073\052\056\053\063\054\040\001\002" +
+    "\000\004\002\uffdd\001\002\000\004\002\uffde\001\002\000" +
+    "\004\006\256\001\002\000\036\003\072\007\236\010\234" +
+    "\011\241\012\061\042\070\044\055\045\060\047\054\050" +
+    "\077\051\073\052\056\053\063\054\040\001\002\000\004" +
+    "\002\ufff6\001\002\000\004\005\261\001\002\000\030\003" +
+    "\072\012\061\042\070\044\055\045\060\047\054\050\077" +
+    "\051\073\052\056\053\063\054\040\001\002\000\004\006" +
+    "\263\001\002\000\036\003\072\007\236\010\234\011\241" +
+    "\012\061\042\070\044\055\045\060\047\054\050\077\051" +
+    "\073\052\056\053\063\054\040\001\002\000\004\002\ufff8" +
+    "\001\002\000\032\003\072\006\ufff0\012\061\042\070\044" +
+    "\055\045\060\047\054\050\077\051\073\052\056\053\063" +
+    "\054\040\001\002\000\004\006\267\001\002\000\036\003" +
+    "\271\007\236\010\234\011\241\012\061\042\070\044\055" +
+    "\045\060\047\054\050\077\051\073\052\056\053\063\054" +
+    "\040\001\002\000\004\002\ufff4\001\002\000\032\002\uffee" +
+    "\003\072\012\061\042\070\044\055\045\060\047\054\050" +
+    "\077\051\073\052\056\053\063\054\040\001\002\000\004" +
+    "\006\273\001\002\000\036\003\072\007\236\010\234\011" +
+    "\241\012\061\042\070\044\055\045\060\047\054\050\077" +
+    "\051\073\052\056\053\063\054\040\001\002\000\004\002" +
+    "\uffef\001\002" });
 
   /** Access to parse-action table. */
   public short[][] action_table() {return _action_table;}
@@ -478,165 +496,166 @@
   /** <code>reduce_goto</code> table. */
   protected static final short[][] _reduce_table = 
     unpackFromStrings(new String[] {
-    "\000\267\000\026\003\016\004\006\005\011\037\010\040" +
-    "\007\041\003\042\012\043\015\044\005\045\004\001\001" +
+    "\000\272\000\026\003\016\004\006\005\011\041\010\042" +
+    "\007\043\003\044\012\045\015\046\005\047\004\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
     "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
-    "\001\001\000\002\001\001\000\034\012\262\020\217\021" +
-    "\061\022\056\023\066\024\065\025\045\026\057\027\067" +
-    "\030\063\031\054\035\051\036\060\001\001\000\014\006" +
-    "\023\007\027\010\026\011\024\035\025\001\001\000\002" +
+    "\001\001\000\002\001\001\000\034\012\265\020\225\021" +
+    "\066\022\063\023\074\024\073\025\052\026\064\027\075" +
+    "\030\070\031\061\037\056\040\065\001\001\000\014\006" +
+    "\023\007\027\010\026\011\024\037\025\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\004\050" +
-    "\254\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\257\001\001\000\002\001\001\000\002\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
     "\001\000\002\001\001\000\012\007\033\010\026\011\024" +
-    "\035\025\001\001\000\012\007\032\010\026\011\024\035" +
-    "\025\001\001\000\002\001\001\000\002\001\001\000\010" +
-    "\034\035\035\040\036\037\001\001\000\002\001\001\000" +
-    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
-    "\001\001\000\002\001\001\000\032\020\044\021\061\022" +
-    "\056\023\066\024\065\025\045\026\057\027\067\030\063" +
-    "\031\054\035\051\036\060\001\001\000\002\001\001\000" +
-    "\006\032\215\033\073\001\001\000\002\001\001\000\032" +
-    "\020\214\021\061\022\056\023\066\024\065\025\045\026" +
-    "\057\027\067\030\063\031\054\035\051\036\060\001\001" +
-    "\000\002\001\001\000\002\001\001\000\032\020\207\021" +
-    "\061\022\056\023\066\024\065\025\045\026\057\027\067" +
-    "\030\063\031\054\035\051\036\060\001\001\000\032\020" +
-    "\205\021\061\022\056\023\066\024\065\025\045\026\057" +
-    "\027\067\030\063\031\054\035\051\036\060\001\001\000" +
-    "\006\032\176\033\073\001\001\000\002\001\001\000\002" +
+    "\037\025\001\001\000\012\007\032\010\026\011\024\037" +
+    "\025\001\001\000\002\001\001\000\002\001\001\000\012" +
+    "\034\036\036\035\037\041\040\040\001\001\000\004\035" +
+    "\045\001\001\000\002\001\001\000\002\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\032\020\160\021\061\022\056\023\066\024\065" +
-    "\025\045\026\057\027\067\030\063\031\054\035\051\036" +
-    "\060\001\001\000\002\001\001\000\002\001\001\000\002" +
-    "\001\001\000\002\001\001\000\006\032\072\033\073\001" +
-    "\001\000\002\001\001\000\032\020\156\021\061\022\056" +
-    "\023\066\024\065\025\045\026\057\027\067\030\063\031" +
-    "\054\035\051\036\060\001\001\000\002\001\001\000\006" +
-    "\032\155\033\073\001\001\000\004\035\075\001\001\000" +
-    "\002\001\001\000\036\017\103\020\077\021\061\022\056" +
-    "\023\066\024\065\025\045\026\057\027\067\030\063\031" +
-    "\054\035\051\036\060\047\101\001\001\000\002\001\001" +
+    "\001\000\002\001\001\000\002\001\001\000\004\035\047" +
+    "\001\001\000\002\001\001\000\032\020\051\021\066\022" +
+    "\063\023\074\024\073\025\052\026\064\027\075\030\070" +
+    "\031\061\037\056\040\065\001\001\000\002\001\001\000" +
+    "\006\032\223\033\101\001\001\000\002\001\001\000\032" +
+    "\020\222\021\066\022\063\023\074\024\073\025\052\026" +
+    "\064\027\075\030\070\031\061\037\056\040\065\001\001" +
+    "\000\002\001\001\000\006\032\215\033\101\001\001\000" +
+    "\032\020\214\021\066\022\063\023\074\024\073\025\052" +
+    "\026\064\027\075\030\070\031\061\037\056\040\065\001" +
+    "\001\000\032\020\212\021\066\022\063\023\074\024\073" +
+    "\025\052\026\064\027\075\030\070\031\061\037\056\040" +
+    "\065\001\001\000\006\032\203\033\101\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\032\020\165\021\066\022\063" +
+    "\023\074\024\073\025\052\026\064\027\075\030\070\031" +
+    "\061\037\056\040\065\001\001\000\002\001\001\000\032" +
+    "\020\164\021\066\022\063\023\074\024\073\025\052\026" +
+    "\064\027\075\030\070\031\061\037\056\040\065\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
-    "\002\001\001\000\002\001\001\000\036\017\106\020\077" +
-    "\021\061\022\056\023\066\024\065\025\045\026\057\027" +
-    "\067\030\063\031\054\035\051\036\060\047\101\001\001" +
-    "\000\002\001\001\000\032\020\154\021\061\022\056\023" +
-    "\066\024\065\025\045\026\057\027\067\030\063\031\054" +
-    "\035\051\036\060\001\001\000\032\020\153\021\061\022" +
-    "\056\023\066\024\065\025\045\026\057\027\067\030\063" +
-    "\031\054\035\051\036\060\001\001\000\032\020\152\021" +
-    "\061\022\056\023\066\024\065\025\045\026\057\027\067" +
-    "\030\063\031\054\035\051\036\060\001\001\000\032\020" +
-    "\151\021\061\022\056\023\066\024\065\025\045\026\057" +
-    "\027\067\030\063\031\054\035\051\036\060\001\001\000" +
-    "\032\020\150\021\061\022\056\023\066\024\065\025\045" +
-    "\026\057\027\067\030\063\031\054\035\051\036\060\001" +
-    "\001\000\032\020\147\021\061\022\056\023\066\024\065" +
-    "\025\045\026\057\027\067\030\063\031\054\035\051\036" +
-    "\060\001\001\000\032\020\146\021\061\022\056\023\066" +
-    "\024\065\025\045\026\057\027\067\030\063\031\054\035" +
-    "\051\036\060\001\001\000\032\020\145\021\061\022\056" +
-    "\023\066\024\065\025\045\026\057\027\067\030\063\031" +
-    "\054\035\051\036\060\001\001\000\036\017\144\020\077" +
-    "\021\061\022\056\023\066\024\065\025\045\026\057\027" +
-    "\067\030\063\031\054\035\051\036\060\047\101\001\001" +
-    "\000\032\020\143\021\061\022\056\023\066\024\065\025" +
-    "\045\026\057\027\067\030\063\031\054\035\051\036\060" +
-    "\001\001\000\032\020\142\021\061\022\056\023\066\024" +
-    "\065\025\045\026\057\027\067\030\063\031\054\035\051" +
-    "\036\060\001\001\000\032\020\141\021\061\022\056\023" +
-    "\066\024\065\025\045\026\057\027\067\030\063\031\054" +
-    "\035\051\036\060\001\001\000\032\020\140\021\061\022" +
-    "\056\023\066\024\065\025\045\026\057\027\067\030\063" +
-    "\031\054\035\051\036\060\001\001\000\032\020\137\021" +
-    "\061\022\056\023\066\024\065\025\045\026\057\027\067" +
-    "\030\063\031\054\035\051\036\060\001\001\000\032\020" +
-    "\136\021\061\022\056\023\066\024\065\025\045\026\057" +
-    "\027\067\030\063\031\054\035\051\036\060\001\001\000" +
-    "\032\020\135\021\061\022\056\023\066\024\065\025\045" +
-    "\026\057\027\067\030\063\031\054\035\051\036\060\001" +
-    "\001\000\032\020\134\021\061\022\056\023\066\024\065" +
-    "\025\045\026\057\027\067\030\063\031\054\035\051\036" +
-    "\060\001\001\000\032\020\131\021\061\022\056\023\066" +
-    "\024\065\025\045\026\057\027\067\030\063\031\054\035" +
-    "\051\036\060\001\001\000\002\001\001\000\032\020\133" +
-    "\021\061\022\056\023\066\024\065\025\045\026\057\027" +
-    "\067\030\063\031\054\035\051\036\060\001\001\000\002" +
+    "\006\032\100\033\101\001\001\000\002\001\001\000\032" +
+    "\020\162\021\066\022\063\023\074\024\073\025\052\026" +
+    "\064\027\075\030\070\031\061\037\056\040\065\001\001" +
+    "\000\002\001\001\000\006\032\161\033\101\001\001\000" +
+    "\004\037\103\001\001\000\002\001\001\000\034\017\107" +
+    "\020\105\021\066\022\063\023\074\024\073\025\052\026" +
+    "\064\027\075\030\070\031\061\037\056\040\065\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\032\020\160\021\066\022\063\023\074" +
+    "\024\073\025\052\026\064\027\075\030\070\031\061\037" +
+    "\056\040\065\001\001\000\032\020\157\021\066\022\063" +
+    "\023\074\024\073\025\052\026\064\027\075\030\070\031" +
+    "\061\037\056\040\065\001\001\000\032\020\156\021\066" +
+    "\022\063\023\074\024\073\025\052\026\064\027\075\030" +
+    "\070\031\061\037\056\040\065\001\001\000\032\020\155" +
+    "\021\066\022\063\023\074\024\073\025\052\026\064\027" +
+    "\075\030\070\031\061\037\056\040\065\001\001\000\032" +
+    "\020\154\021\066\022\063\023\074\024\073\025\052\026" +
+    "\064\027\075\030\070\031\061\037\056\040\065\001\001" +
+    "\000\032\020\153\021\066\022\063\023\074\024\073\025" +
+    "\052\026\064\027\075\030\070\031\061\037\056\040\065" +
+    "\001\001\000\034\017\152\020\105\021\066\022\063\023" +
+    "\074\024\073\025\052\026\064\027\075\030\070\031\061" +
+    "\037\056\040\065\001\001\000\032\020\151\021\066\022" +
+    "\063\023\074\024\073\025\052\026\064\027\075\030\070" +
+    "\031\061\037\056\040\065\001\001\000\032\020\150\021" +
+    "\066\022\063\023\074\024\073\025\052\026\064\027\075" +
+    "\030\070\031\061\037\056\040\065\001\001\000\034\017" +
+    "\147\020\105\021\066\022\063\023\074\024\073\025\052" +
+    "\026\064\027\075\030\070\031\061\037\056\040\065\001" +
+    "\001\000\032\020\146\021\066\022\063\023\074\024\073" +
+    "\025\052\026\064\027\075\030\070\031\061\037\056\040" +
+    "\065\001\001\000\032\020\145\021\066\022\063\023\074" +
+    "\024\073\025\052\026\064\027\075\030\070\031\061\037" +
+    "\056\040\065\001\001\000\032\020\144\021\066\022\063" +
+    "\023\074\024\073\025\052\026\064\027\075\030\070\031" +
+    "\061\037\056\040\065\001\001\000\032\020\143\021\066" +
+    "\022\063\023\074\024\073\025\052\026\064\027\075\030" +
+    "\070\031\061\037\056\040\065\001\001\000\032\020\142" +
+    "\021\066\022\063\023\074\024\073\025\052\026\064\027" +
+    "\075\030\070\031\061\037\056\040\065\001\001\000\032" +
+    "\020\141\021\066\022\063\023\074\024\073\025\052\026" +
+    "\064\027\075\030\070\031\061\037\056\040\065\001\001" +
+    "\000\032\020\140\021\066\022\063\023\074\024\073\025" +
+    "\052\026\064\027\075\030\070\031\061\037\056\040\065" +
+    "\001\001\000\032\020\137\021\066\022\063\023\074\024" +
+    "\073\025\052\026\064\027\075\030\070\031\061\037\056" +
+    "\040\065\001\001\000\032\020\134\021\066\022\063\023" +
+    "\074\024\073\025\052\026\064\027\075\030\070\031\061" +
+    "\037\056\040\065\001\001\000\002\001\001\000\032\020" +
+    "\136\021\066\022\063\023\074\024\073\025\052\026\064" +
+    "\027\075\030\070\031\061\037\056\040\065\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
     "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
     "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
     "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
-    "\000\002\001\001\000\002\001\001\000\004\035\163\001" +
-    "\001\000\002\001\001\000\002\001\001\000\036\017\166" +
-    "\020\077\021\061\022\056\023\066\024\065\025\045\026" +
-    "\057\027\067\030\063\031\054\035\051\036\060\047\101" +
-    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\004\035\171\001\001\000\002\001\001\000\036" +
-    "\017\174\020\077\021\061\022\056\023\066\024\065\025" +
-    "\045\026\057\027\067\030\063\031\054\035\051\036\060" +
-    "\047\101\001\001\000\002\001\001\000\002\001\001\000" +
-    "\002\001\001\000\002\001\001\000\004\035\200\001\001" +
-    "\000\002\001\001\000\036\017\203\020\077\021\061\022" +
-    "\056\023\066\024\065\025\045\026\057\027\067\030\063" +
-    "\031\054\035\051\036\060\047\101\001\001\000\002\001" +
+    "\000\002\001\001\000\004\037\170\001\001\000\002\001" +
+    "\001\000\002\001\001\000\034\017\173\020\105\021\066" +
+    "\022\063\023\074\024\073\025\052\026\064\027\075\030" +
+    "\070\031\061\037\056\040\065\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\004\037\176\001" +
+    "\001\000\002\001\001\000\034\017\201\020\105\021\066" +
+    "\022\063\023\074\024\073\025\052\026\064\027\075\030" +
+    "\070\031\061\037\056\040\065\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\004\037\205\001\001\000\002\001\001\000\034\017\210" +
+    "\020\105\021\066\022\063\023\074\024\073\025\052\026" +
+    "\064\027\075\030\070\031\061\037\056\040\065\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\034\017\220\020\105\021\066\022\063\023" +
+    "\074\024\073\025\052\026\064\027\075\030\070\031\061" +
+    "\037\056\040\065\001\001\000\002\001\001\000\002\001" +
     "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
-    "\000\002\001\001\000\002\001\001\000\036\017\212\020" +
-    "\077\021\061\022\056\023\066\024\065\025\045\026\057" +
-    "\027\067\030\063\031\054\035\051\036\060\047\101\001" +
-    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
-    "\000\002\001\001\000\002\001\001\000\034\012\221\020" +
-    "\217\021\061\022\056\023\066\024\065\025\045\026\057" +
-    "\027\067\030\063\031\054\035\051\036\060\001\001\000" +
-    "\002\001\001\000\004\051\251\001\001\000\002\001\001" +
-    "\000\044\013\226\014\230\015\223\016\234\020\224\021" +
-    "\061\022\056\023\066\024\065\025\045\026\057\027\067" +
-    "\030\063\031\054\035\051\036\060\046\232\001\001\000" +
-    "\002\001\001\000\002\001\001\000\032\020\244\021\061" +
-    "\022\056\023\066\024\065\025\045\026\057\027\067\030" +
-    "\063\031\054\035\051\036\060\001\001\000\002\001\001" +
-    "\000\002\001\001\000\002\001\001\000\042\014\242\015" +
-    "\223\016\234\020\224\021\061\022\056\023\066\024\065" +
-    "\025\045\026\057\027\067\030\063\031\054\035\051\036" +
-    "\060\046\232\001\001\000\002\001\001\000\010\034\235" +
-    "\035\040\036\037\001\001\000\002\001\001\000\002\001" +
-    "\001\000\036\017\240\020\077\021\061\022\056\023\066" +
-    "\024\065\025\045\026\057\027\067\030\063\031\054\035" +
-    "\051\036\060\047\101\001\001\000\002\001\001\000\002" +
-    "\001\001\000\002\001\001\000\002\001\001\000\042\014" +
-    "\242\015\223\016\234\020\224\021\061\022\056\023\066" +
-    "\024\065\025\045\026\057\027\067\030\063\031\054\035" +
-    "\051\036\060\046\232\001\001\000\002\001\001\000\042" +
-    "\014\250\015\223\016\234\020\224\021\061\022\056\023" +
-    "\066\024\065\025\045\026\057\027\067\030\063\031\054" +
-    "\035\051\036\060\046\232\001\001\000\042\014\247\015" +
-    "\223\016\234\020\224\021\061\022\056\023\066\024\065" +
-    "\025\045\026\057\027\067\030\063\031\054\035\051\036" +
-    "\060\046\232\001\001\000\002\001\001\000\002\001\001" +
-    "\000\002\001\001\000\044\013\253\014\230\015\223\016" +
-    "\234\020\224\021\061\022\056\023\066\024\065\025\045" +
-    "\026\057\027\067\030\063\031\054\035\051\036\060\046" +
-    "\232\001\001\000\002\001\001\000\002\001\001\000\034" +
-    "\012\256\020\217\021\061\022\056\023\066\024\065\025" +
-    "\045\026\057\027\067\030\063\031\054\035\051\036\060" +
-    "\001\001\000\002\001\001\000\044\013\260\014\230\015" +
-    "\223\016\234\020\224\021\061\022\056\023\066\024\065" +
-    "\025\045\026\057\027\067\030\063\031\054\035\051\036" +
-    "\060\046\232\001\001\000\002\001\001\000\004\052\266" +
-    "\001\001\000\002\001\001\000\044\013\264\014\230\015" +
-    "\223\016\234\020\224\021\061\022\056\023\066\024\065" +
-    "\025\045\026\057\027\067\030\063\031\054\035\051\036" +
-    "\060\046\232\001\001\000\002\001\001\000\042\014\242" +
-    "\015\223\016\234\020\224\021\061\022\056\023\066\024" +
-    "\065\025\045\026\057\027\067\030\063\031\054\035\051" +
-    "\036\060\046\232\001\001\000\002\001\001\000\044\013" +
-    "\270\014\230\015\223\016\234\020\224\021\061\022\056" +
-    "\023\066\024\065\025\045\026\057\027\067\030\063\031" +
-    "\054\035\051\036\060\046\232\001\001\000\002\001\001" +
-    "" });
+    "\000\034\012\227\020\225\021\066\022\063\023\074\024" +
+    "\073\025\052\026\064\027\075\030\070\031\061\037\056" +
+    "\040\065\001\001\000\002\001\001\000\034\020\164\021" +
+    "\066\022\063\023\074\024\073\025\052\026\064\027\075" +
+    "\030\070\031\061\037\056\040\065\051\254\001\001\000" +
+    "\002\001\001\000\042\013\234\014\236\015\231\016\241" +
+    "\020\232\021\066\022\063\023\074\024\073\025\052\026" +
+    "\064\027\075\030\070\031\061\037\056\040\065\001\001" +
+    "\000\002\001\001\000\002\001\001\000\032\020\247\021" +
+    "\066\022\063\023\074\024\073\025\052\026\064\027\075" +
+    "\030\070\031\061\037\056\040\065\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\032\020\164" +
+    "\021\066\022\063\023\074\024\073\025\052\026\064\027" +
+    "\075\030\070\031\061\037\056\040\065\001\001\000\010" +
+    "\036\242\037\041\040\040\001\001\000\002\001\001\000" +
+    "\002\001\001\000\034\017\245\020\105\021\066\022\063" +
+    "\023\074\024\073\025\052\026\064\027\075\030\070\031" +
+    "\061\037\056\040\065\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\040\014" +
+    "\253\015\231\016\241\020\232\021\066\022\063\023\074" +
+    "\024\073\025\052\026\064\027\075\030\070\031\061\037" +
+    "\056\040\065\001\001\000\040\014\252\015\231\016\241" +
+    "\020\232\021\066\022\063\023\074\024\073\025\052\026" +
+    "\064\027\075\030\070\031\061\037\056\040\065\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\042\013\256\014\236\015\231\016\241\020\232\021\066" +
+    "\022\063\023\074\024\073\025\052\026\064\027\075\030" +
+    "\070\031\061\037\056\040\065\001\001\000\002\001\001" +
+    "\000\002\001\001\000\034\012\261\020\225\021\066\022" +
+    "\063\023\074\024\073\025\052\026\064\027\075\030\070" +
+    "\031\061\037\056\040\065\001\001\000\002\001\001\000" +
+    "\042\013\263\014\236\015\231\016\241\020\232\021\066" +
+    "\022\063\023\074\024\073\025\052\026\064\027\075\030" +
+    "\070\031\061\037\056\040\065\001\001\000\002\001\001" +
+    "\000\034\020\164\021\066\022\063\023\074\024\073\025" +
+    "\052\026\064\027\075\030\070\031\061\037\056\040\065" +
+    "\052\271\001\001\000\002\001\001\000\042\013\267\014" +
+    "\236\015\231\016\241\020\232\021\066\022\063\023\074" +
+    "\024\073\025\052\026\064\027\075\030\070\031\061\037" +
+    "\056\040\065\001\001\000\002\001\001\000\032\020\164" +
+    "\021\066\022\063\023\074\024\073\025\052\026\064\027" +
+    "\075\030\070\031\061\037\056\040\065\001\001\000\002" +
+    "\001\001\000\042\013\273\014\236\015\231\016\241\020" +
+    "\232\021\066\022\063\023\074\024\073\025\052\026\064" +
+    "\027\075\030\070\031\061\037\056\040\065\001\001\000" +
+    "\002\001\001" });
 
   /** Access to <code>reduce_goto</code> table. */
   public short[][] reduce_table() {return _reduce_table;}
@@ -687,45 +706,67 @@
 
   private String file = "";
   private int errorCount = 0;
+  private StringBuffer errorBuffer = new StringBuffer();
 
   public void setFile(String file)
   {
     this.file = file;
   }
 
-  public void error(String message, int line, int col)
-  {
-        errorCount++;
-        System.out.println(file + " line " + line + " : " + message);
-  }
-
-  /** Report a non fatal error (or warning).  This method takes a message
-   *  string and an additional object (to be used by specializations
-   *  implemented in subclasses).  Here in the base class a very simple
-   *  implementation is provided which simply prints the message to
-   *  System.err.
+  /**
+   * Called by the parser when it detects a syntax error. This is overridden so
+   * that it does nothing. Instead the parser relies upon explicit calls to routine
+   * error(String) or error(String, int line, int column) which store details of
+   * synatx errors into an error buffer for retrieval after the parse call completes.
    *
    * @param message an error message.
    * @param info    an extra object reserved for use by specialized subclasses.
    */
+
   public void report_error(String message, Object info)
   {
-      /*
-      if (info instanceof Symbol) {
-          Symbol sym = (Symbol)info;
-          System.err.println(message + " at line " + sym.left +  " character " + sym.right);
-      } else {
-          System.err.println(message);
+  }
+
+  /**
+   * Called by the parser when it is unable to recover from one or more syntax errors
+   *
+   * @param cur_token the token current at the point in the token stream where the recovery
+   * process fails
+   */
+
+  public void unrecovered_syntax_error(Symbol cur_token)
+  {
+      int line = cur_token.left;
+      errorCount++;
+      errorBuffer.append('\n');
+      errorBuffer.append(file);
+      if (line >= 0) {
+          errorBuffer.append(" line ");
+          errorBuffer.append(cur_token.left);
       }
-      */
+      errorBuffer.append(" : unable to recover from previous errors");
   }
 
   public void error(String message)
   {
         errorCount++;
-        System.out.println(file + " : " + message);
+        errorBuffer.append('\n');
+        errorBuffer.append(file);
+        errorBuffer.append(" : ");
+        errorBuffer.append(message);
   }
 
+  public void error(String message, int line, int col)
+  {
+        errorCount++;
+        errorBuffer.append('\n');
+        errorBuffer.append(file);
+        errorBuffer.append(" line ");
+        errorBuffer.append(line);
+        errorBuffer.append(" : ");
+        errorBuffer.append(message);
+  }
+
   public String getFile()
   {
     return file;
@@ -736,6 +777,11 @@
     return errorCount;
   }
 
+  public String getErrors()
+  {
+    return errorBuffer.toString();
+  }
+
   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
 
   /** Do debug output for a reduce.
@@ -834,7 +880,7 @@
       switch (CUP$ECAGrammarParser$act_num)
         {
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 106: // path ::= path DOT IDENTIFIER 
+          case 109: // path ::= path DOT IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -844,36 +890,36 @@
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		String i = (String)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.PATH, ileft, iright, i, p); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(28/*path*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(30/*path*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 105: // path ::= IDENTIFIER 
+          case 108: // path ::= IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		String i = (String)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.PATH, ileft, iright, i, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(28/*path*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(30/*path*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 104: // simple_name ::= IDENTIFIER 
+          case 107: // simple_name ::= IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		String i = (String)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.IDENTIFIER, ileft, iright, i, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(27/*simple_name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(29/*simple_name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 103: // name ::= path DOT IDENTIFIER 
+          case 106: // name ::= path DOT IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -883,24 +929,24 @@
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		String i = (String)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.IDENTIFIER, ileft, iright, i, p); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(26/*name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(28/*name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 102: // name ::= simple_name 
+          case 105: // name ::= simple_name 
             {
               ParseNode RESULT = null;
 		int nleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int nright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode n = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = n; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(26/*name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(28/*name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 101: // simple_expr ::= LPAREN expr RPAREN 
+          case 104: // simple_expr ::= LPAREN expr RPAREN 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -912,7 +958,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 100: // simple_expr ::= DOLLAR 
+          case 103: // simple_expr ::= DOLLAR 
             {
               ParseNode RESULT = null;
 		int sleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -924,7 +970,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 99: // simple_expr ::= STRING_LITERAL 
+          case 102: // simple_expr ::= STRING_LITERAL 
             {
               ParseNode RESULT = null;
 		int sleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -936,7 +982,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 98: // simple_expr ::= BOOLEAN_LITERAL 
+          case 101: // simple_expr ::= BOOLEAN_LITERAL 
             {
               ParseNode RESULT = null;
 		int bleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -948,7 +994,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 97: // simple_expr ::= FLOAT_LITERAL 
+          case 100: // simple_expr ::= FLOAT_LITERAL 
             {
               ParseNode RESULT = null;
 		int fleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -960,7 +1006,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 96: // simple_expr ::= INTEGER_LITERAL 
+          case 99: // simple_expr ::= INTEGER_LITERAL 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -972,7 +1018,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 95: // expr_meth_expr ::= expr_field_expr DOT simple_name LPAREN expr_list RPAREN 
+          case 98: // expr_meth_expr ::= expr_field_expr DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int efeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -990,7 +1036,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 94: // expr_meth_expr ::= expr_field_expr DOT simple_name LPAREN RPAREN 
+          case 97: // expr_meth_expr ::= expr_field_expr DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int efeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -1005,7 +1051,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 93: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN expr_list RPAREN 
+          case 96: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int emeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -1023,7 +1069,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 92: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN RPAREN 
+          case 95: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int emeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -1038,7 +1084,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 91: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN expr_list RPAREN 
+          case 94: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -1056,7 +1102,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 90: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN RPAREN 
+          case 93: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -1071,7 +1117,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 89: // meth_expr ::= expr_meth_expr 
+          case 92: // meth_expr ::= expr_meth_expr 
             {
               ParseNode RESULT = null;
 		int emeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1083,7 +1129,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 88: // meth_expr ::= path DOT simple_name LPAREN expr_list RPAREN 
+          case 91: // meth_expr ::= path DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -1101,7 +1147,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 87: // meth_expr ::= path DOT simple_name LPAREN RPAREN 
+          case 90: // meth_expr ::= path DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -1116,7 +1162,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 86: // meth_expr ::= simple_name LPAREN expr_list RPAREN 
+          case 89: // meth_expr ::= simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int mleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left;
@@ -1131,7 +1177,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 85: // meth_expr ::= simple_name LPAREN RPAREN 
+          case 88: // meth_expr ::= simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int mleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1143,7 +1189,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 84: // expr_field_expr ::= expr_field_expr DOT simple_name 
+          case 87: // expr_field_expr ::= expr_field_expr DOT simple_name 
             {
               ParseNode RESULT = null;
 		int efeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1158,7 +1204,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 83: // expr_field_expr ::= meth_expr DOT simple_name 
+          case 86: // expr_field_expr ::= meth_expr DOT simple_name 
             {
               ParseNode RESULT = null;
 		int meleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1173,7 +1219,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 82: // expr_field_expr ::= simple_expr DOT simple_name 
+          case 85: // expr_field_expr ::= simple_expr DOT simple_name 
             {
               ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1188,7 +1234,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 81: // field_expr ::= expr_field_expr 
+          case 84: // field_expr ::= expr_field_expr 
             {
               ParseNode RESULT = null;
 		int efeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1200,7 +1246,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 80: // field_expr ::= path DOT simple_name 
+          case 83: // field_expr ::= path DOT simple_name 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1215,7 +1261,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 79: // array_idx ::= LSQUARE expr RSQUARE 
+          case 82: // array_idx ::= LSQUARE expr RSQUARE 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1227,9 +1273,21 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 78: // array_idx_list ::= array_idx array_idx_list 
+          case 81: // array_idx_list ::= array_idx 
             {
               ParseNode RESULT = null;
+		int aileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int airight = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode ai = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 RESULT = ai; 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(24/*array_idx_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 80: // array_idx_list ::= array_idx array_idx_list 
+            {
+              ParseNode RESULT = null;
 		int aileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
 		int airight = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode ai = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
@@ -1242,21 +1300,9 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 77: // array_idx_list ::= array_idx 
+          case 79: // array_expr ::= meth_expr array_idx_list 
             {
               ParseNode RESULT = null;
-		int aileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
-		int airight = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
-		ParseNode ai = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
-		 RESULT = ai; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(24/*array_idx_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
-            }
-          return CUP$ECAGrammarParser$result;
-
-          /*. . . . . . . . . . . . . . . . . . . .*/
-          case 76: // array_expr ::= meth_expr array_idx_list 
-            {
-              ParseNode RESULT = null;
 		int meleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
 		int meright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode me = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
@@ -1269,7 +1315,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 75: // array_expr ::= field_expr array_idx_list 
+          case 78: // array_expr ::= field_expr array_idx_list 
             {
               ParseNode RESULT = null;
 		int feleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1284,9 +1330,24 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 74: // array_expr ::= simple_expr array_idx_list 
+          case 77: // array_expr ::= simple_name array_idx_list 
             {
               ParseNode RESULT = null;
+		int nameleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
+		int nameright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
+		ParseNode name = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
+		int ailleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int ailright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode ail = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 RESULT = node(ParseNode.ARRAY, nameleft, nameright, name, ail); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(18/*array_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 76: // array_expr ::= simple_expr array_idx_list 
+            {
+              ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
 		int seright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode se = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
@@ -1299,7 +1360,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 73: // unary_oper_expr ::= MINUS expr 
+          case 75: // unary_oper_expr ::= MINUS expr 
             {
               ParseNode RESULT = null;
 		int oleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1314,7 +1375,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 72: // unary_oper_expr ::= TWIDDLE expr 
+          case 74: // unary_oper_expr ::= TWIDDLE expr 
             {
               ParseNode RESULT = null;
 		int oleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1329,7 +1390,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 71: // unary_oper_expr ::= NOT expr 
+          case 73: // unary_oper_expr ::= NOT expr 
             {
               ParseNode RESULT = null;
 		int oleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1344,7 +1405,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 70: // binary_oper_expr ::= expr MOD expr 
+          case 72: // binary_oper_expr ::= expr MOD expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1362,7 +1423,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 69: // binary_oper_expr ::= expr DIV expr 
+          case 71: // binary_oper_expr ::= expr DIV expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1380,7 +1441,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 68: // binary_oper_expr ::= expr MUL expr 
+          case 70: // binary_oper_expr ::= expr MUL expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1398,7 +1459,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 67: // binary_oper_expr ::= expr MINUS expr 
+          case 69: // binary_oper_expr ::= expr MINUS expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1416,7 +1477,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 66: // binary_oper_expr ::= expr PLUS expr 
+          case 68: // binary_oper_expr ::= expr PLUS expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1434,7 +1495,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 65: // binary_oper_expr ::= expr BXOR expr 
+          case 67: // binary_oper_expr ::= expr BXOR expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1452,7 +1513,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 64: // binary_oper_expr ::= expr BAND expr 
+          case 66: // binary_oper_expr ::= expr BAND expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1470,7 +1531,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 63: // binary_oper_expr ::= expr BOR expr 
+          case 65: // binary_oper_expr ::= expr BOR expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1488,7 +1549,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 62: // binary_oper_expr ::= expr GT expr 
+          case 64: // binary_oper_expr ::= expr GT expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1506,7 +1567,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 61: // binary_oper_expr ::= expr GE expr 
+          case 63: // binary_oper_expr ::= expr GE expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1524,7 +1585,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 60: // binary_oper_expr ::= expr NE expr 
+          case 62: // binary_oper_expr ::= expr NE expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1542,7 +1603,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 59: // binary_oper_expr ::= expr EQ expr 
+          case 61: // binary_oper_expr ::= expr EQ expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1560,7 +1621,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 58: // binary_oper_expr ::= expr LE expr 
+          case 60: // binary_oper_expr ::= expr LE expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1578,7 +1639,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 57: // binary_oper_expr ::= expr LT expr 
+          case 59: // binary_oper_expr ::= expr LT expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1596,7 +1657,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 56: // binary_oper_expr ::= expr AND expr 
+          case 58: // binary_oper_expr ::= expr AND expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1614,7 +1675,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 55: // binary_oper_expr ::= expr OR expr 
+          case 57: // binary_oper_expr ::= expr OR expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1632,7 +1693,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 54: // ternary_oper_expr ::= expr TERN_IF expr COLON expr 
+          case 56: // ternary_oper_expr ::= expr TERN_IF expr COLON expr 
             {
               ParseNode RESULT = null;
 		int condleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -1650,9 +1711,24 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 53: // expr ::= simple_name 
+          case 55: // expr ::= error expr 
             {
               ParseNode RESULT = null;
+		int errleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
+		int errright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
+		Object err = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
+		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 error("invalid expression", errleft, errright); RESULT = e; 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 54: // expr ::= simple_name 
+            {
+              ParseNode RESULT = null;
 		int nleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int nright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode n = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
@@ -1662,7 +1738,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 52: // expr ::= simple_expr 
+          case 53: // expr ::= simple_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1674,7 +1750,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 51: // expr ::= meth_expr 
+          case 52: // expr ::= meth_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1686,7 +1762,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 50: // expr ::= field_expr 
+          case 51: // expr ::= field_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1698,7 +1774,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 49: // expr ::= array_expr 
+          case 50: // expr ::= array_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1710,7 +1786,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 48: // expr ::= unary_oper_expr 
+          case 49: // expr ::= unary_oper_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1722,7 +1798,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 47: // expr ::= binary_oper_expr 
+          case 48: // expr ::= binary_oper_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1734,7 +1810,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 46: // expr ::= ternary_oper_expr 
+          case 47: // expr ::= ternary_oper_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1746,37 +1822,24 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 45: // expr_list_error_invalid_expr ::= error COMMA expr_list 
+          case 46: // expr_list ::= expr SEMI expr_list 
             {
               ParseNode RESULT = null;
-		int cleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
-		int cright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
-		Object c = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
+		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
+		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
 		int elleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int elright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode el = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
-		 error("invalid expression", cleft, cright);
-		   RESULT = node(ParseNode.COMMA, cleft, cright, null, el); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(37/*expr_list_error_invalid_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+		 RESULT = node(ParseNode.COMMA, eleft, eright, e, el); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 44: // expr_list ::= expr_list_error_invalid_expr 
+          case 45: // expr_list ::= expr COMMA expr_list 
             {
               ParseNode RESULT = null;
-		int elleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
-		int elright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
-		ParseNode el = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
-		 RESULT = el; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
-            }
-          return CUP$ECAGrammarParser$result;
-
-          /*. . . . . . . . . . . . . . . . . . . .*/
-          case 43: // expr_list ::= expr COMMA expr_list 
-            {
-              ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
@@ -1789,7 +1852,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 42: // expr_list ::= expr 
+          case 44: // expr_list ::= expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1801,7 +1864,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 41: // throw_return_expr ::= THROW name LPAREN expr_list RPAREN 
+          case 43: // throw_return_expr ::= THROW name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left;
@@ -1816,7 +1879,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 40: // throw_return_expr ::= THROW name LPAREN RPAREN 
+          case 42: // throw_return_expr ::= THROW name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1828,7 +1891,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 39: // throw_return_expr ::= RETURN expr 
+          case 41: // throw_return_expr ::= RETURN expr 
             {
               ParseNode RESULT = null;
 		int rleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1843,7 +1906,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 38: // throw_return_expr ::= RETURN 
+          case 40: // throw_return_expr ::= RETURN 
             {
               ParseNode RESULT = null;
 		int rleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1855,7 +1918,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 37: // action_expr ::= throw_return_expr 
+          case 39: // action_expr ::= throw_return_expr 
             {
               ParseNode RESULT = null;
 		int treleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1867,7 +1930,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 36: // action_expr ::= expr 
+          case 38: // action_expr ::= expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1879,34 +1942,9 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 35: // action_expr_list_error_invalid_action ::= error action_expr_list 
+          case 37: // action_expr_list ::= action_expr 
             {
               ParseNode RESULT = null;
-		int aelleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
-		int aelright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
-		ParseNode ael = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
-		 error("invalid action", aelleft, aelright);
-           RESULT = ael; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(36/*action_expr_list_error_invalid_action*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
-            }
-          return CUP$ECAGrammarParser$result;
-
-          /*. . . . . . . . . . . . . . . . . . . .*/
-          case 34: // action_expr_list ::= action_expr_list_error_invalid_action 
-            {
-              ParseNode RESULT = null;
-		int aelleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
-		int aelright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
-		ParseNode ael = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
-		 RESULT = ael; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(10/*action_expr_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
-            }
-          return CUP$ECAGrammarParser$result;
-
-          /*. . . . . . . . . . . . . . . . . . . .*/
-          case 33: // action_expr_list ::= action_expr 
-            {
-              ParseNode RESULT = null;
 		int aeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int aeright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode ae = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
@@ -1916,7 +1954,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 32: // action_expr_list ::= expr COMMA action_expr_list 
+          case 36: // action_expr_list ::= expr COMMA action_expr_list 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1931,7 +1969,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 31: // action_expr_list ::= expr SEMI action_expr_list 
+          case 35: // action_expr_list ::= expr SEMI action_expr_list 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1946,7 +1984,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 30: // actions ::= action_expr_list 
+          case 34: // actions ::= action_expr_list 
             {
               ParseNode RESULT = null;
 		int aelleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1958,7 +1996,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 29: // actions ::= NOTHING 
+          case 33: // actions ::= NOTHING 
             {
               ParseNode RESULT = null;
 		int nleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1970,7 +2008,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 28: // condition ::= expr 
+          case 32: // condition ::= expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1982,6 +2020,60 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
+          case 31: // arraydims ::= LSQUARE RSQUARE 
+            {
+              Integer RESULT = null;
+		 RESULT =  1; 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(27/*arraydims*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 30: // arraydims ::= LSQUARE RSQUARE arraydims 
+            {
+              Integer RESULT = null;
+		int aleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int aright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		Integer a = (Integer)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 RESULT = a + 1; 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(27/*arraydims*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 29: // typename ::= name 
+            {
+              ParseNode RESULT = null;
+		int tleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int tright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode t = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 RESULT = t; 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(26/*typename*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 28: // typename ::= name arraydims 
+            {
+              ParseNode RESULT = null;
+		int tleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
+		int tright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
+		ParseNode t = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
+		int dleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int dright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		Integer d = (Integer)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		
+            ParseNode tmp = t;
+            for (int i = 0; i < d; i++) {
+                tmp =  node(ParseNode.ARRAY, tleft, tright, tmp);
+            }
+            RESULT = tmp;
+        
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(26/*typename*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
           case 27: // bind_sym ::= simple_name 
             {
               ParseNode RESULT = null;
@@ -1994,7 +2086,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 26: // bind_sym ::= simple_name COLON name 
+          case 26: // bind_sym ::= simple_name COLON typename 
             {
               ParseNode RESULT = null;
 		int varleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -2101,7 +2193,7 @@
 		Object d = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 error("invalid action", dleft, dright);
                       RESULT = node(ParseNode.BIND, cleft, cright, null, c, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(35/*ca_error_in_action*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(37/*ca_error_in_action*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
@@ -2119,7 +2211,7 @@
 		int aright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode a = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BIND, ileft, iright, null, null, a); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(34/*ca_error_in_condition*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(36/*ca_error_in_condition*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
@@ -2140,7 +2232,7 @@
             {
               ParseNode RESULT = null;
 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(33/*ca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(35/*ca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
@@ -2149,7 +2241,7 @@
             {
               ParseNode RESULT = null;
 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(33/*ca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(35/*ca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
@@ -2192,7 +2284,7 @@
 		Object d = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 error("invalid action", dleft, dright);
                       RESULT = node(ParseNode.BIND, eleft, eright, e, c, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(32/*eca_error_in_action*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(34/*eca_error_in_action*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
@@ -2213,7 +2305,7 @@
 		int aright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode a = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BIND, eleft, eright, e, null, a); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(31/*eca_error_in_condition*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-6)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(33/*eca_error_in_condition*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-6)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
@@ -2249,7 +2341,7 @@
 		int aright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode a = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BIND, bleft, bright, null, c, a); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(30/*eca_error_in_event*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-6)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(32/*eca_error_in_event*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-6)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
@@ -2270,7 +2362,7 @@
             {
               ParseNode RESULT = null;
 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(29/*eca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(31/*eca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
@@ -2279,7 +2371,7 @@
             {
               ParseNode RESULT = null;
 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(29/*eca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(31/*eca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
@@ -2288,7 +2380,7 @@
             {
               ParseNode RESULT = null;
 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(29/*eca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(31/*eca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ECATokenLexer.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ECATokenLexer.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ECATokenLexer.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.2 on 9/1/09 3:26 PM */
+/* The following code was generated by JFlex 1.4.2 on 9/28/09 5:05 PM */
 
 /*
 * JBoss, Home of Professional Open Source
@@ -33,7 +33,7 @@
 /**
  * This class is a scanner generated by 
  * <a href="http://www.jflex.de/">JFlex</a> 1.4.2
- * on 9/1/09 3:26 PM from the specification file
+ * on 9/28/09 5:05 PM from the specification file
  * <tt>dd/grammar/flex/ECAToken.flex</tt>
  */
 public class ECATokenLexer implements java_cup.runtime.Scanner {
@@ -892,165 +892,165 @@
           { return symbol(sym.BOOLEAN_LITERAL, Boolean.TRUE);
           }
         case 64: break;
-        case 32: 
-          { throw new Error("Newline in string <"+ yytext()+">");
-          }
-        case 65: break;
         case 19: 
           { return symbol(sym.GT);
           }
-        case 66: break;
+        case 65: break;
         case 50: 
           { string.append('\t');
           }
-        case 67: break;
+        case 66: break;
         case 9: 
           { return symbol(sym.LSQUARE);
           }
-        case 68: break;
+        case 67: break;
         case 14: 
           { return symbol(sym.LT);
           }
-        case 69: break;
+        case 68: break;
         case 27: 
           { string.setLength(0); yybegin(STRING);
           }
-        case 70: break;
+        case 69: break;
         case 40: 
           { return symbol(sym.FLOAT_LITERAL, Float.valueOf(yytext()));
           }
-        case 71: break;
+        case 70: break;
         case 56: 
           { return symbol(sym.THROW);
           }
-        case 72: break;
+        case 71: break;
         case 48: 
           { return symbol(sym.AND);
           }
-        case 73: break;
+        case 72: break;
         case 18: 
           { return symbol(sym.NOT);
           }
-        case 74: break;
+        case 73: break;
         case 13: 
           { return symbol(sym.ASSIGN);
           }
-        case 75: break;
+        case 74: break;
         case 23: 
           { return symbol(sym.DIV);
           }
-        case 76: break;
+        case 75: break;
         case 34: 
           { string.append('\\');
           }
-        case 77: break;
+        case 76: break;
         case 57: 
           { return symbol(sym.RETURN);
           }
-        case 78: break;
+        case 77: break;
         case 51: 
           { string.append('\r');
           }
-        case 79: break;
+        case 78: break;
         case 38: 
           { yybegin(YYINITIAL);
           }
-        case 80: break;
+        case 79: break;
         case 5: 
           { return symbol(sym.PLUS);
           }
-        case 81: break;
+        case 80: break;
         case 24: 
           { return symbol(sym.MOD);
           }
-        case 82: break;
-        case 31: 
-          { throw new Error("Illegal character in string <"+ yytext()+">");
-          }
-        case 83: break;
-        case 35: 
-          { throw new Error("Newline in quoted identifier <"+ yytext()+">");
-          }
-        case 84: break;
+        case 81: break;
         case 29: 
           { yybegin(COMMENT);
           }
-        case 85: break;
+        case 82: break;
         case 3: 
           { return symbol(sym.IDENTIFIER, yytext());
           }
-        case 86: break;
+        case 83: break;
         case 44: 
           { return symbol(sym.DO);
           }
-        case 87: break;
+        case 84: break;
         case 52: 
           { string.append('\"');
           }
-        case 88: break;
+        case 85: break;
         case 26: 
           { return symbol(sym.COLON);
           }
-        case 89: break;
+        case 86: break;
         case 20: 
           { return symbol(sym.BXOR);
           }
-        case 90: break;
+        case 87: break;
+        case 32: 
+          { throw new Error("File " + file + " line " + (yyline + startLine) + " : newline in string");
+          }
+        case 88: break;
         case 42: 
           { return symbol(sym.IF);
           }
-        case 91: break;
+        case 89: break;
         case 55: 
           { return symbol(sym.BOOLEAN_LITERAL, Boolean.FALSE);
           }
-        case 92: break;
+        case 90: break;
         case 7: 
           { return symbol(sym.LPAREN);
           }
-        case 93: break;
+        case 91: break;
         case 45: 
           { return symbol(sym.OR);
           }
-        case 94: break;
+        case 92: break;
         case 41: 
           { return symbol(sym.EQ);
           }
-        case 95: break;
+        case 93: break;
         case 49: 
           { string.append('\n');
           }
-        case 96: break;
+        case 94: break;
         case 11: 
           { return symbol(sym.SEMI);
           }
-        case 97: break;
+        case 95: break;
         case 10: 
           { return symbol(sym.RSQUARE);
           }
-        case 98: break;
+        case 96: break;
         case 43: 
           { return symbol(sym.NE);
           }
-        case 99: break;
+        case 97: break;
         case 15: 
           { return symbol(sym.MINUS);
           }
-        case 100: break;
+        case 98: break;
+        case 35: 
+          { throw new Error("File " + file + " line " + (yyline + startLine) + " : newline in quoted identifier");
+          }
+        case 99: break;
         case 16: 
           { return symbol(sym.BOR);
           }
-        case 101: break;
+        case 100: break;
         case 28: 
           { string.setLength(0);  yybegin(QUOTEDIDENT);
           }
-        case 102: break;
+        case 101: break;
         case 39: 
           { return symbol(sym.DOLLAR, yytext());
           }
-        case 103: break;
+        case 102: break;
         case 21: 
           { return symbol(sym.TWIDDLE);
           }
+        case 103: break;
+        case 31: 
+          { throw new Error("File " + file + " line " + (yyline + startLine) + " : illegal character in string <"+ yytext()+">");
+          }
         case 104: break;
         case 53: 
           { return symbol(sym.BIND);

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ParseNode.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ParseNode.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/ParseNode.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -328,6 +328,11 @@
         public String getText() {
             int tag = getTag();
             switch(tag) {
+                case ARRAY:
+                {
+                    // these occur when we have a type array declaration
+                    return ((ParseNode)child0).getText() + "[]";
+                }
                 case BOOLEAN_LITERAL:
                     return child0.toString();
                 case FLOAT_LITERAL:
@@ -337,7 +342,7 @@
                 case RETURN:
                     return "RETURN";
                 case STRING_LITERAL:
-                    return child0.toString();
+                    return "\"" + ((String)child0) + "\"";
                 case DOLLAR:
                     return ((String)child0);
                 default:
@@ -396,7 +401,8 @@
             int tag = getTag();
             switch(tag) {
                 case ARRAY:
-                    return ((ParseNode)child0).getText() + "[]";
+                    // these occur when we have an array expression
+                    return ((ParseNode)child0).getText() + "[" + ((ParseNode)child1).getText() + "]";
                 case ASSIGN:
                     return "=";
                 case BIND:

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/PrintableSymbol.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/PrintableSymbol.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/PrintableSymbol.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -72,80 +72,54 @@
         return file + " @ " + left + "." + right;
     }
 
-    public static String[] sym_name = new String[100];
+    public static String[] sym_name = new String[200];
 
     static {
-    sym_name[41] = "STRING_LITERAL";
-    sym_name[24] = "GE";
-    sym_name[36] = "UMINUS";
-    sym_name[8] = "LPAREN";
-    sym_name[12] = "SEMI";
-    sym_name[32] = "MINUS";
-    sym_name[28] = "BXOR";
-    sym_name[9] = "RPAREN";
-    sym_name[40] = "BOOLEAN_LITERAL";
-    sym_name[34] = "NOT";
-    sym_name[19] = "AND";
-    sym_name[20] = "LT";
-    sym_name[18] = "OR";
-    sym_name[13] = "COMMA";
-    sym_name[7] = "THROW";
-    sym_name[27] = "BAND";
-    sym_name[30] = "DIV";
-    sym_name[31] = "PLUS";
-    sym_name[15] = "ASSIGN";
-    sym_name[3] = "IF";
-    sym_name[14] = "DOT";
-    sym_name[21] = "LE";
-    sym_name[2] = "BIND";
-    sym_name[0] = "EOF";
-    sym_name[6] = "RETURN";
-    sym_name[1] = "error";
-    sym_name[29] = "MUL";
-    sym_name[33] = "MOD";
-    sym_name[35] = "TWIDDLE";
-    sym_name[22] = "EQ";
-    sym_name[17] = "COLON";
-    sym_name[26] = "BOR";
-    sym_name[10] = "LSQUARE";
-    sym_name[11] = "RSQUARE";
-    sym_name[37] = "DOLLAR";
-    sym_name[23] = "NE";
-    sym_name[16] = "TERN_IF";
-    sym_name[5] = "NOTHING";
-    sym_name[38] = "FLOAT_LITERAL";
-    sym_name[25] = "GT";
-    sym_name[4] = "DO";
-    sym_name[42] = "IDENTIFIER";
-    sym_name[39] = "INTEGER_LITERAL";
-
-    /* non terminals */
-    sym_name[10] = "action_expr";
-    sym_name[22] = "array_idx_list";
-    sym_name[12] = "expr";
-    sym_name[17] = "field_expr";
-    sym_name[25] = "simple_name";
-    sym_name[0] = "$START";
-    sym_name[21] = "simple_expr";
-    sym_name[8] = "actions";
-    sym_name[6] = "bind_sym";
-    sym_name[2] = "eca";
-    sym_name[9] = "action_expr_list";
-    sym_name[14] = "binary_oper_expr";
-    sym_name[18] = "expr_field_expr";
-    sym_name[26] = "path";
-    sym_name[13] = "ternary_oper_expr";
-    sym_name[5] = "binding";
-    sym_name[20] = "expr_meth_expr";
-    sym_name[11] = "expr_list";
-    sym_name[3] = "event";
-    sym_name[7] = "condition";
-    sym_name[1] = "eca_rule";
-    sym_name[16] = "array_expr";
-    sym_name[15] = "unary_oper_expr";
-    sym_name[19] = "meth_expr";
-    sym_name[23] = "array_idx";
-    sym_name[4] = "bindings";
-    sym_name[24] = "name";
+        for (int i =  0; i < sym_name.length; i++) {
+            sym_name[i] = "???";
+	}
+    sym_name[org.jboss.byteman.rule.grammar.sym.STRING_LITERAL] = "STRING_LITERAL";
+    sym_name[org.jboss.byteman.rule.grammar.sym.GE] = "GE";
+    sym_name[org.jboss.byteman.rule.grammar.sym.UMINUS] = "UMINUS";
+    sym_name[org.jboss.byteman.rule.grammar.sym.LPAREN] = "LPAREN";
+    sym_name[org.jboss.byteman.rule.grammar.sym.SEMI] = "SEMI";
+    sym_name[org.jboss.byteman.rule.grammar.sym.MINUS] = "MINUS";
+    sym_name[org.jboss.byteman.rule.grammar.sym.BXOR] = "BXOR";
+    sym_name[org.jboss.byteman.rule.grammar.sym.RPAREN] = "RPAREN";
+    sym_name[org.jboss.byteman.rule.grammar.sym.BOOLEAN_LITERAL] = "BOOLEAN_LITERAL";
+    sym_name[org.jboss.byteman.rule.grammar.sym.NOT] = "NOT";
+    sym_name[org.jboss.byteman.rule.grammar.sym.AND] = "AND";
+    sym_name[org.jboss.byteman.rule.grammar.sym.LT] = "LT";
+    sym_name[org.jboss.byteman.rule.grammar.sym.OR] = "OR";
+    sym_name[org.jboss.byteman.rule.grammar.sym.COMMA] = "COMMA";
+    sym_name[org.jboss.byteman.rule.grammar.sym.THROW] = "THROW";
+    sym_name[org.jboss.byteman.rule.grammar.sym.BAND] = "BAND";
+    sym_name[org.jboss.byteman.rule.grammar.sym.DIV] = "DIV";
+    sym_name[org.jboss.byteman.rule.grammar.sym.PLUS] = "PLUS";
+    sym_name[org.jboss.byteman.rule.grammar.sym.ASSIGN] = "ASSIGN";
+    sym_name[org.jboss.byteman.rule.grammar.sym.IF] = "IF";
+    sym_name[org.jboss.byteman.rule.grammar.sym.DOT] = "DOT";
+    sym_name[org.jboss.byteman.rule.grammar.sym.LE] = "LE";
+    sym_name[org.jboss.byteman.rule.grammar.sym.BIND] = "BIND";
+    sym_name[org.jboss.byteman.rule.grammar.sym.EOF] = "EOF";
+    sym_name[org.jboss.byteman.rule.grammar.sym.RETURN] = "RETURN";
+    sym_name[org.jboss.byteman.rule.grammar.sym.error] = "error";
+    sym_name[org.jboss.byteman.rule.grammar.sym.MUL] = "MUL";
+    sym_name[org.jboss.byteman.rule.grammar.sym.MOD] = "MOD";
+    sym_name[org.jboss.byteman.rule.grammar.sym.TWIDDLE] = "TWIDDLE";
+    sym_name[org.jboss.byteman.rule.grammar.sym.EQ] = "EQ";
+    sym_name[org.jboss.byteman.rule.grammar.sym.COLON] = "COLON";
+    sym_name[org.jboss.byteman.rule.grammar.sym.BOR] = "BOR";
+    sym_name[org.jboss.byteman.rule.grammar.sym.LSQUARE] = "LSQUARE";
+    sym_name[org.jboss.byteman.rule.grammar.sym.RSQUARE] = "RSQUARE";
+    sym_name[org.jboss.byteman.rule.grammar.sym.DOLLAR] = "DOLLAR";
+    sym_name[org.jboss.byteman.rule.grammar.sym.NE] = "NE";
+    sym_name[org.jboss.byteman.rule.grammar.sym.TERN_IF] = "TERN_IF";
+    sym_name[org.jboss.byteman.rule.grammar.sym.NOTHING] = "NOTHING";
+    sym_name[org.jboss.byteman.rule.grammar.sym.FLOAT_LITERAL] = "FLOAT_LITERAL";
+    sym_name[org.jboss.byteman.rule.grammar.sym.GT] = "GT";
+    sym_name[org.jboss.byteman.rule.grammar.sym.DO] = "DO";
+    sym_name[org.jboss.byteman.rule.grammar.sym.IDENTIFIER] = "IDENTIFIER";
+    sym_name[org.jboss.byteman.rule.grammar.sym.INTEGER_LITERAL] = "INTEGER_LITERAL";
     }
 }

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/sym.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/sym.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/grammar/sym.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -1,7 +1,7 @@
 
 //----------------------------------------------------
 // The following code was generated by CUP v0.10k
-// Tue Sep 01 15:26:43 BST 2009
+// Mon Sep 28 17:05:29 BST 2009
 //----------------------------------------------------
 
 package org.jboss.byteman.rule.grammar;
@@ -62,36 +62,36 @@
   static final int array_expr = 18;
   static final int eca_rule = 1;
   static final int $START = 0;
-  static final int eca_error_in_action = 32;
+  static final int eca_error_in_action = 34;
   static final int expr_field_expr = 20;
   static final int binding = 6;
-  static final int ca_error_in_condition = 34;
-  static final int name = 26;
+  static final int ca_error_in_condition = 36;
+  static final int name = 28;
   static final int bind_sym = 7;
   static final int ternary_oper_expr = 15;
   static final int action_expr = 11;
   static final int array_idx = 25;
   static final int simple_expr = 23;
-  static final int action_expr_list_error_invalid_action = 36;
   static final int action_expr_list = 10;
   static final int field_expr = 19;
-  static final int ca_error = 33;
+  static final int ca_error = 35;
   static final int binary_oper_expr = 16;
-  static final int eca_error = 29;
+  static final int eca_error = 31;
+  static final int arraydims = 27;
   static final int ca = 3;
-  static final int eca_error_in_event = 30;
+  static final int eca_error_in_event = 32;
   static final int unary_oper_expr = 17;
   static final int actions = 9;
   static final int expr_meth_expr = 22;
-  static final int eca_error_in_condition = 31;
-  static final int path = 28;
+  static final int eca_error_in_condition = 33;
+  static final int path = 30;
   static final int expr = 14;
+  static final int typename = 26;
   static final int array_idx_list = 24;
   static final int bindings = 5;
   static final int throw_return_expr = 12;
-  static final int ca_error_in_action = 35;
-  static final int expr_list_error_invalid_expr = 37;
-  static final int simple_name = 27;
+  static final int ca_error_in_action = 37;
+  static final int simple_name = 29;
   static final int expr_list = 13;
   static final int eca = 2;
   static final int event = 4;

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/type/Type.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/type/Type.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/type/Type.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -870,6 +870,7 @@
                     arrayDepth++;
                     idx++;
                 }
+                break;
                 default:
                     return "void";
             }

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/type/TypeGroup.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/type/TypeGroup.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/src/org/jboss/byteman/rule/type/TypeGroup.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -102,6 +102,13 @@
      */
     public Type create(String name)
     {
+        // check for array types and create the base types first
+        if (name.endsWith("[]")) {
+            String baseName = name.substring(0, name.length() - 2);
+            Type baseType = create(baseName);
+            return createArray(baseType);
+        }
+        
         return create(name, null);
     }
 
@@ -224,7 +231,10 @@
                 try {
                     // aaarrghh array base type names use dots not slashes bt still need  L...; bracketing
                     String internalName ="[" + baseType.getInternalName(true, false);
-                    arrayClazz = loader.loadClass(internalName);
+                    // need to do this via Class.forname after chnage from 1.5 to 1.6 snookered
+                    // creation of array classes via loader.findClass.
+                    // arrayClazz = loader.loadClass(internalName);
+                    arrayClazz = Class.forName(internalName, false, loader);
                 } catch (ClassNotFoundException e) {
                     // ignore
                 }

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/build.xml
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/build.xml	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/build.xml	2009-09-28 16:14:47 UTC (rev 29494)
@@ -56,6 +56,7 @@
     <target name="compile" depends="init">
         <javac srcdir="${src.dir}" destdir="${build.classes.dir}" debug="${javac.debug}">
             <classpath>
+                <pathelement location="${byteman.home}/${byteman.jar}"/>
                 <pathelement location="${junit.home}/${junit.jar}"/>
             </classpath>
         </javac>
@@ -288,6 +289,30 @@
             -->
             <test name="org.jboss.byteman.tests.javaops.TestMethod"/>
         </junit>
+        <junit fork="true" showoutput="true">
+            <classpath>
+                <pathelement location="${build.lib.dir}/byteman-tests.jar"/>
+                <pathelement location="${junit.home}/${junit.jar}"/>
+            </classpath>
+            <jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/javaops/TestArray.txt"/>
+            <!-- uncomment for verbose byteman output
+            <jvmarg value="-Dorg.jboss.byteman.verbose"/>
+            -->
+            <!-- uncomment to dump generated code
+            <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes"/>
+            <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes.directory=dump"/>
+            -->
+            <!-- uncomment to enable debug
+            <jvmarg value="-Xdebug"/>
+            <jvmarg  value="-Xnoagent"/>
+            <jvmarg  value="-Djava.compiler=NONE"/>
+            <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
+            -->
+            <!--  set this to debug the rule parser
+            <jvmarg value="-Dorg.jboss.byteman.rule.debug"/>
+            -->
+            <test name="org.jboss.byteman.tests.javaops.TestArray"/>
+        </junit>
     </target>
 
     <target name="tests.javaops.compiled">
@@ -297,7 +322,8 @@
                 <pathelement location="${junit.home}/${junit.jar}"/>
             </classpath>
             <jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/javaops/TestArithmetic.txt"/>
-            <test name="org.jboss.byteman.tests.javaops.TestArithmetic"/>
+            <jvmarg value="-Dorg.jboss.byteman.compileToBytecode"/>
+	    <test name="org.jboss.byteman.tests.javaops.TestArithmetic"/>
         </junit>
         <junit fork="true" showoutput="true">
             <classpath>
@@ -362,6 +388,25 @@
             -->
             <test name="org.jboss.byteman.tests.javaops.TestMethod"/>
         </junit>
+        <junit fork="true" showoutput="true">
+            <classpath>
+                <pathelement location="${build.lib.dir}/byteman-tests.jar"/>
+                <pathelement location="${junit.home}/${junit.jar}"/>
+            </classpath>
+            <jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/javaops/TestArray.txt"/>
+            <jvmarg value="-Dorg.jboss.byteman.compileToBytecode"/>
+            <!-- uncomment to dump generated code
+            <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes"/>
+            <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes.directory=dump"/>
+            -->
+            <!-- uncomment to enable debug
+            <jvmarg value="-Xdebug"/>
+            <jvmarg  value="-Xnoagent"/>
+            <jvmarg  value="-Djava.compiler=NONE"/>
+            <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
+            -->
+            <test name="org.jboss.byteman.tests.javaops.TestArray"/>
+        </junit>
     </target>
 
     <target name="tests.bugfixes">
@@ -428,6 +473,48 @@
           -->
           <test name="org.jboss.byteman.tests.bugfixes.TestMethodParamName"/>
         </junit>
+        <junit fork="true" showoutput="true">
+          <classpath>
+              <pathelement location="${build.lib.dir}/byteman-tests.jar"/>
+              <pathelement location="${junit.home}/${junit.jar}"/>
+          </classpath>
+          <jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/bugfixes/TestThrowAction.txt"/>
+          <!-- uncomment for verbose byteman output
+          <jvmarg value="-Dorg.jboss.byteman.verbose"/>
+          -->
+          <!-- uncomment to dump generated code
+          <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes"/>
+          <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes.directory=dump"/>
+          -->
+          <!-- uncomment to enable debug
+          <jvmarg value="-Xdebug"/>
+          <jvmarg  value="-Xnoagent"/>
+          <jvmarg  value="-Djava.compiler=NONE"/>
+          <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
+          -->
+          <test name="org.jboss.byteman.tests.bugfixes.TestThrowAction"/>
+        </junit>
+        <junit fork="true" showoutput="true">
+          <classpath>
+              <pathelement location="${build.lib.dir}/byteman-tests.jar"/>
+              <pathelement location="${junit.home}/${junit.jar}"/>
+          </classpath>
+          <jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/bugfixes/TestWaitAfterSignalWakeMustMeet.txt"/>
+          <!-- uncomment for verbose byteman output
+          <jvmarg value="-Dorg.jboss.byteman.verbose"/>
+          -->
+          <!-- uncomment to dump generated code
+          <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes"/>
+          <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes.directory=dump"/>
+          -->
+          <!-- uncomment to enable debug
+          <jvmarg value="-Xdebug"/>
+          <jvmarg  value="-Xnoagent"/>
+          <jvmarg  value="-Djava.compiler=NONE"/>
+          <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
+          -->
+          <test name="org.jboss.byteman.tests.bugfixes.TestWaitAfterSignalWakeMustMeet"/>
+        </junit>
   </target>
 
     <target name="tests.bugfixes.compiled">
@@ -500,6 +587,50 @@
           -->
           <test name="org.jboss.byteman.tests.bugfixes.TestMethodParamName"/>
       </junit>
+        <junit fork="true" showoutput="true">
+          <classpath>
+              <pathelement location="${build.lib.dir}/byteman-tests.jar"/>
+              <pathelement location="${junit.home}/${junit.jar}"/>
+          </classpath>
+          <jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/bugfixes/TestThrowAction.txt"/>
+          <jvmarg value="-Dorg.jboss.byteman.compileToBytecode"/>
+          <!-- uncomment for verbose byteman output
+          <jvmarg value="-Dorg.jboss.byteman.verbose"/>
+          -->
+          <!-- uncomment to dump generated code
+          <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes"/>
+          <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes.directory=dump"/>
+          -->
+          <!-- uncomment to enable debug
+          <jvmarg value="-Xdebug"/>
+          <jvmarg  value="-Xnoagent"/>
+          <jvmarg  value="-Djava.compiler=NONE"/>
+          <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
+          -->
+          <test name="org.jboss.byteman.tests.bugfixes.TestThrowAction"/>
+      </junit>
+      <junit fork="true" showoutput="true">
+          <classpath>
+              <pathelement location="${build.lib.dir}/byteman-tests.jar"/>
+              <pathelement location="${junit.home}/${junit.jar}"/>
+          </classpath>
+          <jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/bugfixes/TestWaitAfterSignalWakeMustMeet.txt"/>
+          <jvmarg value="-Dorg.jboss.byteman.compileToBytecode"/>
+          <!-- uncomment for verbose byteman output
+          <jvmarg value="-Dorg.jboss.byteman.verbose"/>
+          -->
+          <!-- uncomment to dump generated code
+          <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes"/>
+          <jvmarg value="-Dorg.jboss.byteman.dump.generated.classes.directory=dump"/>
+          -->
+          <!-- uncomment to enable debug
+          <jvmarg value="-Xdebug"/>
+          <jvmarg  value="-Xnoagent"/>
+          <jvmarg  value="-Djava.compiler=NONE"/>
+          <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
+          -->
+          <test name="org.jboss.byteman.tests.bugfixes.TestWaitAfterSignalWakeMustMeet"/>
+      </junit>
   </target>
 
 

Added: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/bugfixes/TestThrowAction.txt
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/bugfixes/TestThrowAction.txt	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/bugfixes/TestThrowAction.txt	2009-09-28 16:14:47 UTC (rev 29494)
@@ -0,0 +1,36 @@
+##############################################################################
+# JBoss, Home of Professional Open Source
+# Copyright 2009, Red Hat Middleware LLC, and individual contributors
+# by the @authors tag. See the copyright.txt in the distribution for a
+# full listing of individual contributors.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+#
+# @authors Andrew Dinn
+#
+# Test for BYTEMAN-35 to ensure that a method parameter can be referred to
+# by its local variable name as well as using syntax $0, $1 etc
+
+RULE test use of throw action
+CLASS org.jboss.byteman.tests.bugfixes.TestThrowAction
+METHOD throwMethod
+HELPER org.jboss.byteman.tests.helpers.Default
+AFTER CALL log
+BIND test : TestThrowAction = $0
+IF TRUE
+DO test.log("throwing Exception"),
+   throw Exception("test exception")
+ENDRULE

Added: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/bugfixes/TestWaitAfterSignalWakeMustMeet.txt
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/bugfixes/TestWaitAfterSignalWakeMustMeet.txt	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/bugfixes/TestWaitAfterSignalWakeMustMeet.txt	2009-09-28 16:14:47 UTC (rev 29494)
@@ -0,0 +1,123 @@
+##############################################################################
+# JBoss, Home of Professional Open Source
+# Copyright 2009, Red Hat Middleware LLC, and individual contributors
+# by the @authors tag. See the copyright.txt in the distribution for a
+# full listing of individual contributors.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+#
+# @authors Andrew Dinn
+#
+# Test for BYTEMAN-38
+
+##############################################################################
+# when test is entered we need to set up a rendezvous
+
+RULE setup
+CLASS TestWaitAfterSignalWakeMustMeet
+METHOD test
+HELPER org.jboss.byteman.tests.helpers.TestWaitAfterSignalWakeMustMeetHelper
+IF TRUE
+DO createRendezvous("test", 2, true)
+ENDRULE
+
+
+##############################################################################
+# when ensureSignalWake is called we need to ensure that another thread has
+# called signalWake. our helper specialises signalWake to allow this to be
+# checked
+
+RULE ensureSignalWait
+CLASS TestWaitAfterSignalWakeMustMeet
+METHOD ensureSignalWake
+HELPER org.jboss.byteman.tests.helpers.TestWaitAfterSignalWakeMustMeetHelper
+IF TRUE
+DO ensureSignalWake()
+ENDRULE
+
+##############################################################################
+# when ensureWaitFor is called we need to ensure that another thread has
+# called waitFor. our helper specialises waitFor to allow this to be
+# checked
+
+RULE ensureWaitFor
+CLASS TestWaitAfterSignalWakeMustMeet
+METHOD ensureWaitFor
+HELPER org.jboss.byteman.tests.helpers.TestWaitAfterSignalWakeMustMeetHelper
+IF TRUE
+DO ensureWaitFor()
+ENDRULE
+
+##############################################################################
+# when triggerWaitFor is called we need to do a waitFor
+
+RULE triggerWaitFor
+CLASS TestWaitAfterSignalWakeMustMeet
+METHOD triggerWaitFor
+HELPER org.jboss.byteman.tests.helpers.TestWaitAfterSignalWakeMustMeetHelper
+BIND test : TestEmptySignature = $0
+IF TRUE
+DO test.log("waitFor"),
+   waitFor("test")
+ENDRULE
+
+##############################################################################
+# when triggerSignalWake is called we need to do a signalWake
+
+RULE triggerSignalWake
+CLASS TestWaitAfterSignalWakeMustMeet
+METHOD triggerSignalWake
+HELPER org.jboss.byteman.tests.helpers.TestWaitAfterSignalWakeMustMeetHelper
+BIND test : TestEmptySignature = $0
+IF TRUE
+DO test.log("signalWake"),
+   signalWake("test", true)
+ENDRULE
+
+##############################################################################
+# when triggerRendezvous is called we need to do a rendezvous
+
+RULE triggerRendezvous
+CLASS TestWaitAfterSignalWakeMustMeet
+METHOD triggerRendezvous
+HELPER org.jboss.byteman.tests.helpers.TestWaitAfterSignalWakeMustMeetHelper
+IF TRUE
+DO rendezvous("test")
+ENDRULE
+
+##############################################################################
+# when triggerTimeoutCheck is called we need to wait and, if we timeout
+# throw an Exception
+
+RULE triggerTimeoutCheck
+CLASS TestWaitAfterSignalWakeMustMeet
+METHOD triggerTimeoutCheck
+IF TRUE
+DO waitFor("timeout", 60 * 1000),
+   throw Exception("failed with timeout")
+ENDRULE
+
+##############################################################################
+# when triggerTimeoutCancel is called we need to call signalThrow to cause
+# a runtime exception in the main thread.
+
+RULE triggerTimeoutCancel
+CLASS TestWaitAfterSignalWakeMustMeet
+METHOD triggerTimeoutCancel
+IF TRUE
+DO signalThrow("timeout")
+ENDRULE
+

Added: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/javaops/TestArray.txt
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/javaops/TestArray.txt	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/dd/scripts/javaops/TestArray.txt	2009-09-28 16:14:47 UTC (rev 29494)
@@ -0,0 +1,37 @@
+##############################################################################
+# JBoss, Home of Professional Open Source
+# Copyright 2009, Red Hat Middleware LLC, and individual contributors
+# by the @authors tag. See the copyright.txt in the distribution for a
+# full listing of individual contributors.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+#
+# @authors Andrew Dinn
+#
+
+RULE test array declarations and accesses
+CLASS TestArray
+METHOD triggerMethod1(int[], Object[][])
+HELPER org.jboss.byteman.tests.helpers.Default
+AFTER CALL log
+BIND test : Test = $0,
+     iarray : int[] = $1,
+     oarray : Object[][] = $2
+IF TRUE
+DO test.log("triggerMethod1 : iarray[0] == " + iarray[0]),
+   test.log("triggerMethod1 : oarray[0][0] == " + oarray[0][0]),
+   return oarray[0]
+ENDRULE

Modified: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/Test.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/Test.java	2009-09-28 15:17:10 UTC (rev 29493)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/Test.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -79,9 +79,10 @@
         String output = getOutput();
         String expected = getExpected();
         if (!output.equals(expected)) {
-            fail("Test " + name + "fail" + "\n\n<expected>\n" + expected + "</expected>\n\n<log>\n" + output +"</log>\n");
+            fail("Test " + name + "failure\n" + "\n<expected>\n" + expected + "</expected>\n\n<log>\n" + output +"</log>\n");
         } else {
-            System.out.println("Test " + name + " success" + "\n\n<log>\n" + output + "</log>\n");
+            // System.out.println("Test " + name + " success" + "\n\n<log>\n" + output + "</log>\n");
+            System.out.println("Test " + name + " success");
         }
 
         if (reset) {

Added: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/bugfixes/TestThrowAction.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/bugfixes/TestThrowAction.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/bugfixes/TestThrowAction.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -0,0 +1,62 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*
+* @authors Andrew Dinn
+*/
+package org.jboss.byteman.tests.bugfixes;
+
+import org.jboss.byteman.tests.Test;
+
+/**
+ * Test for BYTEMAN-35 to check that throw actions work.
+ */
+public class TestThrowAction extends Test
+{
+    public TestThrowAction()
+    {
+        super(TestThrowAction.class.getCanonicalName());
+    }
+
+    public void test()
+    {
+        try {
+            throwMethod();
+        } catch (Exception e) {
+            log("caught Exception " + e.getClass());
+        }
+
+        checkOutput();
+    }
+
+    public void throwMethod() throws Exception
+    {
+        log("inside throwMethod()");
+    }
+
+    @Override
+    public String getExpected() {
+        logExpected("inside throwMethod()");
+        logExpected("throwing Exception");
+        logExpected("caught Exception class java.lang.Exception" );
+
+        return super.getExpected();
+    }
+}
\ No newline at end of file

Added: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/bugfixes/TestWaitAfterSignalWakeMustMeet.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/bugfixes/TestWaitAfterSignalWakeMustMeet.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/bugfixes/TestWaitAfterSignalWakeMustMeet.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -0,0 +1,121 @@
+package org.jboss.byteman.tests.bugfixes;
+
+import org.jboss.byteman.tests.Test;
+import org.jboss.byteman.rule.exception.ExecuteException;
+
+/**
+ * This test accompaniesBYTEMAN-38. The bug happens when the same key is used for two successive pairs of
+ * calls to builtin helper methods waitFor(key) and signalWake(key, true). When the first call to waitFor
+ * happens before the first call to signalWake then the cleanup under signalWake fails to remove the
+ * Waiter object associated with key. The next call to waitFor finds a waiter which has been signalled
+ * and returns immediately. The call to signalWake shoudl remove the waiter before returning.
+ */
+public class TestWaitAfterSignalWakeMustMeet extends Test
+{
+    public TestWaitAfterSignalWakeMustMeet() {
+        super(TestWaitAfterSignalWakeMustMeet.class.getCanonicalName());
+    }
+
+    public void test() throws Exception
+    {
+        Thread thread1 = new Thread() {
+            public void run()
+            {
+                runThread1();
+            }
+        };
+        Thread thread2 = new Thread() {
+            public void run()
+            {
+                runThread2();
+            }
+        };
+        thread1.start();
+        thread2.start();
+        try {
+            triggerTimeoutCheck();
+        } catch (ExecuteException e) {
+            log("caught execute exception");
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+        checkOutput();
+    }
+
+    public void ensureSignalWake()
+    {
+        // do nothing. this is just for the purpose of triggering
+    }
+
+    public void ensureWaitFor()
+    {
+        // do nothing. this is just for the purpose of triggering
+    }
+
+    public void triggerWaitFor()
+    {
+        // do nothing. this is just for the purpose of triggering
+    }
+
+    public void triggerRendezvous()
+    {
+        // do nothing. this is just for the purpose of triggering
+    }
+
+    public void triggerSignalWake()
+    {
+        // do nothing. this is just for the purpose of triggering
+    }
+
+    public void triggerTimeoutCheck() throws Exception
+    {
+        // do nothing. this is just for the purpose of triggering
+    }
+
+    public void triggerTimeoutCancel()
+    {
+        // do nothing. this is just for the purpose of triggering
+    }
+
+    public void runThread1()
+    {
+        ensureSignalWake();
+        //System.out.println("thread1 : ensured signalWake sent");
+        triggerWaitFor();
+        //System.out.println("thread1 : triggered waitFor");
+        triggerRendezvous();
+        //System.out.println("thread1 : triggered rendezvous 1");
+        triggerWaitFor();
+        //System.out.println("thread1 : triggered waitFor");
+        triggerRendezvous();
+        //System.out.println("thread1 : triggered rendezvous 2");
+    }
+
+    public void runThread2()
+    {
+        triggerSignalWake();
+        //System.out.println("thread2 : triggered signalWake");
+        ensureWaitFor();
+        //System.out.println("thread2 : ensured waitFor");
+        triggerRendezvous();
+        //System.out.println("thread2 : triggered rendezvous 1");
+        ensureWaitFor();
+        //System.out.println("thread2 : ensured waitFor");
+        triggerSignalWake();
+        //System.out.println("thread2 : triggered signalWake");
+        triggerRendezvous();
+        //System.out.println("thread2 : triggered rendezvous 2");
+        triggerTimeoutCancel();
+        //System.out.println("thread2 : cancelled timeout");
+    }
+
+    @Override
+    public String getExpected() {
+        logExpected("signalWake");
+        logExpected("waitFor");
+        logExpected("waitFor");
+        logExpected("signalWake");
+        logExpected("caught execute exception");
+        return super.getExpected();
+    }
+}

Added: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/helpers/TestWaitAfterSignalWakeMustMeetHelper.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/helpers/TestWaitAfterSignalWakeMustMeetHelper.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/helpers/TestWaitAfterSignalWakeMustMeetHelper.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -0,0 +1,87 @@
+package org.jboss.byteman.tests.helpers;
+
+import org.jboss.byteman.rule.helper.Helper;
+import org.jboss.byteman.rule.Rule;
+
+/**
+ */
+public class TestWaitAfterSignalWakeMustMeetHelper extends Helper
+{
+    protected TestWaitAfterSignalWakeMustMeetHelper(Rule rule) {
+        super(rule);
+    }
+
+    static boolean waitForCalled = false;
+    static boolean signalWakeCalled = false;
+    static Object lock = new Object();
+
+    public void waitFor(Object identifier, long timeout)
+    {
+        setWaitFor(); // there is a window here! we use a delay to close it
+        super.waitFor(identifier, timeout);
+    }
+
+    public boolean signalWake(Object identifier, boolean mustMeet)
+    {
+        setSignalWake(); // there is a window here! we use a delay to close it
+        return super.signalWake(identifier, mustMeet);
+    }
+
+    private void setWaitFor()
+    {
+        synchronized (lock) {
+            waitForCalled = true;
+            //System.out.println("waitForCalled <= true");
+            lock.notify();
+        }
+    }
+    
+    private void setSignalWake()
+    {
+        synchronized (lock) {
+            signalWakeCalled = true;
+            //System.out.println("signalWakeCalled <= true");
+            lock.notify();
+        }
+    }
+
+    public void ensureWaitFor()
+    {
+        synchronized (lock) {
+            //System.out.println("*waitForCalled = " + waitForCalled);
+            while (!waitForCalled) {
+                try {
+                    lock.wait();
+                } catch (InterruptedException e) {
+                    // do nothing
+                }
+                //System.out.println("**waitForCalled = " + waitForCalled);
+            }
+            //System.out.println("***waitForCalled = " + waitForCalled);
+            waitForCalled = false;
+            //System.out.println("****waitForCalled = " + waitForCalled);
+        }
+        // close the window -- maybe leaves a little air gap
+        delay(1000);
+    }
+
+    public void ensureSignalWake()
+    {
+        synchronized (lock) {
+            //System.out.println("*signalWakeCalled = " + signalWakeCalled);
+            while (!signalWakeCalled) {
+                try {
+                    lock.wait();
+                } catch (InterruptedException e) {
+                    // do nothing
+                }
+                //System.out.println("**signalWakeCalled = " + signalWakeCalled);
+            }
+            //System.out.println("***signalWakeCalled = " + signalWakeCalled);
+            signalWakeCalled = false;
+            //System.out.println("****signalWakeCalled = " + signalWakeCalled);
+        }
+        // close the window -- maybe leaves a little air gap
+        delay(1000);
+    }
+}

Added: labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/javaops/TestArray.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/javaops/TestArray.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/byteman/branches/Byteman_1_0/tests/src/org/jboss/byteman/tests/javaops/TestArray.java	2009-09-28 16:14:47 UTC (rev 29494)
@@ -0,0 +1,76 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*
+* @authors Andrew Dinn
+*/
+package org.jboss.byteman.tests.javaops;
+
+import org.jboss.byteman.tests.Test;
+
+/**
+ * Test to ensure array operations compute as expected
+ */
+public class TestArray extends Test
+{
+    public TestArray()
+    {
+        super(TestArray.class.getCanonicalName());
+    }
+
+    static int[] iarray;
+    static Object[][] oarray;
+
+    public void test()
+    {
+        iarray = new int[1];
+        oarray = new Object[1][1];
+        // oarray[0][0] = new Object();
+        oarray[0][0] = null;
+        Object[] ores;
+
+        try {
+            log("calling TestArray.triggerMethod1");
+            ores = triggerMethod1(iarray, oarray);
+            log("called TestArray.triggerMethod1 : result == " + ores);
+        } catch (Exception e) {
+            log(e);
+        }
+
+        checkOutput(true);
+    }
+
+    public Object[] triggerMethod1(int[] iarray, Object[][] oarray)
+    {
+        log("inside TestArray.triggerMethod1");
+        return null;
+    }
+
+    @Override
+    public String getExpected() {
+        logExpected("calling TestArray.triggerMethod1");
+        logExpected("inside TestArray.triggerMethod1");
+        logExpected("triggerMethod1 : iarray[0] == " + iarray[0]);
+        logExpected("triggerMethod1 : oarray[0][0] == " + oarray[0][0]);
+        logExpected("called TestArray.triggerMethod1 : result == " + oarray[0]);
+
+        return super.getExpected();
+    }
+}
\ No newline at end of file



More information about the jboss-svn-commits mailing list