From c1bb0fc34bf52b6736a37a556a35f66e28db3f91 Mon Sep 17 00:00:00 2001
From: Steve Murphy <murf@digium.com>
Date: Wed, 20 Jun 2007 20:10:19 +0000
Subject: [PATCH] This finishes the changes for making Macro args LOCAL to the
 call, and allowing users to declare local variables.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@70461 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 CHANGES                        |    9 +-
 doc/ael.tex                    |   46 ++
 include/asterisk/ael_structs.h |    1 +
 pbx/ael/ael.flex               |    1 +
 pbx/ael/ael.tab.c              | 1336 ++++++++++++++++----------------
 pbx/ael/ael.tab.h              |    8 +-
 pbx/ael/ael.y                  |   13 +-
 pbx/ael/ael_lex.c              |  997 ++++++++++++------------
 pbx/pbx_ael.c                  |   18 +
 9 files changed, 1263 insertions(+), 1166 deletions(-)

diff --git a/CHANGES b/CHANGES
index e3a5d55217..7e85eb56e9 100644
--- a/CHANGES
+++ b/CHANGES
@@ -162,7 +162,14 @@ Miscellaneous
      recursive call depths of 100,000 without problems.
      -- in addition to this, all apps that allowed a macro
      to be called, as in Dial, queues, etc, are now allowing
-     a gosub call in similar fashion also.
+     a gosub call in similar fashion.
+  * AEL now generates LOCAL(argname) declarations when it
+    Set()'s the each arg name to the value of ${ARG1}, ${ARG2),
+    etc. That makes the arguments local in scope. The user
+    can define their own local variables in macros, now,
+    by saying "local myvar=someval;"  or using Set() in this
+    fashion:  Set(LOCAL(myvar)=someval);  ("local" is now
+    an AEL keyword).
   * Ability to use libcap to set high ToS bits when non-root
      on Linux. If configure is unable to find libcap then you
      can use --with-cap to specify the path.
diff --git a/doc/ael.tex b/doc/ael.tex
index d675190ccf..416b67e342 100644
--- a/doc/ael.tex
+++ b/doc/ael.tex
@@ -264,6 +264,7 @@ The following are keywords in the AEL language:
     \item random
     \item goto
     \item jump
+    \item local
     \item return
     \item break
     \item continue
@@ -368,6 +369,7 @@ First, some basic objects
          | <eswitches>
          | <ignorepat>
          | <word> '='  <collected-word> ';'
+         | 'local' <word> '='  <collected-word> ';'
          | ';'
 
 
@@ -400,6 +402,7 @@ First, some basic objects
 
 <statement> :== '{' <statements> '}'
        | <word> '='  <collected-word> ';'
+       | 'local' <word> '='  <collected-word> ';'
        | 'goto' <target> ';'
        | 'jump' <jumptarget> ';'
        | <word> ':'
@@ -719,6 +722,49 @@ context blah {
 } 
 \end{verbatim}
 
+You can declare variables in Macros, as so:
+
+\begin{verbatim}
+Macro myroutine(firstarg, secondarg)
+{
+	Myvar=1;
+	NoOp(Myvar is set to ${myvar});
+}
+\end{verbatim}
+
+\subsection{Local Variables}
+
+In 1.2, and 1.4, ALL VARIABLES are CHANNEL variables, including the function
+arguments and associated ARG1, ARG2, etc variables. Sorry.
+
+In trunk (1.6 and higher), we have made all arguments local variables to
+a macro call. They will not affect channel variables of the same name.
+This includes the ARG1, ARG2, etc variables. 
+
+Users can declare their own local variables by using the keyword 'local'
+before setting them to a value;
+
+\begin{verbatim}
+Macro myroutine(firstarg, secondarg)
+{
+	local Myvar=1;
+	NoOp(Myvar is set to ${Myvar}, and firstarg is ${firstarg}, and secondarg is ${secondarg});
+}
+\end{verbatim}
+
+In the above example, Myvar, firstarg, and secondarg are all local variables,
+and will not be visible to the calling code, be it an extension, or another Macro. 
+
+If you need to make a local variable within the Set() application, you can do it this way:
+
+\begin{verbatim}
+Macro myroutine(firstarg, secondarg)
+{
+	Set(LOCAL(Myvar)=1);
+	NoOp(Myvar is set to ${Myvar}, and firstarg is ${firstarg}, and secondarg is ${secondarg});
+}
+\end{verbatim}
+
 
 \subsection{Loops}
 
diff --git a/include/asterisk/ael_structs.h b/include/asterisk/ael_structs.h
index 74b2c760a7..e220dd24f1 100644
--- a/include/asterisk/ael_structs.h
+++ b/include/asterisk/ael_structs.h
@@ -75,6 +75,7 @@ typedef enum {
 	PV_EXTENSION,         /* 25 */
 	PV_IGNOREPAT,         /* 26 */
 	PV_GLOBALS,           /* 27 */
+	PV_LOCALVARDEC, /* you know, local var=val; */  /* 28 */
 
 } pvaltype;
 
diff --git a/pbx/ael/ael.flex b/pbx/ael/ael.flex
index cfdd5eb948..00fb2db334 100644
--- a/pbx/ael/ael.flex
+++ b/pbx/ael/ael.flex
@@ -189,6 +189,7 @@ context		{ STORE_POS; return KW_CONTEXT;}
 abstract	{ STORE_POS; return KW_ABSTRACT;}
 macro		{ STORE_POS; return KW_MACRO;};
 globals		{ STORE_POS; return KW_GLOBALS;}
+local		{ STORE_POS; return KW_LOCAL;}
 ignorepat	{ STORE_POS; return KW_IGNOREPAT;}
 switch		{ STORE_POS; return KW_SWITCH;}
 if		{ STORE_POS; return KW_IF;}
diff --git a/pbx/ael/ael.tab.c b/pbx/ael/ael.tab.c
index c5beb7b2f7..145c1c4028 100644
--- a/pbx/ael/ael.tab.c
+++ b/pbx/ael/ael.tab.c
@@ -102,7 +102,8 @@
      KW_SWITCHES = 293,
      KW_ESWITCHES = 294,
      KW_INCLUDES = 295,
-     word = 296
+     KW_LOCAL = 296,
+     word = 297
    };
 #endif
 /* Tokens.  */
@@ -144,7 +145,8 @@
 #define KW_SWITCHES 293
 #define KW_ESWITCHES 294
 #define KW_INCLUDES 295
-#define word 296
+#define KW_LOCAL 296
+#define word 297
 
 
 
@@ -230,7 +232,7 @@ typedef union YYSTYPE
 	struct pval *pval;	/* full objects */
 }
 /* Line 198 of yacc.c.  */
-#line 234 "ael.tab.c"
+#line 236 "ael.tab.c"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -275,7 +277,7 @@ static pval *update_last(pval *, YYLTYPE *);
 
 
 /* Line 221 of yacc.c.  */
-#line 279 "ael.tab.c"
+#line 281 "ael.tab.c"
 
 #ifdef short
 # undef short
@@ -490,20 +492,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  14
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   350
+#define YYLAST   300
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  42
+#define YYNTOKENS  43
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  54
+#define YYNNTS  56
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  133
+#define YYNRULES  137
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  267
+#define YYNSTATES  275
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   296
+#define YYMAXUTOK   297
 
 #define YYTRANSLATE(YYX)						\
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -540,7 +542,7 @@ static const yytype_uint8 yytranslate[] =
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41
+      35,    36,    37,    38,    39,    40,    41,    42
 };
 
 #if YYDEBUG
@@ -550,87 +552,88 @@ static const yytype_uint16 yyprhs[] =
 {
        0,     0,     3,     5,     7,    10,    13,    15,    17,    19,
       21,    23,    25,    32,    34,    35,    44,    49,    50,    53,
-      56,    57,    63,    64,    66,    70,    73,    74,    77,    80,
-      82,    84,    86,    88,    90,    92,    95,    97,   102,   106,
-     111,   119,   128,   129,   132,   135,   141,   143,   151,   152,
-     157,   160,   163,   168,   170,   173,   175,   178,   182,   184,
-     187,   191,   193,   196,   200,   206,   210,   212,   216,   220,
-     223,   224,   225,   226,   239,   243,   245,   249,   252,   255,
-     256,   262,   265,   268,   271,   275,   277,   280,   281,   283,
-     287,   291,   297,   303,   309,   315,   316,   319,   322,   327,
-     328,   334,   338,   339,   343,   347,   350,   352,   353,   355,
-     356,   360,   361,   364,   369,   373,   378,   379,   382,   384,
-     386,   392,   397,   402,   403,   407,   413,   416,   418,   422,
-     425,   429,   432,   437
+      56,    57,    63,    64,    71,    72,    74,    78,    81,    82,
+      85,    88,    90,    92,    94,    96,    98,   100,   102,   105,
+     107,   112,   116,   121,   129,   138,   139,   142,   145,   151,
+     153,   161,   162,   167,   170,   173,   178,   180,   183,   185,
+     188,   192,   194,   197,   201,   203,   206,   210,   216,   220,
+     222,   224,   228,   232,   235,   236,   237,   238,   251,   255,
+     257,   261,   264,   267,   268,   274,   277,   280,   283,   287,
+     289,   292,   293,   295,   299,   303,   309,   315,   321,   327,
+     328,   331,   334,   339,   340,   346,   350,   351,   355,   359,
+     362,   364,   365,   367,   368,   372,   373,   376,   381,   385,
+     390,   391,   394,   396,   398,   404,   409,   414,   415,   419,
+     425,   428,   430,   434,   437,   441,   444,   449
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int8 yyrhs[] =
 {
-      43,     0,    -1,    44,    -1,    45,    -1,    44,    45,    -1,
-      44,     1,    -1,    47,    -1,    49,    -1,    50,    -1,     8,
-      -1,    41,    -1,    36,    -1,    48,     3,    46,     4,    55,
-       5,    -1,    23,    -1,    -1,    15,    41,     6,    54,     7,
-       4,    88,     5,    -1,    16,     4,    51,     5,    -1,    -1,
-      52,    51,    -1,    51,     1,    -1,    -1,    41,     9,    53,
-      41,     8,    -1,    -1,    41,    -1,    54,    10,    41,    -1,
-      54,     1,    -1,    -1,    56,    55,    -1,    55,     1,    -1,
-      58,    -1,    95,    -1,    90,    -1,    91,    -1,    57,    -1,
-      52,    -1,    41,     1,    -1,     8,    -1,    17,    24,    41,
-       8,    -1,    41,    24,    70,    -1,    30,    41,    24,    70,
-      -1,    31,     6,    66,     7,    41,    24,    70,    -1,    30,
-      31,     6,    66,     7,    41,    24,    70,    -1,    -1,    70,
-      59,    -1,    59,     1,    -1,    67,    11,    67,    11,    67,
-      -1,    41,    -1,    60,    13,    67,    13,    67,    13,    67,
-      -1,    -1,     6,    63,    65,     7,    -1,    19,    62,    -1,
-      22,    62,    -1,    20,     6,    61,     7,    -1,    41,    -1,
-      41,    41,    -1,    41,    -1,    66,    41,    -1,    66,    12,
-      41,    -1,    41,    -1,    41,    41,    -1,    41,    41,    41,
-      -1,    41,    -1,    41,    41,    -1,    68,    11,    41,    -1,
-      18,    62,     4,    86,     5,    -1,     4,    59,     5,    -1,
-      52,    -1,    25,    76,     8,    -1,    26,    78,     8,    -1,
-      41,    11,    -1,    -1,    -1,    -1,    32,     6,    71,    41,
-       8,    72,    41,     8,    73,    41,     7,    70,    -1,    33,
-      62,    70,    -1,    69,    -1,    12,    79,     8,    -1,    83,
-       8,    -1,    41,     8,    -1,    -1,    83,     9,    74,    41,
-       8,    -1,    28,     8,    -1,    27,     8,    -1,    29,     8,
-      -1,    64,    70,    75,    -1,     8,    -1,    21,    70,    -1,
-      -1,    68,    -1,    68,    13,    68,    -1,    68,    10,    68,
-      -1,    68,    13,    68,    13,    68,    -1,    68,    10,    68,
-      10,    68,    -1,    36,    13,    68,    13,    68,    -1,    36,
-      10,    68,    10,    68,    -1,    -1,    10,    41,    -1,    68,
-      77,    -1,    68,    77,    14,    46,    -1,    -1,    41,     6,
-      80,    85,     7,    -1,    41,     6,     7,    -1,    -1,    41,
-       6,    82,    -1,    81,    85,     7,    -1,    81,     7,    -1,
-      41,    -1,    -1,    65,    -1,    -1,    85,    10,    84,    -1,
-      -1,    87,    86,    -1,    34,    41,    11,    59,    -1,    36,
-      11,    59,    -1,    35,    41,    11,    59,    -1,    -1,    89,
-      88,    -1,    70,    -1,    95,    -1,    37,    41,     4,    59,
-       5,    -1,    38,     4,    92,     5,    -1,    39,     4,    92,
-       5,    -1,    -1,    41,     8,    92,    -1,    41,    14,    41,
-       8,    92,    -1,    92,     1,    -1,    46,    -1,    46,    13,
-      61,    -1,    93,     8,    -1,    94,    93,     8,    -1,    94,
-       1,    -1,    40,     4,    94,     5,    -1,    40,     4,     5,
-      -1
+      44,     0,    -1,    45,    -1,    46,    -1,    45,    46,    -1,
+      45,     1,    -1,    48,    -1,    50,    -1,    51,    -1,     8,
+      -1,    42,    -1,    36,    -1,    49,     3,    47,     4,    58,
+       5,    -1,    23,    -1,    -1,    15,    42,     6,    57,     7,
+       4,    91,     5,    -1,    16,     4,    52,     5,    -1,    -1,
+      53,    52,    -1,    52,     1,    -1,    -1,    42,     9,    54,
+      42,     8,    -1,    -1,    41,    42,     9,    56,    42,     8,
+      -1,    -1,    42,    -1,    57,    10,    42,    -1,    57,     1,
+      -1,    -1,    59,    58,    -1,    58,     1,    -1,    61,    -1,
+      98,    -1,    93,    -1,    94,    -1,    60,    -1,    53,    -1,
+      55,    -1,    42,     1,    -1,     8,    -1,    17,    24,    42,
+       8,    -1,    42,    24,    73,    -1,    30,    42,    24,    73,
+      -1,    31,     6,    69,     7,    42,    24,    73,    -1,    30,
+      31,     6,    69,     7,    42,    24,    73,    -1,    -1,    73,
+      62,    -1,    62,     1,    -1,    70,    11,    70,    11,    70,
+      -1,    42,    -1,    63,    13,    70,    13,    70,    13,    70,
+      -1,    -1,     6,    66,    68,     7,    -1,    19,    65,    -1,
+      22,    65,    -1,    20,     6,    64,     7,    -1,    42,    -1,
+      42,    42,    -1,    42,    -1,    69,    42,    -1,    69,    12,
+      42,    -1,    42,    -1,    42,    42,    -1,    42,    42,    42,
+      -1,    42,    -1,    42,    42,    -1,    71,    11,    42,    -1,
+      18,    65,     4,    89,     5,    -1,     4,    62,     5,    -1,
+      53,    -1,    55,    -1,    25,    79,     8,    -1,    26,    81,
+       8,    -1,    42,    11,    -1,    -1,    -1,    -1,    32,     6,
+      74,    42,     8,    75,    42,     8,    76,    42,     7,    73,
+      -1,    33,    65,    73,    -1,    72,    -1,    12,    82,     8,
+      -1,    86,     8,    -1,    42,     8,    -1,    -1,    86,     9,
+      77,    42,     8,    -1,    28,     8,    -1,    27,     8,    -1,
+      29,     8,    -1,    67,    73,    78,    -1,     8,    -1,    21,
+      73,    -1,    -1,    71,    -1,    71,    13,    71,    -1,    71,
+      10,    71,    -1,    71,    13,    71,    13,    71,    -1,    71,
+      10,    71,    10,    71,    -1,    36,    13,    71,    13,    71,
+      -1,    36,    10,    71,    10,    71,    -1,    -1,    10,    42,
+      -1,    71,    80,    -1,    71,    80,    14,    47,    -1,    -1,
+      42,     6,    83,    88,     7,    -1,    42,     6,     7,    -1,
+      -1,    42,     6,    85,    -1,    84,    88,     7,    -1,    84,
+       7,    -1,    42,    -1,    -1,    68,    -1,    -1,    88,    10,
+      87,    -1,    -1,    90,    89,    -1,    34,    42,    11,    62,
+      -1,    36,    11,    62,    -1,    35,    42,    11,    62,    -1,
+      -1,    92,    91,    -1,    73,    -1,    98,    -1,    37,    42,
+       4,    62,     5,    -1,    38,     4,    95,     5,    -1,    39,
+       4,    95,     5,    -1,    -1,    42,     8,    95,    -1,    42,
+      14,    42,     8,    95,    -1,    95,     1,    -1,    47,    -1,
+      47,    13,    64,    -1,    96,     8,    -1,    97,    96,     8,
+      -1,    97,     1,    -1,    40,     4,    97,     5,    -1,    40,
+       4,     5,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   185,   185,   188,   189,   190,   193,   194,   195,   196,
-     199,   200,   203,   218,   219,   222,   228,   234,   235,   236,
-     239,   239,   246,   247,   248,   249,   252,   253,   254,   257,
-     258,   259,   260,   261,   262,   263,   264,   267,   272,   276,
-     281,   286,   296,   297,   298,   304,   309,   313,   321,   321,
-     325,   328,   331,   342,   343,   350,   351,   355,   361,   362,
-     367,   375,   376,   380,   386,   395,   398,   399,   402,   405,
-     408,   409,   410,   408,   416,   420,   421,   422,   423,   426,
-     426,   459,   460,   461,   462,   466,   469,   470,   473,   474,
-     477,   480,   484,   488,   492,   498,   499,   503,   506,   512,
-     512,   517,   525,   525,   536,   543,   546,   547,   550,   551,
-     554,   557,   558,   561,   565,   569,   575,   576,   579,   580,
-     581,   587,   592,   597,   598,   599,   601,   604,   605,   612,
-     613,   614,   617,   620
+       0,   186,   186,   189,   190,   191,   194,   195,   196,   197,
+     200,   201,   204,   219,   220,   223,   229,   235,   236,   237,
+     240,   240,   246,   246,   253,   254,   255,   256,   259,   260,
+     261,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     275,   280,   284,   289,   294,   304,   305,   306,   312,   317,
+     321,   329,   329,   333,   336,   339,   350,   351,   358,   359,
+     363,   369,   370,   375,   383,   384,   388,   394,   403,   406,
+     407,   408,   411,   414,   417,   418,   419,   417,   425,   429,
+     430,   431,   432,   435,   435,   468,   469,   470,   471,   475,
+     478,   479,   482,   483,   486,   489,   493,   497,   501,   507,
+     508,   512,   515,   521,   521,   526,   534,   534,   545,   552,
+     555,   556,   559,   560,   563,   566,   567,   570,   574,   578,
+     584,   585,   588,   589,   590,   596,   601,   606,   607,   608,
+     610,   613,   614,   621,   622,   623,   626,   629
 };
 #endif
 
@@ -645,17 +648,18 @@ static const char *const yytname[] =
   "KW_ELSE", "KW_RANDOM", "KW_ABSTRACT", "EXTENMARK", "KW_GOTO", "KW_JUMP",
   "KW_RETURN", "KW_BREAK", "KW_CONTINUE", "KW_REGEXTEN", "KW_HINT",
   "KW_FOR", "KW_WHILE", "KW_CASE", "KW_PATTERN", "KW_DEFAULT", "KW_CATCH",
-  "KW_SWITCHES", "KW_ESWITCHES", "KW_INCLUDES", "word", "$accept", "file",
-  "objects", "object", "context_name", "context", "opt_abstract", "macro",
-  "globals", "global_statements", "assignment", "@1", "arglist",
-  "elements", "element", "ignorepat", "extension", "statements",
-  "timerange", "timespec", "test_expr", "@2", "if_like_head", "word_list",
-  "hint_word", "word3_list", "goto_word", "switch_statement", "statement",
-  "@3", "@4", "@5", "@6", "opt_else", "target", "opt_pri", "jumptarget",
-  "macro_call", "@7", "application_call_head", "@8", "application_call",
-  "opt_word", "eval_arglist", "case_statements", "case_statement",
-  "macro_statements", "macro_statement", "switches", "eswitches",
-  "switchlist", "included_entry", "includeslist", "includes", 0
+  "KW_SWITCHES", "KW_ESWITCHES", "KW_INCLUDES", "KW_LOCAL", "word",
+  "$accept", "file", "objects", "object", "context_name", "context",
+  "opt_abstract", "macro", "globals", "global_statements", "assignment",
+  "@1", "local_assignment", "@2", "arglist", "elements", "element",
+  "ignorepat", "extension", "statements", "timerange", "timespec",
+  "test_expr", "@3", "if_like_head", "word_list", "hint_word",
+  "word3_list", "goto_word", "switch_statement", "statement", "@4", "@5",
+  "@6", "@7", "opt_else", "target", "opt_pri", "jumptarget", "macro_call",
+  "@8", "application_call_head", "@9", "application_call", "opt_word",
+  "eval_arglist", "case_statements", "case_statement", "macro_statements",
+  "macro_statement", "switches", "eswitches", "switchlist",
+  "included_entry", "includeslist", "includes", 0
 };
 #endif
 
@@ -668,27 +672,27 @@ static const yytype_uint16 yytoknum[] =
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296
+     295,   296,   297
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    42,    43,    44,    44,    44,    45,    45,    45,    45,
-      46,    46,    47,    48,    48,    49,    50,    51,    51,    51,
-      53,    52,    54,    54,    54,    54,    55,    55,    55,    56,
-      56,    56,    56,    56,    56,    56,    56,    57,    58,    58,
-      58,    58,    59,    59,    59,    60,    60,    61,    63,    62,
-      64,    64,    64,    65,    65,    66,    66,    66,    67,    67,
-      67,    68,    68,    68,    69,    70,    70,    70,    70,    70,
-      71,    72,    73,    70,    70,    70,    70,    70,    70,    74,
-      70,    70,    70,    70,    70,    70,    75,    75,    76,    76,
-      76,    76,    76,    76,    76,    77,    77,    78,    78,    80,
-      79,    79,    82,    81,    83,    83,    84,    84,    85,    85,
-      85,    86,    86,    87,    87,    87,    88,    88,    89,    89,
-      89,    90,    91,    92,    92,    92,    92,    93,    93,    94,
-      94,    94,    95,    95
+       0,    43,    44,    45,    45,    45,    46,    46,    46,    46,
+      47,    47,    48,    49,    49,    50,    51,    52,    52,    52,
+      54,    53,    56,    55,    57,    57,    57,    57,    58,    58,
+      58,    59,    59,    59,    59,    59,    59,    59,    59,    59,
+      60,    61,    61,    61,    61,    62,    62,    62,    63,    63,
+      64,    66,    65,    67,    67,    67,    68,    68,    69,    69,
+      69,    70,    70,    70,    71,    71,    71,    72,    73,    73,
+      73,    73,    73,    73,    74,    75,    76,    73,    73,    73,
+      73,    73,    73,    77,    73,    73,    73,    73,    73,    73,
+      78,    78,    79,    79,    79,    79,    79,    79,    79,    80,
+      80,    81,    81,    83,    82,    82,    85,    84,    86,    86,
+      87,    87,    88,    88,    88,    89,    89,    90,    90,    90,
+      91,    91,    92,    92,    92,    93,    94,    95,    95,    95,
+      95,    96,    96,    97,    97,    97,    98,    98
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -696,18 +700,18 @@ static const yytype_uint8 yyr2[] =
 {
        0,     2,     1,     1,     2,     2,     1,     1,     1,     1,
        1,     1,     6,     1,     0,     8,     4,     0,     2,     2,
-       0,     5,     0,     1,     3,     2,     0,     2,     2,     1,
-       1,     1,     1,     1,     1,     2,     1,     4,     3,     4,
-       7,     8,     0,     2,     2,     5,     1,     7,     0,     4,
-       2,     2,     4,     1,     2,     1,     2,     3,     1,     2,
-       3,     1,     2,     3,     5,     3,     1,     3,     3,     2,
-       0,     0,     0,    12,     3,     1,     3,     2,     2,     0,
-       5,     2,     2,     2,     3,     1,     2,     0,     1,     3,
-       3,     5,     5,     5,     5,     0,     2,     2,     4,     0,
-       5,     3,     0,     3,     3,     2,     1,     0,     1,     0,
-       3,     0,     2,     4,     3,     4,     0,     2,     1,     1,
-       5,     4,     4,     0,     3,     5,     2,     1,     3,     2,
-       3,     2,     4,     3
+       0,     5,     0,     6,     0,     1,     3,     2,     0,     2,
+       2,     1,     1,     1,     1,     1,     1,     1,     2,     1,
+       4,     3,     4,     7,     8,     0,     2,     2,     5,     1,
+       7,     0,     4,     2,     2,     4,     1,     2,     1,     2,
+       3,     1,     2,     3,     1,     2,     3,     5,     3,     1,
+       1,     3,     3,     2,     0,     0,     0,    12,     3,     1,
+       3,     2,     2,     0,     5,     2,     2,     2,     3,     1,
+       2,     0,     1,     3,     3,     5,     5,     5,     5,     0,
+       2,     2,     4,     0,     5,     3,     0,     3,     3,     2,
+       1,     0,     1,     0,     3,     0,     2,     4,     3,     4,
+       0,     2,     1,     1,     5,     4,     4,     0,     3,     5,
+       2,     1,     3,     2,     3,     2,     4,     3
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -716,206 +720,199 @@ static const yytype_uint8 yyr2[] =
 static const yytype_uint8 yydefact[] =
 {
       14,     9,     0,     0,    13,     0,     0,     3,     6,     0,
-       7,     8,     0,    17,     1,     5,     4,     0,    22,     0,
-       0,    17,    11,    10,     0,    23,     0,    20,    19,    16,
-       0,    26,    25,     0,     0,     0,    36,     0,     0,     0,
-       0,     0,     0,     0,    34,     0,    26,    33,    29,    31,
-      32,    30,   116,    24,     0,     0,     0,     0,     0,   123,
-     123,     0,    35,     0,    28,    12,     0,    42,    85,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    66,     0,    75,   118,   109,     0,     0,
-     116,   119,    21,     0,     0,     0,    55,     0,     0,     0,
-       0,   133,   127,     0,     0,    38,     0,    42,     0,     0,
-      48,     0,    50,     0,    51,     0,    61,    88,     0,    95,
-       0,    82,    81,    83,    70,     0,     0,   102,    78,    69,
-      87,   105,    53,   108,     0,    77,    79,    15,   117,    37,
-       0,    39,     0,     0,    56,   123,     0,   126,   121,   122,
-       0,   129,   131,   132,     0,    44,    65,     0,    99,    76,
-       0,   111,    46,     0,     0,     0,     0,     0,    62,     0,
-       0,     0,    67,     0,    97,    68,     0,    74,    42,   103,
-       0,    84,    54,   104,   107,     0,     0,     0,    57,     0,
-       0,   128,   130,   101,   109,     0,     0,     0,     0,     0,
-     111,    59,     0,    52,     0,     0,     0,    90,    63,    89,
-      96,     0,     0,     0,    86,   106,   110,     0,     0,     0,
-     123,     0,    49,     0,     0,    42,    64,   112,    60,    58,
-       0,     0,     0,     0,     0,     0,    98,    71,   120,    80,
-       0,    40,     0,   100,    42,    42,     0,     0,     0,    94,
-      93,    92,    91,     0,    41,     0,     0,     0,    45,     0,
-       0,    72,    47,     0,     0,     0,    73
+       7,     8,     0,    17,     1,     5,     4,     0,    24,     0,
+       0,    17,    11,    10,     0,    25,     0,    20,    19,    16,
+       0,    28,    27,     0,     0,     0,    39,     0,     0,     0,
+       0,     0,     0,     0,     0,    36,    37,     0,    28,    35,
+      31,    33,    34,    32,   120,    26,     0,     0,     0,     0,
+       0,   127,   127,     0,     0,    38,     0,    30,    12,     0,
+      45,    89,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    69,    70,     0,    79,
+     122,   113,     0,     0,   120,   123,    21,     0,     0,     0,
+      58,     0,     0,     0,     0,   137,   131,     0,     0,    22,
+      41,     0,    45,     0,     0,    51,     0,    53,     0,    54,
+       0,    64,    92,     0,    99,     0,    86,    85,    87,    74,
+       0,     0,   106,    82,    73,    91,   109,    56,   112,     0,
+      81,    83,    15,   121,    40,     0,    42,     0,     0,    59,
+     127,     0,   130,   125,   126,     0,   133,   135,   136,     0,
+       0,    47,    68,     0,   103,    80,     0,   115,    49,     0,
+       0,     0,     0,     0,    65,     0,     0,     0,    71,     0,
+     101,    72,     0,    78,    45,   107,     0,    88,    57,   108,
+     111,     0,     0,     0,    60,     0,     0,   132,   134,     0,
+     105,   113,     0,     0,     0,     0,     0,   115,    62,     0,
+      55,     0,     0,     0,    94,    66,    93,   100,     0,     0,
+       0,    90,   110,   114,     0,     0,     0,   127,    23,     0,
+      52,     0,     0,    45,    67,   116,    63,    61,     0,     0,
+       0,     0,     0,     0,   102,    75,   124,    84,     0,    43,
+       0,   104,    45,    45,     0,     0,     0,    98,    97,    96,
+      95,     0,    44,     0,     0,     0,    48,     0,     0,    76,
+      50,     0,     0,     0,    77
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     5,     6,     7,   102,     8,     9,    10,    11,    20,
-      83,    35,    26,    45,    46,    47,    48,   106,   163,   164,
-     111,   160,    84,   133,    97,   165,   117,    85,   107,   176,
-     253,   263,   185,   181,   118,   174,   120,   109,   194,    87,
-     179,    88,   216,   134,   199,   200,    89,    90,    49,    50,
-      99,   103,   104,    51
+      -1,     5,     6,     7,   106,     8,     9,    10,    11,    20,
+      86,    35,    87,   160,    26,    47,    48,    49,    50,   111,
+     169,   170,   116,   166,    88,   138,   101,   171,   122,    89,
+     112,   182,   261,   271,   191,   187,   123,   180,   125,   114,
+     201,    91,   185,    92,   223,   139,   206,   207,    93,    94,
+      51,    52,   103,   107,   108,    53
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -198
+#define YYPACT_NINF -206
 static const yytype_int16 yypact[] =
 {
-      91,  -198,   -25,    14,  -198,    37,    69,  -198,  -198,    65,
-    -198,  -198,    55,    78,  -198,  -198,  -198,    26,   107,   140,
-      75,    78,  -198,  -198,    74,  -198,    23,  -198,  -198,  -198,
-      81,   138,  -198,   152,   130,   133,  -198,   159,   -14,   184,
-     187,   201,   205,    12,  -198,   116,   138,  -198,  -198,  -198,
-    -198,  -198,    83,  -198,   202,   146,   206,   191,   170,   173,
-     173,     3,  -198,   125,  -198,  -198,   126,   125,  -198,   175,
-     211,   211,   212,   211,    77,   178,   213,   214,   215,   218,
-     211,   185,   164,  -198,   125,  -198,  -198,     7,   117,   220,
-      83,  -198,  -198,   219,   170,   125,  -198,     8,    20,   129,
-     131,  -198,   207,   221,     5,  -198,   134,   125,   222,   223,
-    -198,   226,  -198,   192,  -198,    87,   194,   183,   224,   154,
-     228,  -198,  -198,  -198,  -198,   125,   230,  -198,  -198,  -198,
-     216,  -198,   198,  -198,   182,  -198,  -198,  -198,  -198,  -198,
-      33,  -198,   199,   200,  -198,   173,   203,  -198,  -198,  -198,
-     192,  -198,  -198,  -198,   234,  -198,  -198,    18,   231,  -198,
-     204,   167,     1,   233,   236,   237,   178,   178,  -198,   178,
-     208,   178,  -198,   209,   238,  -198,   210,  -198,   125,  -198,
-     125,  -198,  -198,  -198,   217,   225,   227,   229,  -198,   179,
-     239,  -198,  -198,  -198,   204,   247,   232,   235,   244,   251,
-     167,   240,   241,  -198,   241,   188,   127,   197,  -198,   193,
-    -198,    26,   249,   180,  -198,  -198,  -198,   252,   243,   125,
-     173,   190,  -198,   248,   250,   125,  -198,  -198,  -198,   242,
-     256,   253,   178,   178,   178,   178,  -198,  -198,  -198,  -198,
-     125,  -198,   181,  -198,   125,   125,    21,   241,   241,   254,
-     254,   254,   254,   245,  -198,    24,    30,   257,  -198,   255,
-     241,  -198,  -198,   246,   264,   125,  -198
+     139,  -206,    -4,    42,  -206,    56,   170,  -206,  -206,    66,
+    -206,  -206,   137,    46,  -206,  -206,  -206,    -6,    60,    65,
+      17,    46,  -206,  -206,   107,  -206,    14,  -206,  -206,  -206,
+      34,   119,  -206,   159,   127,   133,  -206,   166,   -14,   191,
+     197,   208,   209,   172,   111,  -206,  -206,    82,   119,  -206,
+    -206,  -206,  -206,  -206,    53,  -206,   207,   174,   211,   194,
+     180,   181,   181,     5,   212,  -206,    96,  -206,  -206,   102,
+      96,  -206,   183,   214,   214,   218,   214,    28,   184,   219,
+     220,   221,   224,   214,   190,   168,  -206,  -206,    96,  -206,
+    -206,    13,   173,   226,    53,  -206,  -206,   225,   180,    96,
+    -206,    20,    84,   104,   112,  -206,   222,   228,     6,  -206,
+    -206,   129,    96,   231,   230,  -206,   235,  -206,   192,  -206,
+     143,   199,   178,   232,   196,   234,  -206,  -206,  -206,  -206,
+      96,   239,  -206,  -206,  -206,   223,  -206,   203,  -206,   185,
+    -206,  -206,  -206,  -206,  -206,    77,  -206,   204,   205,  -206,
+     181,   206,  -206,  -206,  -206,   192,  -206,  -206,  -206,   241,
+     210,  -206,  -206,    18,   243,  -206,   213,   169,     2,   238,
+     246,   245,   184,   184,  -206,   184,   215,   184,  -206,   216,
+     240,  -206,   217,  -206,    96,  -206,    96,  -206,  -206,  -206,
+     227,   229,   233,   236,  -206,   147,   253,  -206,  -206,   254,
+    -206,   213,   256,   237,   242,   255,   259,   169,   244,   247,
+    -206,   247,   198,   120,   200,  -206,   187,  -206,    -6,   257,
+     179,  -206,  -206,  -206,   260,   248,    96,   181,  -206,   189,
+    -206,   262,   263,    96,  -206,  -206,  -206,   249,   264,   265,
+     184,   184,   184,   184,  -206,  -206,  -206,  -206,    96,  -206,
+     182,  -206,    96,    96,    24,   247,   247,   267,   267,   267,
+     267,   250,  -206,    32,   105,   268,  -206,   272,   247,  -206,
+    -206,   251,   275,    96,  -206
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -198,  -198,  -198,   266,   -16,  -198,  -198,  -198,  -198,   258,
-      58,  -198,  -198,   259,  -198,  -198,  -198,  -103,  -198,   112,
-      10,  -198,  -198,   114,   186,  -197,   -73,  -198,   -52,  -198,
-    -198,  -198,  -198,  -198,  -198,  -198,  -198,  -198,  -198,  -198,
-    -198,  -198,  -198,    84,    85,  -198,   260,  -198,  -198,  -198,
-     -57,   171,  -198,   -43
+    -206,  -206,  -206,   261,   -16,  -206,  -206,  -206,  -206,   266,
+      -5,  -206,   -17,  -206,  -206,   252,  -206,  -206,  -206,  -107,
+    -206,   115,    68,  -206,  -206,   117,   201,  -205,   -76,  -206,
+     -54,  -206,  -206,  -206,  -206,  -206,  -206,  -206,  -206,  -206,
+    -206,  -206,  -206,  -206,  -206,    87,    78,  -206,   202,  -206,
+    -206,  -206,   -59,   186,  -206,   -45
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -126
+#define YYTABLE_NINF -130
 static const yytype_int16 yytable[] =
 {
-      86,    24,   119,   100,   157,   230,   152,   231,   101,    91,
-     153,   105,   -58,    62,   131,   142,    12,    56,    13,   155,
-     143,    27,   155,   -43,    32,   155,  -114,    57,   145,  -113,
-      33,   155,   130,    34,   146,  -115,    63,    14,    86,    22,
-     186,    22,   201,   141,    23,   143,    23,    91,   132,   144,
-     257,   258,   -43,   -43,   -43,  -114,  -114,  -114,  -113,  -113,
-    -113,    18,    22,   262,  -115,  -115,  -115,    23,    17,    -2,
-      15,    21,   -14,   177,   144,   213,    28,     1,    31,    21,
-      29,   112,    28,   114,     2,     3,   -18,    67,   189,    44,
-     125,    68,     4,   205,   206,    69,   207,   166,   209,     1,
-     167,    70,    71,    72,    44,    73,     2,     3,    74,    75,
-      76,    77,    78,   115,     4,    79,    80,    64,   116,    19,
-      81,    65,   246,    42,    82,   135,   136,    64,   214,    67,
-     147,   -27,   147,    68,   148,   155,   149,    69,   170,   156,
-     233,   255,   256,    70,    71,    72,    36,    73,    25,    27,
-      74,    75,    76,    77,    78,    37,    52,    79,    80,   249,
-     250,   251,   252,   242,   173,   170,    82,   241,    38,    39,
-     127,    53,   128,    27,    54,   129,    40,    41,    42,    43,
-     147,   155,   147,    55,  -124,   238,  -125,    93,   254,   183,
-      58,    59,   184,   169,   170,   236,   171,   243,   232,   170,
-     184,   196,   197,   198,   170,    60,   235,   234,   170,    61,
-      92,    96,    94,   266,    98,    95,   108,   110,   113,   116,
-     150,   121,   122,   123,   124,   137,   126,   139,   158,   151,
-     161,   159,   172,   162,   178,   168,   175,   180,   193,   182,
-     187,   188,   192,   203,   190,   132,   202,   220,   204,   208,
-     210,   212,   211,   219,   222,   225,   226,   237,   215,   244,
-     239,   245,   191,   261,   248,   170,   217,   240,   218,   247,
-     260,   265,    16,   223,   195,   154,   224,     0,   221,    30,
-     140,   228,   229,   201,     0,   227,   259,   264,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    66,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     138
+      90,    24,   124,   104,   238,   163,   239,   157,    21,    95,
+     105,   158,   110,   -61,    46,    32,    21,    58,    28,   161,
+     136,    33,    29,   -46,    34,   161,    45,   147,    59,  -118,
+      22,    46,   148,   161,   135,    28,    23,  -117,    12,   -18,
+      90,    22,    22,    45,   208,   146,    13,    23,    23,    95,
+     265,   266,   -46,   -46,   -46,   137,    14,    70,  -118,  -118,
+    -118,    71,   149,   270,   120,    72,  -117,  -117,  -117,    17,
+     121,    73,    74,    75,    27,    76,   183,   220,    77,    78,
+      79,    80,    81,    67,   192,    82,    83,    68,    19,   148,
+      84,   195,   150,    42,    43,    85,   212,   213,   151,   214,
+      70,   216,    25,    67,    71,   152,   161,   -29,    72,   153,
+    -119,    31,    65,   152,    73,    74,    75,   154,    76,   149,
+      27,    77,    78,    79,    80,    81,   254,    36,    82,    83,
+     161,   176,   221,   241,   162,    66,    37,    43,    85,  -119,
+    -119,  -119,   117,    18,   119,   263,   264,     1,   152,    38,
+      39,   130,  -128,   172,     2,     3,   173,    40,    41,    42,
+      43,    44,     4,    54,   257,   258,   259,   260,   250,    55,
+      -2,    15,   249,   -14,   132,    56,   133,    27,     1,   134,
+     161,   140,   141,   152,   246,     2,     3,  -129,   175,   176,
+      57,   177,   189,     4,   262,   190,   251,    60,   176,   190,
+     243,    61,   244,   203,   204,   205,   179,   176,   240,   176,
+     242,   176,    62,    63,    64,    96,    97,    98,    99,   274,
+     115,   109,   100,   102,   118,   113,   121,   126,   127,   128,
+     129,   142,   131,   144,   168,   155,   156,   164,   165,   167,
+     178,   174,   181,   184,   186,   188,   193,   194,   196,   198,
+     200,   209,   199,   210,   218,   137,   211,   215,   217,   219,
+     226,   227,   228,   230,   234,   245,   233,    16,   247,   222,
+     197,   224,   248,   252,   253,   225,   256,   255,   176,   231,
+     269,   268,   273,   202,   232,   235,   236,    30,   229,   237,
+       0,   208,   267,   272,   159,     0,   143,     0,     0,   145,
+      69
 };
 
 static const yytype_int16 yycheck[] =
 {
-      52,    17,    75,    60,   107,   202,     1,   204,     5,    52,
-       5,    63,    11,     1,     7,     7,    41,    31,     4,     1,
-      12,     9,     1,     5,     1,     1,     5,    41,     8,     5,
-       7,     1,    84,    10,    14,     5,    24,     0,    90,    36,
-       7,    36,    41,    95,    41,    12,    41,    90,    41,    41,
-     247,   248,    34,    35,    36,    34,    35,    36,    34,    35,
-      36,     6,    36,   260,    34,    35,    36,    41,     3,     0,
-       1,    13,     3,   125,    41,   178,     1,     8,     4,    21,
-       5,    71,     1,    73,    15,    16,     5,     4,   145,    31,
-      80,     8,    23,   166,   167,    12,   169,    10,   171,     8,
-      13,    18,    19,    20,    46,    22,    15,    16,    25,    26,
-      27,    28,    29,    36,    23,    32,    33,     1,    41,    41,
-      37,     5,   225,    40,    41,     8,     9,     1,   180,     4,
-       1,     5,     1,     8,     5,     1,     5,    12,    11,     5,
-      13,   244,   245,    18,    19,    20,     8,    22,    41,     9,
-      25,    26,    27,    28,    29,    17,     4,    32,    33,   232,
-     233,   234,   235,   220,    10,    11,    41,   219,    30,    31,
-       6,    41,     8,     9,    41,    11,    38,    39,    40,    41,
-       1,     1,     1,    24,     5,     5,     5,    41,   240,     7,
-       6,     4,    10,    10,    11,   211,    13,     7,    10,    11,
-      10,    34,    35,    36,    11,     4,    13,    10,    11,     4,
-       8,    41,     6,   265,    41,    24,    41,     6,     6,    41,
-      13,     8,     8,     8,     6,     5,    41,     8,     6,     8,
-       4,     8,     8,    41,     4,    41,     8,    21,     7,    41,
-      41,    41,     8,     7,    41,    41,    13,     8,    11,    41,
-      41,    41,    14,    24,     7,    11,     5,     8,    41,    11,
-       8,    11,   150,     8,    11,    11,    41,    24,    41,    13,
-      13,     7,     6,    41,   160,   104,    41,    -1,   194,    21,
-      94,    41,    41,    41,    -1,   200,    41,    41,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    46,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      90
+      54,    17,    78,    62,   209,   112,   211,     1,    13,    54,
+       5,     5,    66,    11,    31,     1,    21,    31,     1,     1,
+       7,     7,     5,     5,    10,     1,    31,     7,    42,     5,
+      36,    48,    12,     1,    88,     1,    42,     5,    42,     5,
+      94,    36,    36,    48,    42,    99,     4,    42,    42,    94,
+     255,   256,    34,    35,    36,    42,     0,     4,    34,    35,
+      36,     8,    42,   268,    36,    12,    34,    35,    36,     3,
+      42,    18,    19,    20,     9,    22,   130,   184,    25,    26,
+      27,    28,    29,     1,     7,    32,    33,     5,    42,    12,
+      37,   150,     8,    40,    41,    42,   172,   173,    14,   175,
+       4,   177,    42,     1,     8,     1,     1,     5,    12,     5,
+       5,     4,     1,     1,    18,    19,    20,     5,    22,    42,
+       9,    25,    26,    27,    28,    29,   233,     8,    32,    33,
+       1,    11,   186,    13,     5,    24,    17,    41,    42,    34,
+      35,    36,    74,     6,    76,   252,   253,     8,     1,    30,
+      31,    83,     5,    10,    15,    16,    13,    38,    39,    40,
+      41,    42,    23,     4,   240,   241,   242,   243,   227,    42,
+       0,     1,   226,     3,     6,    42,     8,     9,     8,    11,
+       1,     8,     9,     1,     5,    15,    16,     5,    10,    11,
+      24,    13,     7,    23,   248,    10,     7,     6,    11,    10,
+      13,     4,   218,    34,    35,    36,    10,    11,    10,    11,
+      10,    11,     4,     4,    42,     8,    42,     6,    24,   273,
+       6,     9,    42,    42,     6,    42,    42,     8,     8,     8,
+       6,     5,    42,     8,    42,    13,     8,     6,     8,     4,
+       8,    42,     8,     4,    21,    42,    42,    42,    42,     8,
+       7,    13,    42,     7,    14,    42,    11,    42,    42,    42,
+      24,     8,     8,     7,     5,     8,    11,     6,     8,    42,
+     155,    42,    24,    11,    11,    42,    11,    13,    11,    42,
+       8,    13,     7,   166,    42,   207,    42,    21,   201,    42,
+      -1,    42,    42,    42,   108,    -1,    94,    -1,    -1,    98,
+      48
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,     8,    15,    16,    23,    43,    44,    45,    47,    48,
-      49,    50,    41,     4,     0,     1,    45,     3,     6,    41,
-      51,    52,    36,    41,    46,    41,    54,     9,     1,     5,
-      51,     4,     1,     7,    10,    53,     8,    17,    30,    31,
-      38,    39,    40,    41,    52,    55,    56,    57,    58,    90,
-      91,    95,     4,    41,    41,    24,    31,    41,     6,     4,
-       4,     4,     1,    24,     1,     5,    55,     4,     8,    12,
-      18,    19,    20,    22,    25,    26,    27,    28,    29,    32,
-      33,    37,    41,    52,    64,    69,    70,    81,    83,    88,
-      89,    95,     8,    41,     6,    24,    41,    66,    41,    92,
-      92,     5,    46,    93,    94,    70,    59,    70,    41,    79,
-       6,    62,    62,     6,    62,    36,    41,    68,    76,    68,
-      78,     8,     8,     8,     6,    62,    41,     6,     8,    11,
-      70,     7,    41,    65,    85,     8,     9,     5,    88,     8,
-      66,    70,     7,    12,    41,     8,    14,     1,     5,     5,
-      13,     8,     1,     5,    93,     1,     5,    59,     6,     8,
-      63,     4,    41,    60,    61,    67,    10,    13,    41,    10,
-      11,    13,     8,    10,    77,     8,    71,    70,     4,    82,
-      21,    75,    41,     7,    10,    74,     7,    41,    41,    92,
-      41,    61,     8,     7,    80,    65,    34,    35,    36,    86,
-      87,    41,    13,     7,    11,    68,    68,    68,    41,    68,
-      41,    14,    41,    59,    70,    41,    84,    41,    41,    24,
-       8,    85,     7,    41,    41,    11,     5,    86,    41,    41,
-      67,    67,    10,    13,    10,    13,    46,     8,     5,     8,
-      24,    70,    92,     7,    11,    11,    59,    13,    11,    68,
-      68,    68,    68,    72,    70,    59,    59,    67,    67,    41,
-      13,     8,    67,    73,    41,     7,    70
+       0,     8,    15,    16,    23,    44,    45,    46,    48,    49,
+      50,    51,    42,     4,     0,     1,    46,     3,     6,    42,
+      52,    53,    36,    42,    47,    42,    57,     9,     1,     5,
+      52,     4,     1,     7,    10,    54,     8,    17,    30,    31,
+      38,    39,    40,    41,    42,    53,    55,    58,    59,    60,
+      61,    93,    94,    98,     4,    42,    42,    24,    31,    42,
+       6,     4,     4,     4,    42,     1,    24,     1,     5,    58,
+       4,     8,    12,    18,    19,    20,    22,    25,    26,    27,
+      28,    29,    32,    33,    37,    42,    53,    55,    67,    72,
+      73,    84,    86,    91,    92,    98,     8,    42,     6,    24,
+      42,    69,    42,    95,    95,     5,    47,    96,    97,     9,
+      73,    62,    73,    42,    82,     6,    65,    65,     6,    65,
+      36,    42,    71,    79,    71,    81,     8,     8,     8,     6,
+      65,    42,     6,     8,    11,    73,     7,    42,    68,    88,
+       8,     9,     5,    91,     8,    69,    73,     7,    12,    42,
+       8,    14,     1,     5,     5,    13,     8,     1,     5,    96,
+      56,     1,     5,    62,     6,     8,    66,     4,    42,    63,
+      64,    70,    10,    13,    42,    10,    11,    13,     8,    10,
+      80,     8,    74,    73,     4,    85,    21,    78,    42,     7,
+      10,    77,     7,    42,    42,    95,    42,    64,     8,    42,
+       7,    83,    68,    34,    35,    36,    89,    90,    42,    13,
+       7,    11,    71,    71,    71,    42,    71,    42,    14,    42,
+      62,    73,    42,    87,    42,    42,    24,     8,     8,    88,
+       7,    42,    42,    11,     5,    89,    42,    42,    70,    70,
+      10,    13,    10,    13,    47,     8,     5,     8,    24,    73,
+      95,     7,    11,    11,    62,    13,    11,    71,    71,    71,
+      71,    75,    73,    62,    62,    70,    70,    42,    13,     8,
+      70,    76,    42,     7,    73
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -1437,322 +1434,330 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp, parseio)
 
   switch (yytype)
     {
-      case 41: /* "word" */
-#line 177 "ael.y"
+      case 42: /* "word" */
+#line 178 "ael.y"
 	{ free((yyvaluep->str));};
-#line 1444 "ael.tab.c"
+#line 1441 "ael.tab.c"
 	break;
-      case 44: /* "objects" */
-#line 164 "ael.y"
+      case 45: /* "objects" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1452 "ael.tab.c"
+#line 1449 "ael.tab.c"
 	break;
-      case 45: /* "object" */
-#line 164 "ael.y"
+      case 46: /* "object" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1460 "ael.tab.c"
+#line 1457 "ael.tab.c"
 	break;
-      case 46: /* "context_name" */
-#line 177 "ael.y"
+      case 47: /* "context_name" */
+#line 178 "ael.y"
 	{ free((yyvaluep->str));};
-#line 1465 "ael.tab.c"
+#line 1462 "ael.tab.c"
 	break;
-      case 47: /* "context" */
-#line 164 "ael.y"
+      case 48: /* "context" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1473 "ael.tab.c"
+#line 1470 "ael.tab.c"
 	break;
-      case 49: /* "macro" */
-#line 164 "ael.y"
+      case 50: /* "macro" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1481 "ael.tab.c"
+#line 1478 "ael.tab.c"
 	break;
-      case 50: /* "globals" */
-#line 164 "ael.y"
+      case 51: /* "globals" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1489 "ael.tab.c"
+#line 1486 "ael.tab.c"
 	break;
-      case 51: /* "global_statements" */
-#line 164 "ael.y"
+      case 52: /* "global_statements" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1497 "ael.tab.c"
+#line 1494 "ael.tab.c"
 	break;
-      case 52: /* "assignment" */
-#line 164 "ael.y"
+      case 53: /* "assignment" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1505 "ael.tab.c"
+#line 1502 "ael.tab.c"
 	break;
-      case 54: /* "arglist" */
-#line 164 "ael.y"
+      case 55: /* "local_assignment" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1513 "ael.tab.c"
+#line 1510 "ael.tab.c"
 	break;
-      case 55: /* "elements" */
-#line 164 "ael.y"
+      case 57: /* "arglist" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1521 "ael.tab.c"
+#line 1518 "ael.tab.c"
 	break;
-      case 56: /* "element" */
-#line 164 "ael.y"
+      case 58: /* "elements" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1529 "ael.tab.c"
+#line 1526 "ael.tab.c"
 	break;
-      case 57: /* "ignorepat" */
-#line 164 "ael.y"
+      case 59: /* "element" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1537 "ael.tab.c"
+#line 1534 "ael.tab.c"
 	break;
-      case 58: /* "extension" */
-#line 164 "ael.y"
+      case 60: /* "ignorepat" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1545 "ael.tab.c"
+#line 1542 "ael.tab.c"
 	break;
-      case 59: /* "statements" */
-#line 164 "ael.y"
+      case 61: /* "extension" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1553 "ael.tab.c"
+#line 1550 "ael.tab.c"
 	break;
-      case 60: /* "timerange" */
-#line 177 "ael.y"
-	{ free((yyvaluep->str));};
-#line 1558 "ael.tab.c"
-	break;
-      case 61: /* "timespec" */
-#line 164 "ael.y"
+      case 62: /* "statements" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1566 "ael.tab.c"
+#line 1558 "ael.tab.c"
 	break;
-      case 62: /* "test_expr" */
-#line 177 "ael.y"
+      case 63: /* "timerange" */
+#line 178 "ael.y"
 	{ free((yyvaluep->str));};
-#line 1571 "ael.tab.c"
+#line 1563 "ael.tab.c"
 	break;
-      case 64: /* "if_like_head" */
-#line 164 "ael.y"
+      case 64: /* "timespec" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1579 "ael.tab.c"
+#line 1571 "ael.tab.c"
 	break;
-      case 65: /* "word_list" */
-#line 177 "ael.y"
+      case 65: /* "test_expr" */
+#line 178 "ael.y"
 	{ free((yyvaluep->str));};
+#line 1576 "ael.tab.c"
+	break;
+      case 67: /* "if_like_head" */
+#line 165 "ael.y"
+	{
+		destroy_pval((yyvaluep->pval));
+		prev_word=0;
+	};
 #line 1584 "ael.tab.c"
 	break;
-      case 67: /* "word3_list" */
-#line 177 "ael.y"
+      case 68: /* "word_list" */
+#line 178 "ael.y"
 	{ free((yyvaluep->str));};
 #line 1589 "ael.tab.c"
 	break;
-      case 68: /* "goto_word" */
-#line 177 "ael.y"
+      case 70: /* "word3_list" */
+#line 178 "ael.y"
 	{ free((yyvaluep->str));};
 #line 1594 "ael.tab.c"
 	break;
-      case 69: /* "switch_statement" */
-#line 164 "ael.y"
+      case 71: /* "goto_word" */
+#line 178 "ael.y"
+	{ free((yyvaluep->str));};
+#line 1599 "ael.tab.c"
+	break;
+      case 72: /* "switch_statement" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1602 "ael.tab.c"
+#line 1607 "ael.tab.c"
 	break;
-      case 70: /* "statement" */
-#line 164 "ael.y"
+      case 73: /* "statement" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1610 "ael.tab.c"
+#line 1615 "ael.tab.c"
 	break;
-      case 75: /* "opt_else" */
-#line 164 "ael.y"
+      case 78: /* "opt_else" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1618 "ael.tab.c"
+#line 1623 "ael.tab.c"
 	break;
-      case 76: /* "target" */
-#line 164 "ael.y"
+      case 79: /* "target" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1626 "ael.tab.c"
+#line 1631 "ael.tab.c"
 	break;
-      case 77: /* "opt_pri" */
-#line 177 "ael.y"
+      case 80: /* "opt_pri" */
+#line 178 "ael.y"
 	{ free((yyvaluep->str));};
-#line 1631 "ael.tab.c"
+#line 1636 "ael.tab.c"
 	break;
-      case 78: /* "jumptarget" */
-#line 164 "ael.y"
+      case 81: /* "jumptarget" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1639 "ael.tab.c"
+#line 1644 "ael.tab.c"
 	break;
-      case 79: /* "macro_call" */
-#line 164 "ael.y"
+      case 82: /* "macro_call" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1647 "ael.tab.c"
+#line 1652 "ael.tab.c"
 	break;
-      case 81: /* "application_call_head" */
-#line 164 "ael.y"
+      case 84: /* "application_call_head" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1655 "ael.tab.c"
+#line 1660 "ael.tab.c"
 	break;
-      case 83: /* "application_call" */
-#line 164 "ael.y"
+      case 86: /* "application_call" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1663 "ael.tab.c"
+#line 1668 "ael.tab.c"
 	break;
-      case 84: /* "opt_word" */
-#line 177 "ael.y"
+      case 87: /* "opt_word" */
+#line 178 "ael.y"
 	{ free((yyvaluep->str));};
-#line 1668 "ael.tab.c"
+#line 1673 "ael.tab.c"
 	break;
-      case 85: /* "eval_arglist" */
-#line 164 "ael.y"
+      case 88: /* "eval_arglist" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1676 "ael.tab.c"
+#line 1681 "ael.tab.c"
 	break;
-      case 86: /* "case_statements" */
-#line 164 "ael.y"
+      case 89: /* "case_statements" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1684 "ael.tab.c"
+#line 1689 "ael.tab.c"
 	break;
-      case 87: /* "case_statement" */
-#line 164 "ael.y"
+      case 90: /* "case_statement" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1692 "ael.tab.c"
+#line 1697 "ael.tab.c"
 	break;
-      case 88: /* "macro_statements" */
-#line 164 "ael.y"
+      case 91: /* "macro_statements" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1700 "ael.tab.c"
+#line 1705 "ael.tab.c"
 	break;
-      case 89: /* "macro_statement" */
-#line 164 "ael.y"
+      case 92: /* "macro_statement" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1708 "ael.tab.c"
+#line 1713 "ael.tab.c"
 	break;
-      case 90: /* "switches" */
-#line 164 "ael.y"
+      case 93: /* "switches" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1716 "ael.tab.c"
+#line 1721 "ael.tab.c"
 	break;
-      case 91: /* "eswitches" */
-#line 164 "ael.y"
+      case 94: /* "eswitches" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1724 "ael.tab.c"
+#line 1729 "ael.tab.c"
 	break;
-      case 92: /* "switchlist" */
-#line 164 "ael.y"
+      case 95: /* "switchlist" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1732 "ael.tab.c"
+#line 1737 "ael.tab.c"
 	break;
-      case 93: /* "included_entry" */
-#line 164 "ael.y"
+      case 96: /* "included_entry" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1740 "ael.tab.c"
+#line 1745 "ael.tab.c"
 	break;
-      case 94: /* "includeslist" */
-#line 164 "ael.y"
+      case 97: /* "includeslist" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1748 "ael.tab.c"
+#line 1753 "ael.tab.c"
 	break;
-      case 95: /* "includes" */
-#line 164 "ael.y"
+      case 98: /* "includes" */
+#line 165 "ael.y"
 	{
 		destroy_pval((yyvaluep->pval));
 		prev_word=0;
 	};
-#line 1756 "ael.tab.c"
+#line 1761 "ael.tab.c"
 	break;
 
       default:
@@ -2075,57 +2080,57 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-#line 185 "ael.y"
+#line 186 "ael.y"
     { (yyval.pval) = parseio->pval = (yyvsp[(1) - (1)].pval); ;}
     break;
 
   case 3:
-#line 188 "ael.y"
+#line 189 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 4:
-#line 189 "ael.y"
+#line 190 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 5:
-#line 190 "ael.y"
+#line 191 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (2)].pval);;}
     break;
 
   case 6:
-#line 193 "ael.y"
+#line 194 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 7:
-#line 194 "ael.y"
+#line 195 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 8:
-#line 195 "ael.y"
+#line 196 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 9:
-#line 196 "ael.y"
+#line 197 "ael.y"
     {(yyval.pval)=0;/* allow older docs to be read */;}
     break;
 
   case 10:
-#line 199 "ael.y"
+#line 200 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str); ;}
     break;
 
   case 11:
-#line 200 "ael.y"
+#line 201 "ael.y"
     { (yyval.str) = strdup("default"); ;}
     break;
 
   case 12:
-#line 203 "ael.y"
+#line 204 "ael.y"
     {
 		if (!(yyvsp[(5) - (6)].pval)) {
                         ast_log(LOG_WARNING, "==== File: %s, Line %d, Cols: %d-%d: Warning! The empty context %s will be IGNORED!\n", 
@@ -2141,17 +2146,17 @@ yyreduce:
     break;
 
   case 13:
-#line 218 "ael.y"
+#line 219 "ael.y"
     { (yyval.intval) = 1; ;}
     break;
 
   case 14:
-#line 219 "ael.y"
+#line 220 "ael.y"
     { (yyval.intval) = 0; ;}
     break;
 
   case 15:
-#line 222 "ael.y"
+#line 223 "ael.y"
     {
 		(yyval.pval) = npval2(PV_MACRO, &(yylsp[(1) - (8)]), &(yylsp[(8) - (8)]));
 		(yyval.pval)->u1.str = (yyvsp[(2) - (8)].str); (yyval.pval)->u2.arglist = (yyvsp[(4) - (8)].pval); (yyval.pval)->u3.macro_statements = (yyvsp[(7) - (8)].pval);
@@ -2159,7 +2164,7 @@ yyreduce:
     break;
 
   case 16:
-#line 228 "ael.y"
+#line 229 "ael.y"
     {
 		(yyval.pval) = npval2(PV_GLOBALS, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
 		(yyval.pval)->u1.statements = (yyvsp[(3) - (4)].pval);
@@ -2167,27 +2172,27 @@ yyreduce:
     break;
 
   case 17:
-#line 234 "ael.y"
+#line 235 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
   case 18:
-#line 235 "ael.y"
+#line 236 "ael.y"
     {(yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 19:
-#line 236 "ael.y"
+#line 237 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (2)].pval);;}
     break;
 
   case 20:
-#line 239 "ael.y"
+#line 240 "ael.y"
     { reset_semicount(parseio->scanner); ;}
     break;
 
   case 21:
-#line 239 "ael.y"
+#line 240 "ael.y"
     {
 		(yyval.pval) = npval2(PV_VARDEC, &(yylsp[(1) - (5)]), &(yylsp[(5) - (5)]));
 		(yyval.pval)->u1.str = (yyvsp[(1) - (5)].str);
@@ -2196,96 +2201,114 @@ yyreduce:
 
   case 22:
 #line 246 "ael.y"
-    { (yyval.pval) = NULL; ;}
+    { reset_semicount(parseio->scanner); ;}
     break;
 
   case 23:
-#line 247 "ael.y"
-    { (yyval.pval) = nword((yyvsp[(1) - (1)].str), &(yylsp[(1) - (1)])); ;}
+#line 246 "ael.y"
+    {
+		(yyval.pval) = npval2(PV_LOCALVARDEC, &(yylsp[(1) - (6)]), &(yylsp[(6) - (6)]));
+		(yyval.pval)->u1.str = (yyvsp[(2) - (6)].str);
+		(yyval.pval)->u2.val = (yyvsp[(5) - (6)].str); ;}
     break;
 
   case 24:
-#line 248 "ael.y"
-    { (yyval.pval) = linku1((yyvsp[(1) - (3)].pval), nword((yyvsp[(3) - (3)].str), &(yylsp[(3) - (3)]))); ;}
+#line 253 "ael.y"
+    { (yyval.pval) = NULL; ;}
     break;
 
   case 25:
-#line 249 "ael.y"
-    {(yyval.pval)=(yyvsp[(1) - (2)].pval);;}
+#line 254 "ael.y"
+    { (yyval.pval) = nword((yyvsp[(1) - (1)].str), &(yylsp[(1) - (1)])); ;}
     break;
 
   case 26:
-#line 252 "ael.y"
-    {(yyval.pval)=0;;}
+#line 255 "ael.y"
+    { (yyval.pval) = linku1((yyvsp[(1) - (3)].pval), nword((yyvsp[(3) - (3)].str), &(yylsp[(3) - (3)]))); ;}
     break;
 
   case 27:
-#line 253 "ael.y"
-    { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
+#line 256 "ael.y"
+    {(yyval.pval)=(yyvsp[(1) - (2)].pval);;}
     break;
 
   case 28:
-#line 254 "ael.y"
-    { (yyval.pval)=(yyvsp[(1) - (2)].pval);;}
+#line 259 "ael.y"
+    {(yyval.pval)=0;;}
     break;
 
   case 29:
-#line 257 "ael.y"
-    {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
+#line 260 "ael.y"
+    { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 30:
-#line 258 "ael.y"
-    {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
+#line 261 "ael.y"
+    { (yyval.pval)=(yyvsp[(1) - (2)].pval);;}
     break;
 
   case 31:
-#line 259 "ael.y"
+#line 264 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 32:
-#line 260 "ael.y"
+#line 265 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 33:
-#line 261 "ael.y"
+#line 266 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 34:
-#line 262 "ael.y"
+#line 267 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 35:
-#line 263 "ael.y"
-    {free((yyvsp[(1) - (2)].str)); (yyval.pval)=0;;}
+#line 268 "ael.y"
+    {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 36:
-#line 264 "ael.y"
-    {(yyval.pval)=0;/* allow older docs to be read */;}
+#line 269 "ael.y"
+    {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
   case 37:
-#line 267 "ael.y"
+#line 270 "ael.y"
+    {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
+    break;
+
+  case 38:
+#line 271 "ael.y"
+    {free((yyvsp[(1) - (2)].str)); (yyval.pval)=0;;}
+    break;
+
+  case 39:
+#line 272 "ael.y"
+    {(yyval.pval)=0;/* allow older docs to be read */;}
+    break;
+
+  case 40:
+#line 275 "ael.y"
     {
 		(yyval.pval) = npval2(PV_IGNOREPAT, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
 		(yyval.pval)->u1.str = (yyvsp[(3) - (4)].str);;}
     break;
 
-  case 38:
-#line 272 "ael.y"
+  case 41:
+#line 280 "ael.y"
     {
 		(yyval.pval) = npval2(PV_EXTENSION, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
 		(yyval.pval)->u1.str = (yyvsp[(1) - (3)].str);
 		(yyval.pval)->u2.statements = (yyvsp[(3) - (3)].pval); set_dads((yyval.pval),(yyvsp[(3) - (3)].pval));;}
     break;
 
-  case 39:
-#line 276 "ael.y"
+  case 42:
+#line 284 "ael.y"
     {
 		(yyval.pval) = npval2(PV_EXTENSION, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
 		(yyval.pval)->u1.str = (yyvsp[(2) - (4)].str);
@@ -2293,8 +2316,8 @@ yyreduce:
 		(yyval.pval)->u4.regexten=1;;}
     break;
 
-  case 40:
-#line 281 "ael.y"
+  case 43:
+#line 289 "ael.y"
     {
 		(yyval.pval) = npval2(PV_EXTENSION, &(yylsp[(1) - (7)]), &(yylsp[(7) - (7)]));
 		(yyval.pval)->u1.str = (yyvsp[(5) - (7)].str);
@@ -2302,8 +2325,8 @@ yyreduce:
 		(yyval.pval)->u3.hints = (yyvsp[(3) - (7)].str);;}
     break;
 
-  case 41:
-#line 286 "ael.y"
+  case 44:
+#line 294 "ael.y"
     {
 		(yyval.pval) = npval2(PV_EXTENSION, &(yylsp[(1) - (8)]), &(yylsp[(8) - (8)]));
 		(yyval.pval)->u1.str = (yyvsp[(6) - (8)].str);
@@ -2312,23 +2335,23 @@ yyreduce:
 		(yyval.pval)->u3.hints = (yyvsp[(4) - (8)].str);;}
     break;
 
-  case 42:
-#line 296 "ael.y"
+  case 45:
+#line 304 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 43:
-#line 297 "ael.y"
+  case 46:
+#line 305 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
-  case 44:
-#line 298 "ael.y"
+  case 47:
+#line 306 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (2)].pval);;}
     break;
 
-  case 45:
-#line 304 "ael.y"
+  case 48:
+#line 312 "ael.y"
     {
 		asprintf(&(yyval.str), "%s:%s:%s", (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str));
 		free((yyvsp[(1) - (5)].str));
@@ -2336,13 +2359,13 @@ yyreduce:
 		free((yyvsp[(5) - (5)].str)); ;}
     break;
 
-  case 46:
-#line 309 "ael.y"
+  case 49:
+#line 317 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str); ;}
     break;
 
-  case 47:
-#line 313 "ael.y"
+  case 50:
+#line 321 "ael.y"
     {
 		(yyval.pval) = nword((yyvsp[(1) - (7)].str), &(yylsp[(1) - (7)]));
 		(yyval.pval)->next = nword((yyvsp[(3) - (7)].str), &(yylsp[(3) - (7)]));
@@ -2350,45 +2373,45 @@ yyreduce:
 		(yyval.pval)->next->next->next = nword((yyvsp[(7) - (7)].str), &(yylsp[(7) - (7)])); ;}
     break;
 
-  case 48:
-#line 321 "ael.y"
+  case 51:
+#line 329 "ael.y"
     { reset_parencount(parseio->scanner); ;}
     break;
 
-  case 49:
-#line 321 "ael.y"
+  case 52:
+#line 329 "ael.y"
     { (yyval.str) = (yyvsp[(3) - (4)].str); ;}
     break;
 
-  case 50:
-#line 325 "ael.y"
+  case 53:
+#line 333 "ael.y"
     {
 		(yyval.pval)= npval2(PV_IF, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)]));
 		(yyval.pval)->u1.str = (yyvsp[(2) - (2)].str); ;}
     break;
 
-  case 51:
-#line 328 "ael.y"
+  case 54:
+#line 336 "ael.y"
     {
 		(yyval.pval) = npval2(PV_RANDOM, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)]));
 		(yyval.pval)->u1.str=(yyvsp[(2) - (2)].str);;}
     break;
 
-  case 52:
-#line 331 "ael.y"
+  case 55:
+#line 339 "ael.y"
     {
 		(yyval.pval) = npval2(PV_IFTIME, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
 		(yyval.pval)->u1.list = (yyvsp[(3) - (4)].pval);
 		prev_word = 0; ;}
     break;
 
-  case 53:
-#line 342 "ael.y"
+  case 56:
+#line 350 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str);;}
     break;
 
-  case 54:
-#line 343 "ael.y"
+  case 57:
+#line 351 "ael.y"
     {
 		asprintf(&((yyval.str)), "%s%s", (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].str));
 		free((yyvsp[(1) - (2)].str));
@@ -2396,34 +2419,34 @@ yyreduce:
 		prev_word = (yyval.str);;}
     break;
 
-  case 55:
-#line 350 "ael.y"
+  case 58:
+#line 358 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str); ;}
     break;
 
-  case 56:
-#line 351 "ael.y"
+  case 59:
+#line 359 "ael.y"
     {
 		asprintf(&((yyval.str)), "%s %s", (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].str));
 		free((yyvsp[(1) - (2)].str));
 		free((yyvsp[(2) - (2)].str)); ;}
     break;
 
-  case 57:
-#line 355 "ael.y"
+  case 60:
+#line 363 "ael.y"
     {  /* there are often '&' in hints */
 		asprintf(&((yyval.str)), "%s&%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str));
 		free((yyvsp[(1) - (3)].str));
 		free((yyvsp[(3) - (3)].str));;}
     break;
 
-  case 58:
-#line 361 "ael.y"
+  case 61:
+#line 369 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str);;}
     break;
 
-  case 59:
-#line 362 "ael.y"
+  case 62:
+#line 370 "ael.y"
     {
 		asprintf(&((yyval.str)), "%s%s", (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].str));
 		free((yyvsp[(1) - (2)].str));
@@ -2431,8 +2454,8 @@ yyreduce:
 		prev_word = (yyval.str);;}
     break;
 
-  case 60:
-#line 367 "ael.y"
+  case 63:
+#line 375 "ael.y"
     {
 		asprintf(&((yyval.str)), "%s%s%s", (yyvsp[(1) - (3)].str), (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str));
 		free((yyvsp[(1) - (3)].str));
@@ -2441,85 +2464,90 @@ yyreduce:
 		prev_word=(yyval.str);;}
     break;
 
-  case 61:
-#line 375 "ael.y"
+  case 64:
+#line 383 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str);;}
     break;
 
-  case 62:
-#line 376 "ael.y"
+  case 65:
+#line 384 "ael.y"
     {
 		asprintf(&((yyval.str)), "%s%s", (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].str));
 		free((yyvsp[(1) - (2)].str));
 		free((yyvsp[(2) - (2)].str));;}
     break;
 
-  case 63:
-#line 380 "ael.y"
+  case 66:
+#line 388 "ael.y"
     {
 		asprintf(&((yyval.str)), "%s:%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str));
 		free((yyvsp[(1) - (3)].str));
 		free((yyvsp[(3) - (3)].str));;}
     break;
 
-  case 64:
-#line 386 "ael.y"
+  case 67:
+#line 394 "ael.y"
     {
 		(yyval.pval) = npval2(PV_SWITCH, &(yylsp[(1) - (5)]), &(yylsp[(5) - (5)]));
 		(yyval.pval)->u1.str = (yyvsp[(2) - (5)].str);
 		(yyval.pval)->u2.statements = (yyvsp[(4) - (5)].pval); set_dads((yyval.pval),(yyvsp[(4) - (5)].pval));;}
     break;
 
-  case 65:
-#line 395 "ael.y"
+  case 68:
+#line 403 "ael.y"
     {
 		(yyval.pval) = npval2(PV_STATEMENTBLOCK, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
 		(yyval.pval)->u1.list = (yyvsp[(2) - (3)].pval); set_dads((yyval.pval),(yyvsp[(2) - (3)].pval));;}
     break;
 
-  case 66:
-#line 398 "ael.y"
+  case 69:
+#line 406 "ael.y"
     { (yyval.pval) = (yyvsp[(1) - (1)].pval); ;}
     break;
 
-  case 67:
-#line 399 "ael.y"
+  case 70:
+#line 407 "ael.y"
+    { (yyval.pval) = (yyvsp[(1) - (1)].pval); ;}
+    break;
+
+  case 71:
+#line 408 "ael.y"
     {
 		(yyval.pval) = npval2(PV_GOTO, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
 		(yyval.pval)->u1.list = (yyvsp[(2) - (3)].pval);;}
     break;
 
-  case 68:
-#line 402 "ael.y"
+  case 72:
+#line 411 "ael.y"
     {
 		(yyval.pval) = npval2(PV_GOTO, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
 		(yyval.pval)->u1.list = (yyvsp[(2) - (3)].pval);;}
     break;
 
-  case 69:
-#line 405 "ael.y"
+  case 73:
+#line 414 "ael.y"
     {
 		(yyval.pval) = npval2(PV_LABEL, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)]));
 		(yyval.pval)->u1.str = (yyvsp[(1) - (2)].str); ;}
     break;
 
-  case 70:
-#line 408 "ael.y"
+  case 74:
+#line 417 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
-  case 71:
-#line 409 "ael.y"
+  case 75:
+#line 418 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
-  case 72:
-#line 410 "ael.y"
+  case 76:
+#line 419 "ael.y"
     {reset_parencount(parseio->scanner);;}
     break;
 
-  case 73:
-#line 410 "ael.y"
+  case 77:
+#line 419 "ael.y"
     { /* XXX word_list maybe ? */
 		(yyval.pval) = npval2(PV_FOR, &(yylsp[(1) - (12)]), &(yylsp[(12) - (12)]));
 		(yyval.pval)->u1.for_init = (yyvsp[(4) - (12)].str);
@@ -2528,43 +2556,43 @@ yyreduce:
 		(yyval.pval)->u4.for_statements = (yyvsp[(12) - (12)].pval); set_dads((yyval.pval),(yyvsp[(12) - (12)].pval));;}
     break;
 
-  case 74:
-#line 416 "ael.y"
+  case 78:
+#line 425 "ael.y"
     {
 		(yyval.pval) = npval2(PV_WHILE, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
 		(yyval.pval)->u1.str = (yyvsp[(2) - (3)].str);
 		(yyval.pval)->u2.statements = (yyvsp[(3) - (3)].pval); set_dads((yyval.pval),(yyvsp[(3) - (3)].pval));;}
     break;
 
-  case 75:
-#line 420 "ael.y"
+  case 79:
+#line 429 "ael.y"
     { (yyval.pval) = (yyvsp[(1) - (1)].pval); ;}
     break;
 
-  case 76:
-#line 421 "ael.y"
+  case 80:
+#line 430 "ael.y"
     { (yyval.pval) = update_last((yyvsp[(2) - (3)].pval), &(yylsp[(2) - (3)])); ;}
     break;
 
-  case 77:
-#line 422 "ael.y"
+  case 81:
+#line 431 "ael.y"
     { (yyval.pval) = update_last((yyvsp[(1) - (2)].pval), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 78:
-#line 423 "ael.y"
+  case 82:
+#line 432 "ael.y"
     {
 		(yyval.pval)= npval2(PV_APPLICATION_CALL, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)]));
 		(yyval.pval)->u1.str = (yyvsp[(1) - (2)].str);;}
     break;
 
-  case 79:
-#line 426 "ael.y"
+  case 83:
+#line 435 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
-  case 80:
-#line 426 "ael.y"
+  case 84:
+#line 435 "ael.y"
     {
 		char *bufx;
 		int tot=0;
@@ -2600,127 +2628,127 @@ yyreduce:
 	;}
     break;
 
-  case 81:
-#line 459 "ael.y"
+  case 85:
+#line 468 "ael.y"
     { (yyval.pval) = npval2(PV_BREAK, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 82:
-#line 460 "ael.y"
+  case 86:
+#line 469 "ael.y"
     { (yyval.pval) = npval2(PV_RETURN, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 83:
-#line 461 "ael.y"
+  case 87:
+#line 470 "ael.y"
     { (yyval.pval) = npval2(PV_CONTINUE, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 84:
-#line 462 "ael.y"
+  case 88:
+#line 471 "ael.y"
     {
 		(yyval.pval) = update_last((yyvsp[(1) - (3)].pval), &(yylsp[(2) - (3)]));
 		(yyval.pval)->u2.statements = (yyvsp[(2) - (3)].pval); set_dads((yyval.pval),(yyvsp[(2) - (3)].pval));
 		(yyval.pval)->u3.else_statements = (yyvsp[(3) - (3)].pval);set_dads((yyval.pval),(yyvsp[(3) - (3)].pval));;}
     break;
 
-  case 85:
-#line 466 "ael.y"
+  case 89:
+#line 475 "ael.y"
     { (yyval.pval)=0; ;}
     break;
 
-  case 86:
-#line 469 "ael.y"
+  case 90:
+#line 478 "ael.y"
     { (yyval.pval) = (yyvsp[(2) - (2)].pval); ;}
     break;
 
-  case 87:
-#line 470 "ael.y"
+  case 91:
+#line 479 "ael.y"
     { (yyval.pval) = NULL ; ;}
     break;
 
-  case 88:
-#line 473 "ael.y"
+  case 92:
+#line 482 "ael.y"
     { (yyval.pval) = nword((yyvsp[(1) - (1)].str), &(yylsp[(1) - (1)])); ;}
     break;
 
-  case 89:
-#line 474 "ael.y"
+  case 93:
+#line 483 "ael.y"
     {
 		(yyval.pval) = nword((yyvsp[(1) - (3)].str), &(yylsp[(1) - (3)]));
 		(yyval.pval)->next = nword((yyvsp[(3) - (3)].str), &(yylsp[(3) - (3)])); ;}
     break;
 
-  case 90:
-#line 477 "ael.y"
+  case 94:
+#line 486 "ael.y"
     {
 		(yyval.pval) = nword((yyvsp[(1) - (3)].str), &(yylsp[(1) - (3)]));
 		(yyval.pval)->next = nword((yyvsp[(3) - (3)].str), &(yylsp[(3) - (3)])); ;}
     break;
 
-  case 91:
-#line 480 "ael.y"
+  case 95:
+#line 489 "ael.y"
     {
 		(yyval.pval) = nword((yyvsp[(1) - (5)].str), &(yylsp[(1) - (5)]));
 		(yyval.pval)->next = nword((yyvsp[(3) - (5)].str), &(yylsp[(3) - (5)]));
 		(yyval.pval)->next->next = nword((yyvsp[(5) - (5)].str), &(yylsp[(5) - (5)])); ;}
     break;
 
-  case 92:
-#line 484 "ael.y"
+  case 96:
+#line 493 "ael.y"
     {
 		(yyval.pval) = nword((yyvsp[(1) - (5)].str), &(yylsp[(1) - (5)]));
 		(yyval.pval)->next = nword((yyvsp[(3) - (5)].str), &(yylsp[(3) - (5)]));
 		(yyval.pval)->next->next = nword((yyvsp[(5) - (5)].str), &(yylsp[(5) - (5)])); ;}
     break;
 
-  case 93:
-#line 488 "ael.y"
+  case 97:
+#line 497 "ael.y"
     {
 		(yyval.pval) = nword(strdup("default"), &(yylsp[(1) - (5)]));
 		(yyval.pval)->next = nword((yyvsp[(3) - (5)].str), &(yylsp[(3) - (5)]));
 		(yyval.pval)->next->next = nword((yyvsp[(5) - (5)].str), &(yylsp[(5) - (5)])); ;}
     break;
 
-  case 94:
-#line 492 "ael.y"
+  case 98:
+#line 501 "ael.y"
     {
 		(yyval.pval) = nword(strdup("default"), &(yylsp[(1) - (5)]));
 		(yyval.pval)->next = nword((yyvsp[(3) - (5)].str), &(yylsp[(3) - (5)]));
 		(yyval.pval)->next->next = nword((yyvsp[(5) - (5)].str), &(yylsp[(5) - (5)])); ;}
     break;
 
-  case 95:
-#line 498 "ael.y"
+  case 99:
+#line 507 "ael.y"
     { (yyval.str) = strdup("1"); ;}
     break;
 
-  case 96:
-#line 499 "ael.y"
+  case 100:
+#line 508 "ael.y"
     { (yyval.str) = (yyvsp[(2) - (2)].str); ;}
     break;
 
-  case 97:
-#line 503 "ael.y"
+  case 101:
+#line 512 "ael.y"
     {			/* ext[, pri] default 1 */
 		(yyval.pval) = nword((yyvsp[(1) - (2)].str), &(yylsp[(1) - (2)]));
 		(yyval.pval)->next = nword((yyvsp[(2) - (2)].str), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 98:
-#line 506 "ael.y"
+  case 102:
+#line 515 "ael.y"
     {	/* context, ext, pri */
 		(yyval.pval) = nword((yyvsp[(4) - (4)].str), &(yylsp[(4) - (4)]));
 		(yyval.pval)->next = nword((yyvsp[(1) - (4)].str), &(yylsp[(1) - (4)]));
 		(yyval.pval)->next->next = nword((yyvsp[(2) - (4)].str), &(yylsp[(2) - (4)])); ;}
     break;
 
-  case 99:
-#line 512 "ael.y"
+  case 103:
+#line 521 "ael.y"
     {reset_argcount(parseio->scanner);;}
     break;
 
-  case 100:
-#line 512 "ael.y"
+  case 104:
+#line 521 "ael.y"
     {
 		/* XXX original code had @2 but i think we need @5 */
 		(yyval.pval) = npval2(PV_MACRO_CALL, &(yylsp[(1) - (5)]), &(yylsp[(5) - (5)]));
@@ -2728,20 +2756,20 @@ yyreduce:
 		(yyval.pval)->u2.arglist = (yyvsp[(4) - (5)].pval);;}
     break;
 
-  case 101:
-#line 517 "ael.y"
+  case 105:
+#line 526 "ael.y"
     {
 		(yyval.pval)= npval2(PV_MACRO_CALL, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
 		(yyval.pval)->u1.str = (yyvsp[(1) - (3)].str); ;}
     break;
 
-  case 102:
-#line 525 "ael.y"
+  case 106:
+#line 534 "ael.y"
     {reset_argcount(parseio->scanner);;}
     break;
 
-  case 103:
-#line 525 "ael.y"
+  case 107:
+#line 534 "ael.y"
     {
 		if (strcasecmp((yyvsp[(1) - (3)].str),"goto") == 0) {
 			(yyval.pval) = npval2(PV_GOTO, &(yylsp[(1) - (3)]), &(yylsp[(2) - (3)]));
@@ -2753,8 +2781,8 @@ yyreduce:
 		} ;}
     break;
 
-  case 104:
-#line 536 "ael.y"
+  case 108:
+#line 545 "ael.y"
     {
 		(yyval.pval) = update_last((yyvsp[(1) - (3)].pval), &(yylsp[(3) - (3)]));
  		if( (yyval.pval)->type == PV_GOTO )
@@ -2764,179 +2792,179 @@ yyreduce:
 	;}
     break;
 
-  case 105:
-#line 543 "ael.y"
+  case 109:
+#line 552 "ael.y"
     { (yyval.pval) = update_last((yyvsp[(1) - (2)].pval), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 106:
-#line 546 "ael.y"
+  case 110:
+#line 555 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str) ;}
     break;
 
-  case 107:
-#line 547 "ael.y"
+  case 111:
+#line 556 "ael.y"
     { (yyval.str) = strdup(""); ;}
     break;
 
-  case 108:
-#line 550 "ael.y"
+  case 112:
+#line 559 "ael.y"
     { (yyval.pval) = nword((yyvsp[(1) - (1)].str), &(yylsp[(1) - (1)])); ;}
     break;
 
-  case 109:
-#line 551 "ael.y"
+  case 113:
+#line 560 "ael.y"
     {
 		(yyval.pval)= npval(PV_WORD,0/*@1.first_line*/,0/*@1.last_line*/,0/* @1.first_column*/, 0/*@1.last_column*/);
 		(yyval.pval)->u1.str = strdup(""); ;}
     break;
 
-  case 110:
-#line 554 "ael.y"
+  case 114:
+#line 563 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (3)].pval), nword((yyvsp[(3) - (3)].str), &(yylsp[(3) - (3)]))); ;}
     break;
 
-  case 111:
-#line 557 "ael.y"
+  case 115:
+#line 566 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 112:
-#line 558 "ael.y"
+  case 116:
+#line 567 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
-  case 113:
-#line 561 "ael.y"
+  case 117:
+#line 570 "ael.y"
     {
 		(yyval.pval) = npval2(PV_CASE, &(yylsp[(1) - (4)]), &(yylsp[(3) - (4)])); /* XXX 3 or 4 ? */
 		(yyval.pval)->u1.str = (yyvsp[(2) - (4)].str);
 		(yyval.pval)->u2.statements = (yyvsp[(4) - (4)].pval); set_dads((yyval.pval),(yyvsp[(4) - (4)].pval));;}
     break;
 
-  case 114:
-#line 565 "ael.y"
+  case 118:
+#line 574 "ael.y"
     {
 		(yyval.pval) = npval2(PV_DEFAULT, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
 		(yyval.pval)->u1.str = NULL;
 		(yyval.pval)->u2.statements = (yyvsp[(3) - (3)].pval);set_dads((yyval.pval),(yyvsp[(3) - (3)].pval));;}
     break;
 
-  case 115:
-#line 569 "ael.y"
+  case 119:
+#line 578 "ael.y"
     {
 		(yyval.pval) = npval2(PV_PATTERN, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)])); /* XXX@3 or @4 ? */
 		(yyval.pval)->u1.str = (yyvsp[(2) - (4)].str);
 		(yyval.pval)->u2.statements = (yyvsp[(4) - (4)].pval);set_dads((yyval.pval),(yyvsp[(4) - (4)].pval));;}
     break;
 
-  case 116:
-#line 575 "ael.y"
+  case 120:
+#line 584 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 117:
-#line 576 "ael.y"
+  case 121:
+#line 585 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
-  case 118:
-#line 579 "ael.y"
+  case 122:
+#line 588 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 119:
-#line 580 "ael.y"
+  case 123:
+#line 589 "ael.y"
     { (yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 120:
-#line 581 "ael.y"
+  case 124:
+#line 590 "ael.y"
     {
 		(yyval.pval) = npval2(PV_CATCH, &(yylsp[(1) - (5)]), &(yylsp[(5) - (5)]));
 		(yyval.pval)->u1.str = (yyvsp[(2) - (5)].str);
 		(yyval.pval)->u2.statements = (yyvsp[(4) - (5)].pval); set_dads((yyval.pval),(yyvsp[(4) - (5)].pval));;}
     break;
 
-  case 121:
-#line 587 "ael.y"
+  case 125:
+#line 596 "ael.y"
     {
 		(yyval.pval) = npval2(PV_SWITCHES, &(yylsp[(1) - (4)]), &(yylsp[(2) - (4)]));
 		(yyval.pval)->u1.list = (yyvsp[(3) - (4)].pval); set_dads((yyval.pval),(yyvsp[(3) - (4)].pval));;}
     break;
 
-  case 122:
-#line 592 "ael.y"
+  case 126:
+#line 601 "ael.y"
     {
 		(yyval.pval) = npval2(PV_ESWITCHES, &(yylsp[(1) - (4)]), &(yylsp[(2) - (4)]));
 		(yyval.pval)->u1.list = (yyvsp[(3) - (4)].pval); set_dads((yyval.pval),(yyvsp[(3) - (4)].pval));;}
     break;
 
-  case 123:
-#line 597 "ael.y"
+  case 127:
+#line 606 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 124:
-#line 598 "ael.y"
+  case 128:
+#line 607 "ael.y"
     { (yyval.pval) = linku1(nword((yyvsp[(1) - (3)].str), &(yylsp[(1) - (3)])), (yyvsp[(3) - (3)].pval)); ;}
     break;
 
-  case 125:
-#line 599 "ael.y"
+  case 129:
+#line 608 "ael.y"
     { char *x; asprintf(&x,"%s@%s", (yyvsp[(1) - (5)].str),(yyvsp[(3) - (5)].str)); free((yyvsp[(1) - (5)].str)); free((yyvsp[(3) - (5)].str));
 									  (yyval.pval) = linku1(nword(x, &(yylsp[(1) - (5)])), (yyvsp[(5) - (5)].pval));;}
     break;
 
-  case 126:
-#line 601 "ael.y"
+  case 130:
+#line 610 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (2)].pval);;}
     break;
 
-  case 127:
-#line 604 "ael.y"
+  case 131:
+#line 613 "ael.y"
     { (yyval.pval) = nword((yyvsp[(1) - (1)].str), &(yylsp[(1) - (1)])); ;}
     break;
 
-  case 128:
-#line 605 "ael.y"
+  case 132:
+#line 614 "ael.y"
     {
 		(yyval.pval) = nword((yyvsp[(1) - (3)].str), &(yylsp[(1) - (3)]));
 		(yyval.pval)->u2.arglist = (yyvsp[(3) - (3)].pval);
 		prev_word=0; /* XXX sure ? */ ;}
     break;
 
-  case 129:
-#line 612 "ael.y"
+  case 133:
+#line 621 "ael.y"
     { (yyval.pval) = (yyvsp[(1) - (2)].pval); ;}
     break;
 
-  case 130:
-#line 613 "ael.y"
+  case 134:
+#line 622 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (3)].pval), (yyvsp[(2) - (3)].pval)); ;}
     break;
 
-  case 131:
-#line 614 "ael.y"
+  case 135:
+#line 623 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (2)].pval);;}
     break;
 
-  case 132:
-#line 617 "ael.y"
+  case 136:
+#line 626 "ael.y"
     {
 		(yyval.pval) = npval2(PV_INCLUDES, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
 		(yyval.pval)->u1.list = (yyvsp[(3) - (4)].pval);set_dads((yyval.pval),(yyvsp[(3) - (4)].pval));;}
     break;
 
-  case 133:
-#line 620 "ael.y"
+  case 137:
+#line 629 "ael.y"
     {
 		(yyval.pval) = npval2(PV_INCLUDES, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));;}
     break;
 
 
 /* Line 1270 of yacc.c.  */
-#line 2940 "ael.tab.c"
+#line 2968 "ael.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -3155,7 +3183,7 @@ yyreturn:
 }
 
 
-#line 625 "ael.y"
+#line 634 "ael.y"
 
 
 static char *token_equivs1[] =
diff --git a/pbx/ael/ael.tab.h b/pbx/ael/ael.tab.h
index c908e02792..4036c07f7c 100644
--- a/pbx/ael/ael.tab.h
+++ b/pbx/ael/ael.tab.h
@@ -67,7 +67,8 @@
      KW_SWITCHES = 293,
      KW_ESWITCHES = 294,
      KW_INCLUDES = 295,
-     word = 296
+     KW_LOCAL = 296,
+     word = 297
    };
 #endif
 /* Tokens.  */
@@ -109,7 +110,8 @@
 #define KW_SWITCHES 293
 #define KW_ESWITCHES 294
 #define KW_INCLUDES 295
-#define word 296
+#define KW_LOCAL 296
+#define word 297
 
 
 
@@ -123,7 +125,7 @@ typedef union YYSTYPE
 	struct pval *pval;	/* full objects */
 }
 /* Line 1536 of yacc.c.  */
-#line 127 "ael.tab.h"
+#line 129 "ael.tab.h"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
diff --git a/pbx/ael/ael.y b/pbx/ael/ael.y
index 9c332dc032..9aee666875 100644
--- a/pbx/ael/ael.y
+++ b/pbx/ael/ael.y
@@ -83,7 +83,7 @@ static pval *update_last(pval *, YYLTYPE *);
 %token KW_MACRO KW_GLOBALS KW_IGNOREPAT KW_SWITCH KW_IF KW_IFTIME KW_ELSE KW_RANDOM KW_ABSTRACT
 %token EXTENMARK KW_GOTO KW_JUMP KW_RETURN KW_BREAK KW_CONTINUE KW_REGEXTEN KW_HINT
 %token KW_FOR KW_WHILE KW_CASE KW_PATTERN KW_DEFAULT KW_CATCH KW_SWITCHES KW_ESWITCHES
-%token KW_INCLUDES
+%token KW_INCLUDES KW_LOCAL
 
 %right BAR COMMA
 
@@ -114,6 +114,7 @@ static pval *update_last(pval *, YYLTYPE *);
 %type <pval>elements
 %type <pval>arglist
 %type <pval>assignment
+%type <pval>local_assignment
 %type <pval>global_statements
 %type <pval>globals
 %type <pval>macro
@@ -169,7 +170,7 @@ static pval *update_last(pval *, YYLTYPE *);
 		eval_arglist application_call application_call_head
 		macro_call target jumptarget statement switch_statement
 		if_like_head statements extension
-		ignorepat element elements arglist assignment
+		ignorepat element elements arglist assignment local_assignment
 		global_statements globals macro context object objects
 		opt_else
 		timespec included_entry
@@ -242,6 +243,12 @@ assignment : word EQ { reset_semicount(parseio->scanner); }  word SEMI {
 		$$->u2.val = $4; }
 	;
 
+local_assignment : KW_LOCAL word EQ { reset_semicount(parseio->scanner); }  word SEMI {
+		$$ = npval2(PV_LOCALVARDEC, &@1, &@6);
+		$$->u1.str = $2;
+		$$->u2.val = $5; }
+	;
+
 /* XXX this matches missing arguments, is this desired ? */
 arglist : /* empty */ { $$ = NULL; }
 	| word { $$ = nword($1, &@1); }
@@ -260,6 +267,7 @@ element : extension {$$=$1;}
 	| eswitches {$$=$1;}
 	| ignorepat {$$=$1;}
 	| assignment {$$=$1;}
+    | local_assignment {$$=$1;}
 	| word error {free($1); $$=0;}
 	| SEMI  {$$=0;/* allow older docs to be read */}
 	;
@@ -396,6 +404,7 @@ statement : LC statements RC {
 		$$ = npval2(PV_STATEMENTBLOCK, &@1, &@3);
 		$$->u1.list = $2; set_dads($$,$2);}
 	| assignment { $$ = $1; }
+	| local_assignment { $$ = $1; }
 	| KW_GOTO target SEMI {
 		$$ = npval2(PV_GOTO, &@1, &@3);
 		$$->u1.list = $2;}
diff --git a/pbx/ael/ael_lex.c b/pbx/ael/ael_lex.c
index 80adc6f8d7..d277fbc42c 100644
--- a/pbx/ael/ael_lex.c
+++ b/pbx/ael/ael_lex.c
@@ -230,8 +230,8 @@ struct yy_buffer_state
 	 */
 	int yy_at_bol;
 
-    int yy_bs_lineno; /*!< The line count. */
-    int yy_bs_column; /*!< The column count. */
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
     
 	/* Whether to try to fill the input buffer when we reach the
 	 * end of it.
@@ -345,8 +345,8 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
 	*yy_cp = '\0'; \
 	yyg->yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 61
-#define YY_END_OF_BUFFER 62
+#define YY_NUM_RULES 62
+#define YY_END_OF_BUFFER 63
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -354,34 +354,34 @@ struct yy_trans_info
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[234] =
+static yyconst flex_int16_t yy_accept[239] =
     {   0,
-        0,    0,    0,    0,    0,    0,    0,    0,   41,   41,
-       62,   61,   48,   46,   47,   49,   49,    9,    3,    4,
-        7,   49,    8,    5,    6,   12,   49,   49,   49,   49,
-       49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
-       49,    1,   10,    2,   61,   51,   50,   61,   52,   61,
-       57,   58,   59,   61,   61,   53,   54,   55,   61,   56,
-       41,   42,   43,   48,   47,   49,   49,   40,   13,   11,
-       49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
-       49,   20,   49,   49,   49,   49,   49,   49,   49,   49,
-       49,    0,   51,   50,    0,   52,   51,   50,   52,    0,
-
-       57,   58,   59,    0,   57,   58,   59,    0,   53,   54,
-       55,    0,   56,   53,   54,   55,   56,   41,   42,   43,
-       44,   43,   45,   49,   13,   13,   49,   49,   49,   49,
-       49,   49,   49,   49,   31,   49,   49,   49,   49,   49,
-       49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
-       49,   49,   33,   49,   49,   49,   25,   49,   49,   26,
-       24,   49,   49,   49,   27,   49,   49,   49,   49,   49,
-       49,   49,   49,   49,   29,   36,   49,   49,   49,   49,
-       49,   49,   49,   49,   16,   49,   49,   49,   49,   49,
-       32,   49,   49,   49,   49,   49,   49,   49,   21,   49,
-
-       49,   49,   22,   49,   28,   19,   49,   49,   14,   49,
-       34,   49,   17,   49,   49,   35,   49,   49,   49,   15,
-       30,   49,   49,   39,   23,   37,    0,   38,   18,    0,
-        0,   60,    0
+        0,    0,    0,    0,    0,    0,    0,    0,   42,   42,
+       63,   62,   49,   47,   48,   50,   50,    9,    3,    4,
+        7,   50,    8,    5,    6,   12,   50,   50,   50,   50,
+       50,   50,   50,   50,   50,   50,   50,   50,   50,   50,
+       50,   50,    1,   10,    2,   62,   52,   51,   62,   53,
+       62,   58,   59,   60,   62,   62,   54,   55,   56,   62,
+       57,   42,   43,   44,   49,   48,   50,   50,   41,   13,
+       11,   50,   50,   50,   50,   50,   50,   50,   50,   50,
+       50,   50,   21,   50,   50,   50,   50,   50,   50,   50,
+       50,   50,   50,    0,   52,   51,    0,   53,   52,   51,
+
+       53,    0,   58,   59,   60,    0,   58,   59,   60,    0,
+       54,   55,   56,    0,   57,   54,   55,   56,   57,   42,
+       43,   44,   45,   44,   46,   50,   13,   13,   50,   50,
+       50,   50,   50,   50,   50,   50,   32,   50,   50,   50,
+       50,   50,   50,   50,   50,   50,   50,   50,   50,   50,
+       50,   50,   50,   50,   50,   34,   50,   50,   50,   26,
+       50,   50,   27,   25,   50,   50,   50,   28,   50,   50,
+       50,   50,   50,   50,   50,   50,   50,   50,   30,   37,
+       50,   50,   50,   50,   50,   50,   50,   50,   18,   16,
+       50,   50,   50,   50,   50,   33,   50,   50,   50,   50,
+
+       50,   50,   50,   22,   50,   50,   50,   23,   50,   29,
+       20,   50,   50,   14,   50,   35,   50,   17,   50,   50,
+       36,   50,   50,   50,   15,   31,   50,   50,   40,   24,
+       38,    0,   39,   19,    0,    0,   61,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -425,184 +425,186 @@ static yyconst flex_int32_t yy_meta[48] =
         3,    3,    3,    3,    3,    1,    3
     } ;
 
-static yyconst flex_int16_t yy_base[247] =
+static yyconst flex_int16_t yy_base[252] =
     {   0,
         0,    0,   39,   42,   81,  120,  159,  198,   47,   54,
-      310,  985,  307,  985,  304,    0,  276,  985,  985,  985,
-      985,   42,  985,  985,  289,  985,  281,  265,   31,  276,
-       32,  265,   33,  270,   45,  258,  276,  272,   48,  251,
-      263,  985,  985,  985,   73,  985,  985,   89,  985,  237,
-      985,  985,  985,  276,  315,  985,  985,  985,  354,  985,
-      289,  985,   66,  288,  285,    0,  252,    0,  401,  985,
-      247,  256,   64,  245,  252,  239,  235,  238,  239,  234,
-      238,  254,  236,  246,  235,  244,  227,  231,   47,  235,
-      234,  103,  985,  985,  137,  985,  142,  176,  181,  439,
-
-      985,  985,  985,  478,  517,  556,  595,  634,  985,  985,
-      985,  673,  985,  712,  751,  790,  829,  261,  985,  103,
-      985,  104,  985,  238,    0,  876,  221,  238,  233,  231,
-      214,  231,  226,  220,    0,  226,  212,  207,  213,  205,
-      207,  202,  200,  197,  211,  209,  193,  193,  199,  198,
-      192,  197,    0,  199,  100,  185,    0,  184,  201,    0,
-        0,  187,  178,  174,    0,  178,  187,  176,  168,  172,
-      184,  178,  158,  176,    0,    0,  151,  158,  159,  167,
-      154,  156,  151,  151,    0,  137,  140,  132,  130,  131,
-        0,  134,  131,  114,  112,  112,  119,  105,    0,  106,
-
-      116,  103,    0,  111,    0,  110,  106,   91,    0,   95,
-        0,   94,    0,   96,   68,    0,   64,   57,   76,    0,
-        0,   52,   44,    0,    0,    0,  168,    0,    0,    0,
-       50,  985,  985,  922,  927,  932,  937,  940,  945,  950,
-      955,  960,  964,  969,  974,  979
+      314,  985,  311,  985,  308,    0,  280,  985,  985,  985,
+      985,   42,  985,  985,  293,  985,  285,  269,   31,  280,
+       32,  269,   33,  274,   45,  262,  266,  279,  278,   48,
+      257,  269,  985,  985,  985,   73,  985,  985,   89,  985,
+      237,  985,  985,  985,  276,  315,  985,  985,  985,  354,
+      985,  292,  985,   66,  292,  289,    0,  256,    0,  401,
+      985,  250,  262,   64,  252,  259,  243,  238,  241,  242,
+      237,  241,  257,  239,  249,  238,  247,  246,  229,  233,
+       47,  237,  236,  103,  985,  985,  137,  985,  142,  176,
+
+      181,  439,  985,  985,  985,  478,  517,  556,  595,  634,
+      985,  985,  985,  673,  985,  712,  751,  790,  829,  263,
+      985,  103,  985,  104,  985,  240,    0,  876,  223,  240,
+      235,  236,  219,  233,  228,  223,    0,  229,  214,  209,
+      218,  211,  210,  204,  218,  201,  198,  212,  210,  194,
+      194,  200,  199,  193,  198,    0,  200,  100,  187,    0,
+      186,  202,    0,    0,  189,  183,  175,    0,  182,  178,
+      187,  176,  168,  172,  184,  178,  158,  176,    0,    0,
+      151,  158,  159,  167,  154,  156,  151,  151,    0,    0,
+      137,  140,  132,  130,  131,    0,  134,  131,  114,  112,
+
+      112,  119,  105,    0,  106,  116,  103,    0,  111,    0,
+      110,  106,   91,    0,   95,    0,   94,    0,   96,   68,
+        0,   64,   57,   76,    0,    0,   52,   44,    0,    0,
+        0,  168,    0,    0,    0,   50,  985,  985,  922,  927,
+      932,  937,  940,  945,  950,  955,  960,  964,  969,  974,
+      979
     } ;
 
-static yyconst flex_int16_t yy_def[247] =
+static yyconst flex_int16_t yy_def[252] =
     {   0,
-      233,    1,  234,  234,  235,  235,  236,  236,  237,  237,
-      233,  233,  233,  233,  233,  238,  238,  233,  233,  233,
-      233,  238,  233,  233,  233,  233,  238,  238,  238,  238,
+      238,    1,  239,  239,  240,  240,  241,  241,  242,  242,
+      238,  238,  238,  238,  238,  243,  243,  238,  238,  238,
+      238,  243,  238,  238,  238,  238,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  238,  238,  238,  244,  238,  238,  244,  238,
+      245,  238,  238,  238,  245,  246,  238,  238,  238,  246,
+      238,  247,  238,  248,  238,  238,  243,  243,  243,  249,
+      238,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  244,  238,  238,  244,  238,  244,  244,
+
+      244,  245,  238,  238,  238,  245,  245,  245,  245,  246,
+      238,  238,  238,  246,  238,  246,  246,  246,  246,  247,
+      238,  248,  238,  248,  238,  243,  250,  249,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  238,  243,  243,  251,  251,  238,    0,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  233,  233,  233,  239,  233,  233,  239,  233,  240,
-      233,  233,  233,  240,  241,  233,  233,  233,  241,  233,
-      242,  233,  243,  233,  233,  238,  238,  238,  244,  233,
+      238
+    } ;
+
+static yyconst flex_int16_t yy_nxt[1033] =
+    {   0,
+       12,   13,   14,   15,   16,   16,   17,   18,   19,   20,
+       16,   21,   22,   23,   24,   25,   16,   26,   16,   16,
+       12,   16,   27,   28,   29,   30,   31,   32,   33,   34,
+       35,   36,   16,   37,   38,   16,   16,   39,   40,   41,
+       16,   16,   42,   16,   43,   44,   45,   47,   48,   63,
+       47,   48,   69,   74,   70,  237,   63,   64,   47,   49,
+       50,   47,   49,   50,   64,   77,   80,   75,  123,   81,
+       90,   78,   83,   84,   91,  149,  124,  232,  125,  232,
+       85,   95,   96,   47,  234,   50,   47,  150,   50,   52,
+       53,  233,   95,   97,   98,   54,  231,   99,  100,  230,
+
+       52,   55,   53,  131,  132,  123,  123,  229,   99,   97,
+      101,   95,   96,  238,  124,  238,  238,   95,  228,   98,
+      227,  226,   95,   97,   98,   52,  181,   53,   52,   53,
+      182,  225,  224,   99,   54,  101,  223,  222,  221,   52,
+       55,   53,  220,  219,  218,   99,  100,   95,  217,   98,
+       95,   96,  216,  215,  214,  213,   99,   97,  101,  212,
+      211,   95,   97,   98,   52,  210,   53,   57,   58,  232,
+       59,  232,  209,  235,  208,  207,  206,  205,   57,   60,
+       61,   99,  204,  101,   95,   96,   95,  203,   98,   95,
+       96,  202,  201,  200,  199,   95,   97,   98,  198,  197,
+
+       95,   97,   98,   57,  196,   61,   57,   58,  195,   59,
+      194,  193,  192,  191,  190,  189,  188,   57,   60,   61,
+       95,  187,   98,  186,  185,   95,  184,   98,  183,  180,
+      179,  178,  177,  176,  175,  174,  173,  172,  171,  170,
+      169,  168,   57,  167,   61,  103,  104,  166,  165,  164,
+      163,  105,  162,  161,  160,  159,  103,  106,  104,  158,
+      157,  156,  155,  154,  153,  121,  152,  151,  148,  147,
+      146,  145,  144,  143,  142,  141,  140,  139,  138,  137,
+      136,  103,  135,  104,  107,  108,  134,  133,  130,  129,
+      109,  126,   66,   65,  121,  107,  106,  108,   93,   92,
+
+       89,   88,   87,   86,   82,   79,   76,   73,   72,   71,
+       68,   66,   65,  238,  238,  238,  238,  238,  238,  238,
+      107,  238,  108,  111,  112,  238,  113,  238,  238,  238,
+      238,  238,  238,  238,  111,  114,  115,  238,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  111,
+      238,  115,  116,  117,  238,  118,  238,  238,  238,  238,
+      238,  238,  238,  116,  114,  119,  238,  238,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  239,  233,  233,  239,  233,  239,  239,  239,  240,
+      238,  238,  238,  238,  238,  238,  238,  238,  116,  238,
 
-      233,  233,  233,  240,  240,  240,  240,  241,  233,  233,
-      233,  241,  233,  241,  241,  241,  241,  242,  233,  243,
-      233,  243,  233,  238,  245,  244,  238,  238,  238,  238,
+      119,  127,  127,  238,  127,  238,  238,  238,  127,  127,
+      127,  238,  127,  238,  127,  127,  127,  238,  127,  238,
+      238,  127,  238,  238,  238,  238,  238,  238,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  127,  103,  104,  238,
+      238,  238,  238,  105,  238,  238,  238,  238,  103,  106,
+      104,  238,  238,  238,  238,  238,  238,  238,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  103,  238,  104,  107,  108,  238,  238,
+      238,  238,  109,  238,  238,  238,  238,  107,  106,  108,
+
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  107,  238,  108,  103,  104,  238,  238,  238,
+      238,  105,  238,  238,  238,  238,  103,  106,  104,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  103,  238,  104,  103,  104,  238,  238,  238,  238,
+      105,  238,  238,  238,  238,  103,  106,  104,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
 
+      103,  238,  104,  103,  104,  238,  238,  238,  238,  105,
+      238,  238,  238,  238,  103,  106,  104,  238,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  103,
+      238,  104,  111,  112,  238,  113,  238,  238,  238,  238,
+      238,  238,  238,  111,  114,  115,  238,  238,  238,  238,
       238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  233,  238,  238,  246,
-      246,  233,    0,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233
-    } ;
+      238,  238,  238,  238,  238,  238,  238,  238,  111,  238,
+      115,  116,  117,  238,  118,  238,  238,  238,  238,  238,
+      238,  238,  116,  114,  119,  238,  238,  238,  238,  238,
 
-static yyconst flex_int16_t yy_nxt[1033] =
-    {   0,
-       12,   13,   14,   15,   16,   16,   17,   18,   19,   20,
-       16,   21,   22,   23,   24,   25,   16,   26,   16,   16,
-       12,   16,   27,   28,   29,   30,   31,   32,   33,   34,
-       35,   36,   16,   16,   37,   16,   16,   38,   39,   40,
-       16,   16,   41,   16,   42,   43,   44,   46,   47,   62,
-       46,   47,   68,   73,   69,  232,   62,   63,   46,   48,
-       49,   46,   48,   49,   63,   76,   79,   74,  121,   80,
-       88,   77,   82,   83,   89,  146,  122,  227,  123,  227,
-       84,   93,   94,   46,  229,   49,   46,  147,   49,   51,
-       52,  228,   93,   95,   96,   53,  226,   97,   98,  225,
-
-       51,   54,   52,  129,  130,  121,  121,  224,   97,   95,
-       99,   93,   94,  233,  122,  233,  233,   93,  223,   96,
-      222,  221,   93,   95,   96,   51,  177,   52,   51,   52,
-      178,  220,  219,   97,   53,   99,  218,  217,  216,   51,
-       54,   52,  215,  214,  213,   97,   98,   93,  212,   96,
-       93,   94,  211,  210,  209,  208,   97,   95,   99,  207,
-      206,   93,   95,   96,   51,  205,   52,   56,   57,  227,
-       58,  227,  204,  230,  203,  202,  201,  200,   56,   59,
-       60,   97,  199,   99,   93,   94,   93,  198,   96,   93,
-       94,  197,  196,  195,  194,   93,   95,   96,  193,  192,
-
-       93,   95,   96,   56,  191,   60,   56,   57,  190,   58,
-      189,  188,  187,  186,  185,  184,  183,   56,   59,   60,
-       93,  182,   96,  181,  180,   93,  179,   96,  176,  175,
-      174,  173,  172,  171,  170,  169,  168,  167,  166,  165,
-      164,  163,   56,  162,   60,  101,  102,  161,  160,  159,
-      158,  103,  157,  156,  155,  154,  101,  104,  102,  153,
-      152,  151,  150,  119,  149,  148,  145,  144,  143,  142,
-      141,  140,  139,  138,  137,  136,  135,  134,  133,  132,
-      131,  101,  128,  102,  105,  106,  127,  124,   65,   64,
-      107,  119,   91,   90,   87,  105,  104,  106,   86,   85,
-
-       81,   78,   75,   72,   71,   70,   67,   65,   64,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      105,  233,  106,  109,  110,  233,  111,  233,  233,  233,
-      233,  233,  233,  233,  109,  112,  113,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  109,
-      233,  113,  114,  115,  233,  116,  233,  233,  233,  233,
-      233,  233,  233,  114,  112,  117,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  114,  233,
-
-      117,  125,  125,  233,  125,  233,  233,  233,  125,  125,
-      125,  233,  125,  233,  125,  125,  125,  233,  125,  233,
-      233,  125,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  125,  101,  102,  233,
-      233,  233,  233,  103,  233,  233,  233,  233,  101,  104,
-      102,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  101,  233,  102,  105,  106,  233,  233,
-      233,  233,  107,  233,  233,  233,  233,  105,  104,  106,
-
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  105,  233,  106,  101,  102,  233,  233,  233,
-      233,  103,  233,  233,  233,  233,  101,  104,  102,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  101,  233,  102,  101,  102,  233,  233,  233,  233,
-      103,  233,  233,  233,  233,  101,  104,  102,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-
-      101,  233,  102,  101,  102,  233,  233,  233,  233,  103,
-      233,  233,  233,  233,  101,  104,  102,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  101,
-      233,  102,  109,  110,  233,  111,  233,  233,  233,  233,
-      233,  233,  233,  109,  112,  113,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  109,  233,
-      113,  114,  115,  233,  116,  233,  233,  233,  233,  233,
-      233,  233,  114,  112,  117,  233,  233,  233,  233,  233,
-
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  114,  233,  117,
-      109,  110,  233,  111,  233,  233,  233,  233,  233,  233,
-      233,  109,  112,  113,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  109,  233,  113,  109,
-      110,  233,  111,  233,  233,  233,  233,  233,  233,  233,
-      109,  112,  113,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  109,  233,  113,  109,  110,
-
-      233,  111,  233,  233,  233,  233,  233,  233,  233,  109,
-      112,  113,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  109,  233,  113,  109,  110,  233,
-      111,  233,  233,  233,  233,  233,  233,  233,  109,  112,
-      113,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  109,  233,  113,  125,  125,  233,  125,
-      233,  233,  233,  125,  125,  125,  233,  125,  233,  125,
-      125,  125,  233,  125,  233,  233,  125,  233,  233,  233,
-
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  125,   45,   45,   45,   45,   45,   50,   50,   50,
-       50,   50,   55,   55,   55,   55,   55,   61,   61,   61,
-       61,   61,   66,   66,   66,   92,   92,   92,   92,   92,
-      100,  100,  100,  100,  100,  108,  108,  108,  108,  108,
-      118,  118,  118,  118,  120,  120,  120,  120,  120,  126,
-      233,  126,  126,  126,  125,  233,  125,  125,  125,  231,
-      231,  231,  233,  231,   11,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  116,  238,  119,
+      111,  112,  238,  113,  238,  238,  238,  238,  238,  238,
+      238,  111,  114,  115,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  111,  238,  115,  111,
+      112,  238,  113,  238,  238,  238,  238,  238,  238,  238,
+      111,  114,  115,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  111,  238,  115,  111,  112,
+
+      238,  113,  238,  238,  238,  238,  238,  238,  238,  111,
+      114,  115,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  111,  238,  115,  111,  112,  238,
+      113,  238,  238,  238,  238,  238,  238,  238,  111,  114,
+      115,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  111,  238,  115,  127,  127,  238,  127,
+      238,  238,  238,  127,  127,  127,  238,  127,  238,  127,
+      127,  127,  238,  127,  238,  238,  127,  238,  238,  238,
+
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  127,   46,   46,   46,   46,   46,   51,   51,   51,
+       51,   51,   56,   56,   56,   56,   56,   62,   62,   62,
+       62,   62,   67,   67,   67,   94,   94,   94,   94,   94,
+      102,  102,  102,  102,  102,  110,  110,  110,  110,  110,
+      120,  120,  120,  120,  122,  122,  122,  122,  122,  128,
+      238,  128,  128,  128,  127,  238,  127,  127,  127,  236,
+      236,  236,  238,  236,   11,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238
     } ;
 
 static yyconst flex_int16_t yy_chk[1033] =
@@ -612,115 +614,115 @@ static yyconst flex_int16_t yy_chk[1033] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    3,    3,    9,
-        4,    4,   22,   29,   22,  231,   10,    9,    3,    3,
-        3,    4,    4,    4,   10,   31,   33,   29,   63,   33,
-       39,   31,   35,   35,   39,   89,   63,  219,   63,  219,
-       35,   45,   45,    3,  223,    3,    4,   89,    4,    5,
-        5,  222,   45,   45,   45,    5,  218,   48,   48,  217,
-
-        5,    5,    5,   73,   73,  120,  122,  215,   48,   48,
-       48,   92,   92,  120,  122,  120,  122,   45,  214,   45,
-      212,  210,   92,   92,   92,    5,  155,    5,    6,    6,
-      155,  208,  207,   48,    6,   48,  206,  204,  202,    6,
-        6,    6,  201,  200,  198,   95,   95,   92,  197,   92,
-       97,   97,  196,  195,  194,  193,   95,   95,   95,  192,
-      190,   97,   97,   97,    6,  189,    6,    7,    7,  227,
-        7,  227,  188,  227,  187,  186,  184,  183,    7,    7,
-        7,   95,  182,   95,   98,   98,   97,  181,   97,   99,
-       99,  180,  179,  178,  177,   98,   98,   98,  174,  173,
-
-       99,   99,   99,    7,  172,    7,    8,    8,  171,    8,
-      170,  169,  168,  167,  166,  164,  163,    8,    8,    8,
-       98,  162,   98,  159,  158,   99,  156,   99,  154,  152,
-      151,  150,  149,  148,  147,  146,  145,  144,  143,  142,
-      141,  140,    8,  139,    8,   50,   50,  138,  137,  136,
-      134,   50,  133,  132,  131,  130,   50,   50,   50,  129,
-      128,  127,  124,  118,   91,   90,   88,   87,   86,   85,
-       84,   83,   82,   81,   80,   79,   78,   77,   76,   75,
-       74,   50,   72,   50,   54,   54,   71,   67,   65,   64,
-       54,   61,   41,   40,   38,   54,   54,   54,   37,   36,
-
-       34,   32,   30,   28,   27,   25,   17,   15,   13,   11,
+        4,    4,   22,   29,   22,  236,   10,    9,    3,    3,
+        3,    4,    4,    4,   10,   31,   33,   29,   64,   33,
+       40,   31,   35,   35,   40,   91,   64,  224,   64,  224,
+       35,   46,   46,    3,  228,    3,    4,   91,    4,    5,
+        5,  227,   46,   46,   46,    5,  223,   49,   49,  222,
+
+        5,    5,    5,   74,   74,  122,  124,  220,   49,   49,
+       49,   94,   94,  122,  124,  122,  124,   46,  219,   46,
+      217,  215,   94,   94,   94,    5,  158,    5,    6,    6,
+      158,  213,  212,   49,    6,   49,  211,  209,  207,    6,
+        6,    6,  206,  205,  203,   97,   97,   94,  202,   94,
+       99,   99,  201,  200,  199,  198,   97,   97,   97,  197,
+      195,   99,   99,   99,    6,  194,    6,    7,    7,  232,
+        7,  232,  193,  232,  192,  191,  188,  187,    7,    7,
+        7,   97,  186,   97,  100,  100,   99,  185,   99,  101,
+      101,  184,  183,  182,  181,  100,  100,  100,  178,  177,
+
+      101,  101,  101,    7,  176,    7,    8,    8,  175,    8,
+      174,  173,  172,  171,  170,  169,  167,    8,    8,    8,
+      100,  166,  100,  165,  162,  101,  161,  101,  159,  157,
+      155,  154,  153,  152,  151,  150,  149,  148,  147,  146,
+      145,  144,    8,  143,    8,   51,   51,  142,  141,  140,
+      139,   51,  138,  136,  135,  134,   51,   51,   51,  133,
+      132,  131,  130,  129,  126,  120,   93,   92,   90,   89,
+       88,   87,   86,   85,   84,   83,   82,   81,   80,   79,
+       78,   51,   77,   51,   55,   55,   76,   75,   73,   72,
+       55,   68,   66,   65,   62,   55,   55,   55,   42,   41,
+
+       39,   38,   37,   36,   34,   32,   30,   28,   27,   25,
+       17,   15,   13,   11,    0,    0,    0,    0,    0,    0,
+       55,    0,   55,   56,   56,    0,   56,    0,    0,    0,
+        0,    0,    0,    0,   56,   56,   56,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       54,    0,   54,   55,   55,    0,   55,    0,    0,    0,
-        0,    0,    0,    0,   55,   55,   55,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   56,
+        0,   56,   60,   60,    0,   60,    0,    0,    0,    0,
+        0,    0,    0,   60,   60,   60,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   55,
-        0,   55,   59,   59,    0,   59,    0,    0,    0,    0,
-        0,    0,    0,   59,   59,   59,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   59,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   60,    0,
 
-       59,   69,   69,    0,   69,    0,    0,    0,   69,   69,
-       69,    0,   69,    0,   69,   69,   69,    0,   69,    0,
-        0,   69,    0,    0,    0,    0,    0,    0,    0,    0,
+       60,   70,   70,    0,   70,    0,    0,    0,   70,   70,
+       70,    0,   70,    0,   70,   70,   70,    0,   70,    0,
+        0,   70,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   69,  100,  100,    0,
-        0,    0,    0,  100,    0,    0,    0,    0,  100,  100,
-      100,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   70,  102,  102,    0,
+        0,    0,    0,  102,    0,    0,    0,    0,  102,  102,
+      102,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  100,    0,  100,  104,  104,    0,    0,
-        0,    0,  104,    0,    0,    0,    0,  104,  104,  104,
+        0,    0,    0,  102,    0,  102,  106,  106,    0,    0,
+        0,    0,  106,    0,    0,    0,    0,  106,  106,  106,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  104,    0,  104,  105,  105,    0,    0,    0,
-        0,  105,    0,    0,    0,    0,  105,  105,  105,    0,
+        0,    0,  106,    0,  106,  107,  107,    0,    0,    0,
+        0,  107,    0,    0,    0,    0,  107,  107,  107,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  105,    0,  105,  106,  106,    0,    0,    0,    0,
-      106,    0,    0,    0,    0,  106,  106,  106,    0,    0,
+        0,  107,    0,  107,  108,  108,    0,    0,    0,    0,
+      108,    0,    0,    0,    0,  108,  108,  108,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-      106,    0,  106,  107,  107,    0,    0,    0,    0,  107,
-        0,    0,    0,    0,  107,  107,  107,    0,    0,    0,
+      108,    0,  108,  109,  109,    0,    0,    0,    0,  109,
+        0,    0,    0,    0,  109,  109,  109,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  107,
-        0,  107,  108,  108,    0,  108,    0,    0,    0,    0,
-        0,    0,    0,  108,  108,  108,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  109,
+        0,  109,  110,  110,    0,  110,    0,    0,    0,    0,
+        0,    0,    0,  110,  110,  110,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  108,    0,
-      108,  112,  112,    0,  112,    0,    0,    0,    0,    0,
-        0,    0,  112,  112,  112,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  110,    0,
+      110,  114,  114,    0,  114,    0,    0,    0,    0,    0,
+        0,    0,  114,  114,  114,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  112,    0,  112,
-      114,  114,    0,  114,    0,    0,    0,    0,    0,    0,
-        0,  114,  114,  114,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  114,    0,  114,
+      116,  116,    0,  116,    0,    0,    0,    0,    0,    0,
+        0,  116,  116,  116,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  114,    0,  114,  115,
-      115,    0,  115,    0,    0,    0,    0,    0,    0,    0,
-      115,  115,  115,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  116,    0,  116,  117,
+      117,    0,  117,    0,    0,    0,    0,    0,    0,    0,
+      117,  117,  117,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  115,    0,  115,  116,  116,
+        0,    0,    0,    0,    0,  117,    0,  117,  118,  118,
 
-        0,  116,    0,    0,    0,    0,    0,    0,    0,  116,
-      116,  116,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  118,    0,    0,    0,    0,    0,    0,    0,  118,
+      118,  118,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  116,    0,  116,  117,  117,    0,
-      117,    0,    0,    0,    0,    0,    0,    0,  117,  117,
-      117,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  118,    0,  118,  119,  119,    0,
+      119,    0,    0,    0,    0,    0,    0,    0,  119,  119,
+      119,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  117,    0,  117,  126,  126,    0,  126,
-        0,    0,    0,  126,  126,  126,    0,  126,    0,  126,
-      126,  126,    0,  126,    0,    0,  126,    0,    0,    0,
+        0,    0,    0,  119,    0,  119,  128,  128,    0,  128,
+        0,    0,    0,  128,  128,  128,    0,  128,    0,  128,
+      128,  128,    0,  128,    0,    0,  128,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  126,  234,  234,  234,  234,  234,  235,  235,  235,
-      235,  235,  236,  236,  236,  236,  236,  237,  237,  237,
-      237,  237,  238,  238,  238,  239,  239,  239,  239,  239,
-      240,  240,  240,  240,  240,  241,  241,  241,  241,  241,
-      242,  242,  242,  242,  243,  243,  243,  243,  243,  244,
-        0,  244,  244,  244,  245,    0,  245,  245,  245,  246,
-      246,  246,    0,  246,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233
+        0,  128,  239,  239,  239,  239,  239,  240,  240,  240,
+      240,  240,  241,  241,  241,  241,  241,  242,  242,  242,
+      242,  242,  243,  243,  243,  244,  244,  244,  244,  244,
+      245,  245,  245,  245,  245,  246,  246,  246,  246,  246,
+      247,  247,  247,  247,  248,  248,  248,  248,  248,  249,
+        0,  249,  249,  249,  250,    0,  250,  250,  250,  251,
+      251,  251,    0,  251,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+      238,  238
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -730,7 +732,7 @@ static yyconst flex_int16_t yy_chk[1033] =
 #define yymore() (yyg->yy_more_flag = 1)
 #define YY_MORE_ADJ yyg->yy_more_len
 #define YY_RESTORE_YY_MORE_OFFSET
-#line 1 "ael/ael.flex"
+#line 1 "ael.flex"
 /*
  * Asterisk -- An open source telephony toolkit.
  *
@@ -775,7 +777,7 @@ static yyconst flex_int16_t yy_chk[1033] =
  * bison-bridge passes an additional yylval argument to ael_yylex().
  * bison-locations is probably not needed.
  */
-#line 59 "ael/ael.flex"
+#line 59 "ael.flex"
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 #include <sys/types.h>
@@ -881,7 +883,7 @@ static void pbcwhere(const char *text, int *line, int *col )
 #define	STORE_POS
 #define	STORE_LOC
 #endif
-#line 884 "ael_lex.c"
+#line 886 "ael_lex.c"
 
 #define INITIAL 0
 #define paren 1
@@ -889,17 +891,19 @@ static void pbcwhere(const char *text, int *line, int *col )
 #define argg 3
 #define comment 4
 
+#ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
  * down here because we want the user's section 1 to have been scanned first.
  * The user has a chance to override it with an option.
  */
 #include <unistd.h>
+#endif
 
 #ifndef YY_EXTRA_TYPE
 #define YY_EXTRA_TYPE void *
 #endif
 
-/*! \brief Holds the entire state of the reentrant scanner. */
+/* Holds the entire state of the reentrant scanner. */
 struct yyguts_t
     {
 
@@ -908,9 +912,9 @@ struct yyguts_t
 
     /* The rest are the same as the globals declared in the non-reentrant scanner. */
     FILE *yyin_r, *yyout_r;
-    size_t yy_buffer_stack_top; /*!< index of top of stack. */
-    size_t yy_buffer_stack_max; /*!< capacity of stack. */
-    YY_BUFFER_STATE * yy_buffer_stack; /*!< Stack as an array. */
+    size_t yy_buffer_stack_top; /**< index of top of stack. */
+    size_t yy_buffer_stack_max; /**< capacity of stack. */
+    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
     char yy_hold_char;
     int yy_n_chars;
     int yyleng_r;
@@ -937,6 +941,8 @@ struct yyguts_t
 
     }; /* end struct yyguts_t */
 
+static int yy_init_globals (yyscan_t yyscanner );
+
     /* This must go here because YYSTYPE and YYLTYPE are included
      * from bison output in section 1.*/
     #    define yylval yyg->yylval_r
@@ -1087,9 +1093,11 @@ static int input (yyscan_t yyscanner );
 #ifndef YY_DECL
 #define YY_DECL_IS_OURS 1
 
-extern int ael_yylex (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner);
+extern int ael_yylex \
+               (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner);
 
-#define YY_DECL int ael_yylex (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
+#define YY_DECL int ael_yylex \
+               (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
 #endif /* !YY_DECL */
 
 /* Code executed at the beginning of each rule, after yytext and yyleng
@@ -1116,10 +1124,10 @@ YY_DECL
 	register int yy_act;
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
-#line 173 "ael/ael.flex"
+#line 173 "ael.flex"
 
 
-#line 1122 "ael_lex.c"
+#line 1130 "ael_lex.c"
 
     yylval = yylval_param;
 
@@ -1182,13 +1190,13 @@ yy_match:
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 234 )
+				if ( yy_current_state >= 239 )
 					yy_c = yy_meta[(unsigned int) yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 233 );
+		while ( yy_current_state != 238 );
 		yy_cp = yyg->yy_last_accepting_cpos;
 		yy_current_state = yyg->yy_last_accepting_state;
 
@@ -1210,250 +1218,255 @@ do_action:	/* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 175 "ael/ael.flex"
+#line 175 "ael.flex"
 { STORE_POS; return LC;}
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 176 "ael/ael.flex"
+#line 176 "ael.flex"
 { STORE_POS; return RC;}
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 177 "ael/ael.flex"
+#line 177 "ael.flex"
 { STORE_POS; return LP;}
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 178 "ael/ael.flex"
+#line 178 "ael.flex"
 { STORE_POS; return RP;}
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 179 "ael/ael.flex"
+#line 179 "ael.flex"
 { STORE_POS; return SEMI;}
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 180 "ael/ael.flex"
+#line 180 "ael.flex"
 { STORE_POS; return EQ;}
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 181 "ael/ael.flex"
+#line 181 "ael.flex"
 { STORE_POS; return COMMA;}
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 182 "ael/ael.flex"
+#line 182 "ael.flex"
 { STORE_POS; return COLON;}
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 183 "ael/ael.flex"
+#line 183 "ael.flex"
 { STORE_POS; return AMPER;}
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 184 "ael/ael.flex"
+#line 184 "ael.flex"
 { STORE_POS; return BAR;}
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 185 "ael/ael.flex"
+#line 185 "ael.flex"
 { STORE_POS; return EXTENMARK;}
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 186 "ael/ael.flex"
+#line 186 "ael.flex"
 { STORE_POS; return AT;}
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 187 "ael/ael.flex"
+#line 187 "ael.flex"
 {/*comment*/}
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 188 "ael/ael.flex"
+#line 188 "ael.flex"
 { STORE_POS; return KW_CONTEXT;}
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 189 "ael/ael.flex"
+#line 189 "ael.flex"
 { STORE_POS; return KW_ABSTRACT;}
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 190 "ael/ael.flex"
+#line 190 "ael.flex"
 { STORE_POS; return KW_MACRO;};
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 191 "ael/ael.flex"
+#line 191 "ael.flex"
 { STORE_POS; return KW_GLOBALS;}
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 192 "ael/ael.flex"
-{ STORE_POS; return KW_IGNOREPAT;}
+#line 192 "ael.flex"
+{ STORE_POS; return KW_LOCAL;}
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 193 "ael/ael.flex"
-{ STORE_POS; return KW_SWITCH;}
+#line 193 "ael.flex"
+{ STORE_POS; return KW_IGNOREPAT;}
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 194 "ael/ael.flex"
-{ STORE_POS; return KW_IF;}
+#line 194 "ael.flex"
+{ STORE_POS; return KW_SWITCH;}
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 195 "ael/ael.flex"
-{ STORE_POS; return KW_IFTIME;}
+#line 195 "ael.flex"
+{ STORE_POS; return KW_IF;}
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 196 "ael/ael.flex"
-{ STORE_POS; return KW_RANDOM;}
+#line 196 "ael.flex"
+{ STORE_POS; return KW_IFTIME;}
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 197 "ael/ael.flex"
-{ STORE_POS; return KW_REGEXTEN;}
+#line 197 "ael.flex"
+{ STORE_POS; return KW_RANDOM;}
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 198 "ael/ael.flex"
-{ STORE_POS; return KW_HINT;}
+#line 198 "ael.flex"
+{ STORE_POS; return KW_REGEXTEN;}
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 199 "ael/ael.flex"
-{ STORE_POS; return KW_ELSE;}
+#line 199 "ael.flex"
+{ STORE_POS; return KW_HINT;}
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 200 "ael/ael.flex"
-{ STORE_POS; return KW_GOTO;}
+#line 200 "ael.flex"
+{ STORE_POS; return KW_ELSE;}
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 201 "ael/ael.flex"
-{ STORE_POS; return KW_JUMP;}
+#line 201 "ael.flex"
+{ STORE_POS; return KW_GOTO;}
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 202 "ael/ael.flex"
-{ STORE_POS; return KW_RETURN;}
+#line 202 "ael.flex"
+{ STORE_POS; return KW_JUMP;}
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 203 "ael/ael.flex"
-{ STORE_POS; return KW_BREAK;}
+#line 203 "ael.flex"
+{ STORE_POS; return KW_RETURN;}
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 204 "ael/ael.flex"
-{ STORE_POS; return KW_CONTINUE;}
+#line 204 "ael.flex"
+{ STORE_POS; return KW_BREAK;}
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 205 "ael/ael.flex"
-{ STORE_POS; return KW_FOR;}
+#line 205 "ael.flex"
+{ STORE_POS; return KW_CONTINUE;}
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 206 "ael/ael.flex"
-{ STORE_POS; return KW_WHILE;}
+#line 206 "ael.flex"
+{ STORE_POS; return KW_FOR;}
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 207 "ael/ael.flex"
-{ STORE_POS; return KW_CASE;}
+#line 207 "ael.flex"
+{ STORE_POS; return KW_WHILE;}
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 208 "ael/ael.flex"
-{ STORE_POS; return KW_DEFAULT;}
+#line 208 "ael.flex"
+{ STORE_POS; return KW_CASE;}
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 209 "ael/ael.flex"
-{ STORE_POS; return KW_PATTERN;}
+#line 209 "ael.flex"
+{ STORE_POS; return KW_DEFAULT;}
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 210 "ael/ael.flex"
-{ STORE_POS; return KW_CATCH;}
+#line 210 "ael.flex"
+{ STORE_POS; return KW_PATTERN;}
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 211 "ael/ael.flex"
-{ STORE_POS; return KW_SWITCHES;}
+#line 211 "ael.flex"
+{ STORE_POS; return KW_CATCH;}
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 212 "ael/ael.flex"
-{ STORE_POS; return KW_ESWITCHES;}
+#line 212 "ael.flex"
+{ STORE_POS; return KW_SWITCHES;}
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 213 "ael/ael.flex"
-{ STORE_POS; return KW_INCLUDES;}
+#line 213 "ael.flex"
+{ STORE_POS; return KW_ESWITCHES;}
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 214 "ael/ael.flex"
-{ BEGIN(comment); my_col += 2; }
+#line 214 "ael.flex"
+{ STORE_POS; return KW_INCLUDES;}
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 216 "ael/ael.flex"
-{ my_col += yyleng; }
+#line 215 "ael.flex"
+{ BEGIN(comment); my_col += 2; }
 	YY_BREAK
 case 42:
-/* rule 42 can match eol */
 YY_RULE_SETUP
-#line 217 "ael/ael.flex"
-{ ++my_lineno; my_col=1;}
+#line 217 "ael.flex"
+{ my_col += yyleng; }
 	YY_BREAK
 case 43:
+/* rule 43 can match eol */
 YY_RULE_SETUP
-#line 218 "ael/ael.flex"
-{ my_col += yyleng; }
+#line 218 "ael.flex"
+{ ++my_lineno; my_col=1;}
 	YY_BREAK
 case 44:
-/* rule 44 can match eol */
 YY_RULE_SETUP
-#line 219 "ael/ael.flex"
-{ ++my_lineno; my_col=1;}
+#line 219 "ael.flex"
+{ my_col += yyleng; }
 	YY_BREAK
 case 45:
+/* rule 45 can match eol */
 YY_RULE_SETUP
-#line 220 "ael/ael.flex"
-{ my_col += 2; BEGIN(INITIAL); }
+#line 220 "ael.flex"
+{ ++my_lineno; my_col=1;}
 	YY_BREAK
 case 46:
-/* rule 46 can match eol */
 YY_RULE_SETUP
-#line 222 "ael/ael.flex"
-{ my_lineno++; my_col = 1; }
+#line 221 "ael.flex"
+{ my_col += 2; BEGIN(INITIAL); }
 	YY_BREAK
 case 47:
+/* rule 47 can match eol */
 YY_RULE_SETUP
-#line 223 "ael/ael.flex"
-{ my_col += yyleng; }
+#line 223 "ael.flex"
+{ my_lineno++; my_col = 1; }
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 224 "ael/ael.flex"
-{ my_col += (yyleng*8)-(my_col%8); }
+#line 224 "ael.flex"
+{ my_col += yyleng; }
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 226 "ael/ael.flex"
+#line 225 "ael.flex"
+{ my_col += (yyleng*8)-(my_col%8); }
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 227 "ael.flex"
 {
 		STORE_POS;
 		yylval->str = strdup(yytext);
@@ -1468,10 +1481,10 @@ YY_RULE_SETUP
 	 * A comma at the top level is valid here, unlike in argg where it
 	 * is an argument separator so it must be returned as a token.
 	 */
-case 50:
-/* rule 50 can match eol */
+case 51:
+/* rule 51 can match eol */
 YY_RULE_SETUP
-#line 242 "ael/ael.flex"
+#line 243 "ael.flex"
 {
 		if ( pbcpop(')') ) {	/* error */
 			STORE_LOC;
@@ -1494,10 +1507,10 @@ YY_RULE_SETUP
 		}
 	}
 	YY_BREAK
-case 51:
-/* rule 51 can match eol */
+case 52:
+/* rule 52 can match eol */
 YY_RULE_SETUP
-#line 264 "ael/ael.flex"
+#line 265 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if (c == '(')
@@ -1506,10 +1519,10 @@ YY_RULE_SETUP
 		yymore();
 	}
 	YY_BREAK
-case 52:
-/* rule 52 can match eol */
+case 53:
+/* rule 53 can match eol */
 YY_RULE_SETUP
-#line 272 "ael/ael.flex"
+#line 273 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if ( pbcpop(c))  { /* error */
@@ -1531,10 +1544,10 @@ YY_RULE_SETUP
 	 * of the (external) call, which happens when parencount == 0
 	 * before the decrement.
 	 */
-case 53:
-/* rule 53 can match eol */
+case 54:
+/* rule 54 can match eol */
 YY_RULE_SETUP
-#line 294 "ael/ael.flex"
+#line 295 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if (c == '(')
@@ -1543,10 +1556,10 @@ YY_RULE_SETUP
 		yymore();
 	}
 	YY_BREAK
-case 54:
-/* rule 54 can match eol */
+case 55:
+/* rule 55 can match eol */
 YY_RULE_SETUP
-#line 302 "ael/ael.flex"
+#line 303 "ael.flex"
 {
 		if ( pbcpop(')') ) { /* error */
 			STORE_LOC;
@@ -1571,10 +1584,10 @@ YY_RULE_SETUP
 		}
 	}
 	YY_BREAK
-case 55:
-/* rule 55 can match eol */
+case 56:
+/* rule 56 can match eol */
 YY_RULE_SETUP
-#line 326 "ael/ael.flex"
+#line 327 "ael.flex"
 {
 		if( parencount != 0) { /* printf("Folding in a comma!\n"); */
 			yymore();
@@ -1589,10 +1602,10 @@ YY_RULE_SETUP
 		}
 	}
 	YY_BREAK
-case 56:
-/* rule 56 can match eol */
+case 57:
+/* rule 57 can match eol */
 YY_RULE_SETUP
-#line 340 "ael/ael.flex"
+#line 341 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if ( pbcpop(c) ) { /* error */
@@ -1610,20 +1623,20 @@ YY_RULE_SETUP
 	 * or in the first and second operand of a 'for'. As above, match
 	 * commas and use ';' as a separator (hence return it as a separate token).
 	 */
-case 57:
-/* rule 57 can match eol */
+case 58:
+/* rule 58 can match eol */
 YY_RULE_SETUP
-#line 357 "ael/ael.flex"
+#line 358 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		yymore();
 		pbcpush(c);
 	}
 	YY_BREAK
-case 58:
-/* rule 58 can match eol */
+case 59:
+/* rule 59 can match eol */
 YY_RULE_SETUP
-#line 363 "ael/ael.flex"
+#line 364 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if ( pbcpop(c) ) { /* error */
@@ -1636,10 +1649,10 @@ YY_RULE_SETUP
 		yymore();
 	}
 	YY_BREAK
-case 59:
-/* rule 59 can match eol */
+case 60:
+/* rule 60 can match eol */
 YY_RULE_SETUP
-#line 375 "ael/ael.flex"
+#line 376 "ael.flex"
 {
 		STORE_LOC;
 		yylval->str = strdup(yytext);
@@ -1649,10 +1662,10 @@ YY_RULE_SETUP
 		return word;
 	}
 	YY_BREAK
-case 60:
-/* rule 60 can match eol */
+case 61:
+/* rule 61 can match eol */
 YY_RULE_SETUP
-#line 384 "ael/ael.flex"
+#line 385 "ael.flex"
 {
 		FILE *in1;
 		char fnamebuf[1024],*p1,*p2;
@@ -1721,7 +1734,7 @@ case YY_STATE_EOF(paren):
 case YY_STATE_EOF(semic):
 case YY_STATE_EOF(argg):
 case YY_STATE_EOF(comment):
-#line 447 "ael/ael.flex"
+#line 448 "ael.flex"
 {
 		if ( --include_stack_index < 0 ) {
 			yyterminate();
@@ -1735,12 +1748,12 @@ case YY_STATE_EOF(comment):
 		}
 	}
 	YY_BREAK
-case 61:
+case 62:
 YY_RULE_SETUP
-#line 460 "ael/ael.flex"
+#line 461 "ael.flex"
 ECHO;
 	YY_BREAK
-#line 1743 "ael_lex.c"
+#line 1756 "ael_lex.c"
 
 	case YY_END_OF_BUFFER:
 		{
@@ -1926,7 +1939,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 
 	else
 		{
-			size_t num_to_read =
+			int num_to_read =
 			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
 		while ( num_to_read <= 0 )
@@ -2025,7 +2038,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 234 )
+			if ( yy_current_state >= 239 )
 				yy_c = yy_meta[(unsigned int) yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2054,11 +2067,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 234 )
+		if ( yy_current_state >= 239 )
 			yy_c = yy_meta[(unsigned int) yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 233);
+	yy_is_jam = (yy_current_state == 238);
 
 	return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2176,12 +2189,10 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 }
 #endif	/* ifndef YY_NO_INPUT */
 
-/*!
- * \brief Immediately switch to a different input stream.
- * \param input_file A readable stream.
- * \param yyscanner The scanner object.
- *
- * \note This function does not reset the start condition to @c INITIAL .
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
  */
     void ael_yyrestart  (FILE * input_file , yyscan_t yyscanner)
 {
@@ -2197,10 +2208,9 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 	ael_yy_load_buffer_state(yyscanner );
 }
 
-/*! 
- * \brief Switch to a different input buffer.
- * \param new_buffer The new input buffer.
- * \param yyscanner The scanner object.
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
  */
     void ael_yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)
 {
@@ -2243,13 +2253,11 @@ static void ael_yy_load_buffer_state  (yyscan_t yyscanner)
 	yyg->yy_hold_char = *yyg->yy_c_buf_p;
 }
 
-/*!
- * \brief Allocate and initialize an input buffer state.
- * \param file A readable stream.
- * \param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- * \param yyscanner The scanner object.
- *
- * \return the allocated buffer state.
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
  */
     YY_BUFFER_STATE ael_yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
 {
@@ -2275,10 +2283,9 @@ static void ael_yy_load_buffer_state  (yyscan_t yyscanner)
 	return b;
 }
 
-/*! 
- * \brief Destroy the buffer.
- * \param b a buffer created with ael_yy_create_buffer()
- * \param yyscanner The scanner object.
+/** Destroy the buffer.
+ * @param b a buffer created with ael_yy_create_buffer()
+ * @param yyscanner The scanner object.
  */
     void ael_yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
 {
@@ -2329,10 +2336,9 @@ extern int isatty (int );
 	errno = oerrno;
 }
 
-/*!
- * \brief Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * \param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- * \param yyscanner The scanner object.
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * @param yyscanner The scanner object.
  */
     void ael_yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
 {
@@ -2358,12 +2364,11 @@ extern int isatty (int );
 		ael_yy_load_buffer_state(yyscanner );
 }
 
-/*!
- * \brief Pushes the new state onto the stack. The new state becomes
+/** Pushes the new state onto the stack. The new state becomes
  *  the current state. This function will allocate the stack
  *  if necessary.
- *  \param new_buffer The new state.
- *  \param yyscanner The scanner object.
+ *  @param new_buffer The new state.
+ *  @param yyscanner The scanner object.
  */
 void ael_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
 {
@@ -2392,10 +2397,9 @@ void ael_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
 	yyg->yy_did_buffer_switch_on_eof = 1;
 }
 
-/*!
- * \brief Removes and deletes the top of the stack, if present.
+/** Removes and deletes the top of the stack, if present.
  *  The next element becomes the new top.
- *  \param yyscanner The scanner object.
+ *  @param yyscanner The scanner object.
  */
 void ael_yypop_buffer_state (yyscan_t yyscanner)
 {
@@ -2457,13 +2461,11 @@ static void ael_yyensure_buffer_stack (yyscan_t yyscanner)
 	}
 }
 
-/*!
- * \brief Setup the input buffer state to scan directly from a user-specified character buffer.
- * \param base the character buffer
- * \param size the size in bytes of the character buffer
- * \param yyscanner The scanner object.
- *
- * \return the newly allocated buffer state object. 
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object. 
  */
 YY_BUFFER_STATE ael_yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
 {
@@ -2494,31 +2496,26 @@ YY_BUFFER_STATE ael_yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yys
 	return b;
 }
 
-/*!
- * \brief Setup the input buffer state to scan a string. The next call to ael_yylex() will
+/** Setup the input buffer state to scan a string. The next call to ael_yylex() will
  * scan from a @e copy of @a str.
- * \param str a NUL-terminated string to scan
- * \param yyscanner The scanner object.
- *
- * \return the newly allocated buffer state object.
- * 
- * \note If you want to scan bytes that may contain NUL values, then use
+ * @param str a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
  *       ael_yy_scan_bytes() instead.
  */
-YY_BUFFER_STATE ael_yy_scan_string (yyconst char * str , yyscan_t yyscanner)
+YY_BUFFER_STATE ael_yy_scan_string (yyconst char * yy_str , yyscan_t yyscanner)
 {
     
-	return ael_yy_scan_bytes(str,strlen(str) ,yyscanner);
+	return ael_yy_scan_bytes(yy_str,strlen(yy_str) ,yyscanner);
 }
 
-/*!
- * \brief Setup the input buffer state to scan the given bytes. The next call to ael_yylex() will
+/** Setup the input buffer state to scan the given bytes. The next call to ael_yylex() will
  * scan from a @e copy of @a bytes.
- * \param bytes the byte buffer to scan
- * \param len the number of bytes in the buffer pointed to by @a bytes.
- * \param yyscanner The scanner object.
- * 
- * \return the newly allocated buffer state object.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
  */
 YY_BUFFER_STATE ael_yy_scan_bytes  (yyconst char * bytes, int  len , yyscan_t yyscanner)
 {
@@ -2579,9 +2576,8 @@ static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
 
 /* Accessor  methods (get/set functions) to struct members. */
 
-/*!
- * \brief Get the user-defined data for this scanner.
- * \param yyscanner The scanner object.
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
  */
 YY_EXTRA_TYPE ael_yyget_extra  (yyscan_t yyscanner)
 {
@@ -2589,9 +2585,8 @@ YY_EXTRA_TYPE ael_yyget_extra  (yyscan_t yyscanner)
     return yyextra;
 }
 
-/*!
- * \brief Get the current line number.
- * \param yyscanner The scanner object.
+/** Get the current line number.
+ * @param yyscanner The scanner object.
  */
 int ael_yyget_lineno  (yyscan_t yyscanner)
 {
@@ -2603,9 +2598,8 @@ int ael_yyget_lineno  (yyscan_t yyscanner)
     return yylineno;
 }
 
-/*!
- * \brief Get the current column number.
- * \param yyscanner The scanner object.
+/** Get the current column number.
+ * @param yyscanner The scanner object.
  */
 int ael_yyget_column  (yyscan_t yyscanner)
 {
@@ -2617,9 +2611,8 @@ int ael_yyget_column  (yyscan_t yyscanner)
     return yycolumn;
 }
 
-/*!
- * \brief Get the input stream.
- * \param yyscanner The scanner object.
+/** Get the input stream.
+ * @param yyscanner The scanner object.
  */
 FILE *ael_yyget_in  (yyscan_t yyscanner)
 {
@@ -2627,9 +2620,8 @@ FILE *ael_yyget_in  (yyscan_t yyscanner)
     return yyin;
 }
 
-/*!
- * \brief Get the output stream.
- * \param yyscanner The scanner object.
+/** Get the output stream.
+ * @param yyscanner The scanner object.
  */
 FILE *ael_yyget_out  (yyscan_t yyscanner)
 {
@@ -2637,9 +2629,8 @@ FILE *ael_yyget_out  (yyscan_t yyscanner)
     return yyout;
 }
 
-/*!
- * \brief Get the length of the current token.
- * \param yyscanner The scanner object.
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
  */
 int ael_yyget_leng  (yyscan_t yyscanner)
 {
@@ -2647,9 +2638,8 @@ int ael_yyget_leng  (yyscan_t yyscanner)
     return yyleng;
 }
 
-/*!
- * \brief Get the current token.
- * \param yyscanner The scanner object.
+/** Get the current token.
+ * @param yyscanner The scanner object.
  */
 
 char *ael_yyget_text  (yyscan_t yyscanner)
@@ -2658,10 +2648,9 @@ char *ael_yyget_text  (yyscan_t yyscanner)
     return yytext;
 }
 
-/*!
- * \brief Set the user-defined data. This data is never touched by the scanner.
- * \param user_defined The data to be associated with this scanner.
- * \param yyscanner The scanner object.
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
  */
 void ael_yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
 {
@@ -2669,10 +2658,9 @@ void ael_yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
     yyextra = user_defined ;
 }
 
-/*!
- * \brief Set the current line number.
- * \param line_number
- * \param yyscanner The scanner object.
+/** Set the current line number.
+ * @param line_number
+ * @param yyscanner The scanner object.
  */
 void ael_yyset_lineno (int  line_number , yyscan_t yyscanner)
 {
@@ -2685,10 +2673,9 @@ void ael_yyset_lineno (int  line_number , yyscan_t yyscanner)
     yylineno = line_number;
 }
 
-/*!
- * \brief Set the current column.
- * \param line_number
- * \param yyscanner The scanner object.
+/** Set the current column.
+ * @param line_number
+ * @param yyscanner The scanner object.
  */
 void ael_yyset_column (int  column_no , yyscan_t yyscanner)
 {
@@ -2701,13 +2688,11 @@ void ael_yyset_column (int  column_no , yyscan_t yyscanner)
     yycolumn = column_no;
 }
 
-/*!
- * \brief Set the input stream. This does not discard the current
+/** Set the input stream. This does not discard the current
  * input buffer.
- * \param in_str A readable stream.
- * \param yyscanner The scanner object.
- *
- * \see ael_yy_switch_to_buffer
+ * @param in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see ael_yy_switch_to_buffer
  */
 void ael_yyset_in (FILE *  in_str , yyscan_t yyscanner)
 {
@@ -2904,7 +2889,7 @@ void ael_yyfree (void * ptr , yyscan_t yyscanner)
 #undef YY_DECL_IS_OURS
 #undef YY_DECL
 #endif
-#line 460 "ael/ael.flex"
+#line 461 "ael.flex"
 
 
 
diff --git a/pbx/pbx_ael.c b/pbx/pbx_ael.c
index 66ea629a49..d5d58b316c 100644
--- a/pbx/pbx_ael.c
+++ b/pbx/pbx_ael.c
@@ -315,6 +315,10 @@ static void print_pval(FILE *fin, pval *item, int depth)
 		fprintf(fin,"%s=%s;\n", item->u1.str, item->u2.val);
 		break;
 			
+	case PV_LOCALVARDEC:
+		fprintf(fin,"local %s=%s;\n", item->u1.str, item->u2.val);
+		break;
+			
 	case PV_GOTO:
 		fprintf(fin,"goto %s", item->u1.list->u1.str);
 		if ( item->u1.list->next )
@@ -565,6 +569,7 @@ void traverse_pval_item_template(pval *item, int depth)/* depth comes in handy f
 		break;
 			
 	case PV_VARDEC:
+	case PV_LOCALVARDEC:
 		/* fields: item->u1.str     == variable name
 		           item->u2.val     == variable value to assign
 		*/
@@ -2627,6 +2632,7 @@ void check_pval_item(pval *item, struct argapp *apps, int in_globals)
 		break;
 			
 	case PV_VARDEC:
+	case PV_LOCALVARDEC:
 		/* fields: item->u1.str     == variable name
 		           item->u2.val     == variable value to assign
 		*/
@@ -3064,6 +3070,17 @@ static void gen_prios(struct ael_extension *exten, char *label, pval *statement,
 			linkprio(exten, pr);
 			break;
 
+		case PV_LOCALVARDEC:
+			pr = new_prio();
+			pr->type = AEL_APPCALL;
+			snprintf(buf1,sizeof(buf1),"LOCAL(%s)=$[%s]", p->u1.str, p->u2.val);
+			pr->app = strdup("Set");
+			remove_spaces_before_equals(buf1);
+			pr->appargs = strdup(buf1);
+			pr->origin = p;
+			linkprio(exten, pr);
+			break;
+
 		case PV_GOTO:
 			pr = new_prio();
 			pr->type = AEL_APPCALL;
@@ -4335,6 +4352,7 @@ void destroy_pval_item(pval *item)
 		break;
 			
 	case PV_VARDEC:
+	case PV_LOCALVARDEC:
 		/* fields: item->u1.str     == variable name
 		           item->u2.val     == variable value to assign
 		*/
-- 
GitLab