METRON-831: Add lambda expressions and rudimentary functional programming 
primitives to Stellar.  This closes apache/incubator-metron#517


Project: http://git-wip-us.apache.org/repos/asf/incubator-metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-metron/commit/ab80e7b1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-metron/tree/ab80e7b1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-metron/diff/ab80e7b1

Branch: refs/heads/master
Commit: ab80e7b18ba1fb18adeb7645fda9440a9644d34e
Parents: 7e21ad3
Author: cstella <ceste...@gmail.com>
Authored: Mon Apr 10 09:19:49 2017 -0400
Committer: cstella <ceste...@gmail.com>
Committed: Mon Apr 10 09:19:49 2017 -0400

----------------------------------------------------------------------
 metron-platform/metron-common/README.md         |  56 +-
 .../metron/common/stellar/generated/Stellar.g4  |  45 +-
 .../metron-common/src/main/java/Stellar.tokens  | 132 +--
 .../src/main/java/StellarLexer.tokens           | 132 +--
 .../dsl/functions/DataStructureFunctions.java   |  30 +
 .../dsl/functions/FunctionalFunctions.java      | 121 +++
 .../metron/common/stellar/LambdaExpression.java |  68 ++
 .../metron/common/stellar/StellarCompiler.java  |  90 +-
 .../stellar/generated/StellarBaseListener.java  |  84 ++
 .../common/stellar/generated/StellarLexer.java  | 354 ++++----
 .../stellar/generated/StellarListener.java      |  74 ++
 .../common/stellar/generated/StellarParser.java | 835 +++++++++++++------
 .../functions/DataStructureFunctionsTest.java   |  59 ++
 .../dsl/functions/FunctionalFunctionsTest.java  | 235 ++++++
 .../metron/common/stellar/StellarTest.java      |   3 +-
 .../SimpleHBaseEnrichmentFunctionsTest.java     |  15 +
 16 files changed, 1765 insertions(+), 568 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/README.md
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/README.md 
b/metron-platform/metron-common/README.md
index c17bb5b..d55843c 100644
--- a/metron-platform/metron-common/README.md
+++ b/metron-platform/metron-common/README.md
@@ -28,7 +28,7 @@ The query language supports the following:
 * Determining whether a field exists (via `exists`)
 * An `in` operator that works like the `in` in Python
 * The ability to have parenthesis to make order of operations explicit
-* User defined functions
+* User defined functions, including Lambda expressions 
 
 ## Stellar Language Keywords
 The following keywords need to be single quote escaped in order to be used in 
Stellar expressions:
@@ -73,6 +73,27 @@ Below is how the `==` operator is expected to work:
 
 The `!=` operator is the negation of the above.
 
+## Stellar Language Lambda Expressions
+
+Stellar provides the capability to pass lambda expressions to functions
+which wish to support that layer of indirection.  The syntax is:
+* `(named_variables) -> stellar_expression` : Lambda expression with named 
variables
+  * For instance, the lambda expression which calls `TO_UPPER` on a named 
argument `x` could be be expressed as `(x) -> TO_UPPER(x)`.
+* `var -> stellar_expression` : Lambda expression with a single named 
variable, `var`
+  * For instance, the lambda expression which calls `TO_UPPER` on a named 
argument `x` could be expressed as `x -> TO_UPPER(x)`.  Note, this is more 
succinct but equivalent to the example directly above.
+* `() -> stellar_expression` : Lambda expression with no named variables.
+  * If no named variables are needed, you may omit the named variable section. 
 For instance, the lambda expression which returns a constant `false` would be 
`() -> false`
+
+where 
+* `named_variables` is a comma separated list of variables to use in the 
Stellar expression
+* `stellar_expression` is an arbitrary stellar expression
+
+
+In the core language functions, we support basic functional programming 
primitives such as
+* `MAP` - Applies a lambda expression over a list of input.  For instance 
`MAP([ 'foo', 'bar'], (x) -> TO_UPPER(x) )` returns `[ 'FOO', 'BAR' ]`
+* `FILTER` - Filters a list by a predicate in the form of a lambda expression. 
 For instance `FILTER([ 'foo', 'bar'], (x ) -> x == 'foo' )` returns `[ 'foo' ]`
+* `REDUCE` - Applies a function over a list of input.  For instance `REDUCE([ 
1, 2, 3], (sum, x) -> sum + x, 0 )` returns `6`
+
 ## Stellar Core Functions
 
 |                                                                              
                      |
@@ -94,6 +115,7 @@ The `!=` operator is the negation of the above.
 | [ `ENRICHMENT_GET`](#enrichment_get)                                         
                      |
 | [ `FILL_LEFT`](#fill_left)                                                   
                      |
 | [ `FILL_RIGHT`](#fill_right)                                                 
                      |
+| [ `FILTER`](#filter)                                                         
                |
 | [ `FORMAT`](#format)                                                         
                      |
 | [ 
`HLLP_CARDINALITY`](../../metron-analytics/metron-statistics#hllp_cardinality)  
                 |
 | [ `HLLP_INIT`](../../metron-analytics/metron-statistics#hllp_init)           
                      |
@@ -117,14 +139,17 @@ The `!=` operator is the negation of the above.
 | [ `KAFKA_PUT`](#kafka_put)                                                   
                      |
 | [ `KAFKA_TAIL`](#kafka_tail)                                                 
                      |
 | [ `LENGTH`](#length)                                                         
                      |
+| [ `LIST_ADD`](#list_add)                                                     
                          |
 | [ `MAAS_GET_ENDPOINT`](#maas_get_endpoint)                                   
                      |
 | [ `MAAS_MODEL_APPLY`](#maas_model_apply)                                     
                      |
+| [ `MAP`](#map)                                                               
        |
 | [ `MAP_EXISTS`](#map_exists)                                                 
                      |
 | [ `MONTH`](#month)                                                           
                      |
 | [ `PROFILE_GET`](#profile_get)                                               
                      |
 | [ `PROFILE_FIXED`](#profile_fixed)                                           
                          |
 | [ `PROFILE_WINDOW`](#profile_window)                                         
                            |
 | [ `PROTOCOL_TO_NAME`](#protocol_to_name)                                     
                      |
+| [ `REDUCE`](#reduce)                                                         
          |
 | [ `REGEXP_MATCH`](#regexp_match)                                             
                      |
 | [ `SPLIT`](#split)                                                           
                      |
 | [ `STARTS_WITH`](#starts_with)                                               
                      |
@@ -271,6 +296,13 @@ The `!=` operator is the negation of the above.
     * len - the required length
   * Returns: Last element of the list
 
+### `FILTER`
+  * Description: Applies a filter in the form of a lambda expression to a 
list. e.g. `FILTER( [ 'foo', 'bar' ] , (x) -> x == 'foo')` would yield `[ 
'foo']`
+  * Input:
+    * list - List of arguments.
+    * predicate - The lambda expression to apply.  This expression is assumed 
to take one argument and return a boolean.
+  * Returns: The input list filtered by the predicate.
+
 ### `FORMAT`
   * Description: Returns a formatted string using the specified format string 
and arguments. Uses Java's string formatting conventions.
   * Input:
@@ -398,6 +430,13 @@ The `!=` operator is the negation of the above.
     * input - Object of string or collection type (e.g. list)
   * Returns: Integer
 
+### `LIST_ADD`
+  * Description: Adds an element to a list.
+  * Input:
+    * list - List to add element to.
+    * element - Element to add to list
+  * Returns: Resulting list with the item added at the end.
+  
 ### `MAAS_GET_ENDPOINT`
   * Description: Inspects ZooKeeper and returns a map containing the name, 
version and url for the model referred to by the input parameters.
   * Input:
@@ -413,6 +452,13 @@ The `!=` operator is the negation of the above.
     * model_args - A Dictionary of arguments for the model (these become 
request params)
   * Returns: The output of the model deployed as a REST endpoint in Map form.  
Assumes REST endpoint returns a JSON Map.
 
+### `MAP`
+  * Description: Applies lambda expression to a list of arguments. e.g. `MAP( 
[ 'foo', 'bar' ] , (x) -> TO_UPPER(x) )` would yield `[ 'FOO', 'BAR' ]`
+  * Input:
+    * list - List of arguments.
+    * transform_expression - The lambda expression to apply. This expression 
is assumed to take one argument.
+  * Returns: The input list transformed item-wise by the lambda expression.
+  
 ### `MAP_EXISTS`
   * Description: Checks for existence of a key in a map.
   * Input:
@@ -466,6 +512,14 @@ The `!=` operator is the negation of the above.
     * IANA Number
   * Returns: The protocol name associated with the IANA number.
 
+### `REDUCE`
+  * Description: Reduces a list by a binary lambda expression. That is, the 
expression takes two arguments.  Usage example: `REDUCE( [ 1, 2, 3 ] , (x, y) 
-> x + y, 0)` would sum the input list, yielding `6`.
+  * Input:                      
+    * list - List of arguments.
+    * binary_operation - The lambda expression function to apply to reduce the 
list. It is assumed that this takes two arguments, the first being the running 
total and the second being an item from the list.
+    * initial_value - The initial value to use.
+  * Returns: The reduction of the list.
+  
 ### `REGEXP_MATCH`
   * Description: Determines whether a regex matches a string
   * Input:

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4
 
b/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4
index 3005323..75f5761 100644
--- 
a/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4
+++ 
b/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4
@@ -40,7 +40,8 @@ grammar Stellar;
 }
 
 /* Lexical rules */
-
+IN : 'in' | 'IN';
+LAMBDA_OP : '->';
 DOUBLE_QUOTE : '"';
 SINGLE_QUOTE : '\'';
 COMMA : ',';
@@ -75,7 +76,6 @@ LBRACKET : '[';
 RBRACKET : ']';
 LPAREN : '(' ;
 RPAREN : ')' ;
-IN : 'in' | 'IN';
 NIN : 'not in' | 'NOT IN';
 EXISTS : 'exists' | 'EXISTS';
 EXPONENT : E ( PLUS|MINUS )? DIGIT+;
@@ -95,7 +95,9 @@ FLOAT_LITERAL :
   | INT_LITERAL EXPONENT? F
   ;
 LONG_LITERAL : INT_LITERAL L;
-IDENTIFIER : [a-zA-Z_][a-zA-Z_\.:0-9]*;
+IDENTIFIER : IDENTIFIER_START
+           | IDENTIFIER_START IDENTIFIER_MIDDLE* IDENTIFIER_END
+           ;
 
 STRING_LITERAL :
   DOUBLE_QUOTE SCHAR* DOUBLE_QUOTE
@@ -118,6 +120,11 @@ fragment E: ('e'|'E');
 fragment F: ('f'|'F');
 fragment L: ('l'|'L');
 fragment EOL : '\n';
+fragment IDENTIFIER_START : [a-zA-Z_$];
+fragment IDENTIFIER_MIDDLE: [a-zA-Z_\.:0-9];
+//identifiers can't end with a colon, it screws up maps and lambda variables.
+//the following (x,y:x == 'foo') doesn't parse because y:x is considered a 
variable
+fragment IDENTIFIER_END: [a-zA-Z_\.0-9];
 
 /* Parser rules */
 
@@ -178,8 +185,8 @@ op_list :
   ;
 
 list_entity :
-  LBRACKET op_list RBRACKET
-  | LBRACKET RBRACKET
+  LBRACKET RBRACKET
+  | LBRACKET op_list RBRACKET
   ;
 
 kv_list :
@@ -217,8 +224,11 @@ arithmetic_operands :
   | LPAREN conditional_expr RPAREN #condExpr
   ;
 
+
 identifier_operand :
   (TRUE | FALSE) #LogicalConst
+  | lambda_with_args  #LambdaWithArgsExpr
+  | lambda_without_args  #LambdaWithoutArgsExpr
   | arithmetic_expr #ArithmeticOperands
   | STRING_LITERAL # StringLiteral
   | list_entity #List
@@ -226,4 +236,27 @@ identifier_operand :
   | NULL #NullConst
   | EXISTS LPAREN IDENTIFIER RPAREN #ExistsFunc
   | LPAREN conditional_expr RPAREN #condExpr_paren
-  ;
\ No newline at end of file
+  ;
+
+
+lambda_without_args:
+  LPAREN RPAREN LAMBDA_OP transformation_expr
+  ;
+
+lambda_with_args :
+  LPAREN lambda_variables RPAREN LAMBDA_OP transformation_expr
+  | single_lambda_variable LAMBDA_OP transformation_expr
+  ;
+
+lambda_variables :
+  lambda_variable (COMMA lambda_variable)*
+  ;
+
+single_lambda_variable :
+  lambda_variable;
+
+lambda_variable:
+  IDENTIFIER
+  ;
+
+

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/java/Stellar.tokens
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/src/main/java/Stellar.tokens 
b/metron-platform/metron-common/src/main/java/Stellar.tokens
index 06884b8..6ba2cda 100644
--- a/metron-platform/metron-common/src/main/java/Stellar.tokens
+++ b/metron-platform/metron-common/src/main/java/Stellar.tokens
@@ -1,65 +1,67 @@
-DOUBLE_QUOTE=1
-SINGLE_QUOTE=2
-COMMA=3
-PERIOD=4
-AND=5
-OR=6
-NOT=7
-TRUE=8
-FALSE=9
-EQ=10
-NEQ=11
-LT=12
-LTE=13
-GT=14
-GTE=15
-QUESTION=16
-COLON=17
-IF=18
-THEN=19
-ELSE=20
-NULL=21
-MINUS=22
-PLUS=23
-DIV=24
-MUL=25
-LBRACE=26
-RBRACE=27
-LBRACKET=28
-RBRACKET=29
-LPAREN=30
-RPAREN=31
-IN=32
-NIN=33
-EXISTS=34
-EXPONENT=35
-INT_LITERAL=36
-DOUBLE_LITERAL=37
-FLOAT_LITERAL=38
-LONG_LITERAL=39
-IDENTIFIER=40
-STRING_LITERAL=41
-COMMENT=42
-WS=43
-'"'=1
-'\''=2
-','=3
-'.'=4
-'=='=10
-'!='=11
-'<'=12
-'<='=13
-'>'=14
-'>='=15
-'?'=16
-':'=17
-'-'=22
-'+'=23
-'/'=24
-'*'=25
-'{'=26
-'}'=27
-'['=28
-']'=29
-'('=30
-')'=31
+IN=1
+LAMBDA_OP=2
+DOUBLE_QUOTE=3
+SINGLE_QUOTE=4
+COMMA=5
+PERIOD=6
+AND=7
+OR=8
+NOT=9
+TRUE=10
+FALSE=11
+EQ=12
+NEQ=13
+LT=14
+LTE=15
+GT=16
+GTE=17
+QUESTION=18
+COLON=19
+IF=20
+THEN=21
+ELSE=22
+NULL=23
+MINUS=24
+PLUS=25
+DIV=26
+MUL=27
+LBRACE=28
+RBRACE=29
+LBRACKET=30
+RBRACKET=31
+LPAREN=32
+RPAREN=33
+NIN=34
+EXISTS=35
+EXPONENT=36
+INT_LITERAL=37
+DOUBLE_LITERAL=38
+FLOAT_LITERAL=39
+LONG_LITERAL=40
+IDENTIFIER=41
+STRING_LITERAL=42
+COMMENT=43
+WS=44
+'->'=2
+'"'=3
+'\''=4
+','=5
+'.'=6
+'=='=12
+'!='=13
+'<'=14
+'<='=15
+'>'=16
+'>='=17
+'?'=18
+':'=19
+'-'=24
+'+'=25
+'/'=26
+'*'=27
+'{'=28
+'}'=29
+'['=30
+']'=31
+'('=32
+')'=33

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/java/StellarLexer.tokens
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/src/main/java/StellarLexer.tokens 
b/metron-platform/metron-common/src/main/java/StellarLexer.tokens
index 06884b8..6ba2cda 100644
--- a/metron-platform/metron-common/src/main/java/StellarLexer.tokens
+++ b/metron-platform/metron-common/src/main/java/StellarLexer.tokens
@@ -1,65 +1,67 @@
-DOUBLE_QUOTE=1
-SINGLE_QUOTE=2
-COMMA=3
-PERIOD=4
-AND=5
-OR=6
-NOT=7
-TRUE=8
-FALSE=9
-EQ=10
-NEQ=11
-LT=12
-LTE=13
-GT=14
-GTE=15
-QUESTION=16
-COLON=17
-IF=18
-THEN=19
-ELSE=20
-NULL=21
-MINUS=22
-PLUS=23
-DIV=24
-MUL=25
-LBRACE=26
-RBRACE=27
-LBRACKET=28
-RBRACKET=29
-LPAREN=30
-RPAREN=31
-IN=32
-NIN=33
-EXISTS=34
-EXPONENT=35
-INT_LITERAL=36
-DOUBLE_LITERAL=37
-FLOAT_LITERAL=38
-LONG_LITERAL=39
-IDENTIFIER=40
-STRING_LITERAL=41
-COMMENT=42
-WS=43
-'"'=1
-'\''=2
-','=3
-'.'=4
-'=='=10
-'!='=11
-'<'=12
-'<='=13
-'>'=14
-'>='=15
-'?'=16
-':'=17
-'-'=22
-'+'=23
-'/'=24
-'*'=25
-'{'=26
-'}'=27
-'['=28
-']'=29
-'('=30
-')'=31
+IN=1
+LAMBDA_OP=2
+DOUBLE_QUOTE=3
+SINGLE_QUOTE=4
+COMMA=5
+PERIOD=6
+AND=7
+OR=8
+NOT=9
+TRUE=10
+FALSE=11
+EQ=12
+NEQ=13
+LT=14
+LTE=15
+GT=16
+GTE=17
+QUESTION=18
+COLON=19
+IF=20
+THEN=21
+ELSE=22
+NULL=23
+MINUS=24
+PLUS=25
+DIV=26
+MUL=27
+LBRACE=28
+RBRACE=29
+LBRACKET=30
+RBRACKET=31
+LPAREN=32
+RPAREN=33
+NIN=34
+EXISTS=35
+EXPONENT=36
+INT_LITERAL=37
+DOUBLE_LITERAL=38
+FLOAT_LITERAL=39
+LONG_LITERAL=40
+IDENTIFIER=41
+STRING_LITERAL=42
+COMMENT=43
+WS=44
+'->'=2
+'"'=3
+'\''=4
+','=5
+'.'=6
+'=='=12
+'!='=13
+'<'=14
+'<='=15
+'>'=16
+'>='=17
+'?'=18
+':'=19
+'-'=24
+'+'=25
+'/'=26
+'*'=27
+'{'=28
+'}'=29
+'['=30
+']'=31
+'('=32
+')'=33

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/java/org/apache/metron/common/dsl/functions/DataStructureFunctions.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/dsl/functions/DataStructureFunctions.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/dsl/functions/DataStructureFunctions.java
index 25976a4..c0f2e8c 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/dsl/functions/DataStructureFunctions.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/dsl/functions/DataStructureFunctions.java
@@ -162,6 +162,36 @@ public class DataStructureFunctions {
       }
     }
   }
+  @Stellar(name="ADD"
+          ,namespace="LIST"
+          , description="Adds an element to a list."
+          , params = { "list - List to add element to."
+                     , "element - Element to add to list"
+                     }
+          , returns = "Resulting list with the item added at the end."
+  )
+
+  public static class ListAdd extends BaseStellarFunction {
+    @Override
+    public Object apply(List<Object> list) {
+      if (list.size() == 0) {
+        return null;
+      }
+      Object o = list.get(0);
+      if(list.size() == 1) {
+        return o;
+      }
+      if(o instanceof List) {
+        List l = (List)o;
+        Object arg = list.get(1);
+        l.add(arg);
+        return l;
+      }
+      else {
+        return o;
+      }
+    }
+  }
 
   @Stellar(name="LENGTH"
           , description="Returns the length of a string or size of a 
collection. Returns 0 for empty or null Strings"

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/java/org/apache/metron/common/dsl/functions/FunctionalFunctions.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/dsl/functions/FunctionalFunctions.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/dsl/functions/FunctionalFunctions.java
new file mode 100644
index 0000000..0f39d1d
--- /dev/null
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/dsl/functions/FunctionalFunctions.java
@@ -0,0 +1,121 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.metron.common.dsl.functions;
+
+import org.apache.metron.common.dsl.BaseStellarFunction;
+import org.apache.metron.common.dsl.Stellar;
+import org.apache.metron.common.stellar.LambdaExpression;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class FunctionalFunctions {
+
+  @Stellar(name="MAP"
+          , description="Applies lambda expression to a list of arguments. 
e.g. MAP( [ 'foo', 'bar' ] , ( x ) -> TO_UPPER(x) ) would yield [ 'FOO', 'BAR' 
]"
+          , params = {
+                      "list - List of arguments."
+                     ,"transform_expression - The lambda expression to apply. 
This expression is assumed to take one argument."
+                     }
+          , returns = "The input list transformed item-wise by the lambda 
expression."
+          )
+  public static class Map extends BaseStellarFunction {
+
+    @Override
+    public Object apply(List<Object> args) {
+      List<Object> input = (List<Object>) args.get(0);
+      LambdaExpression expression = (LambdaExpression)args.get(1);
+      if(input == null || expression == null) {
+        return input;
+      }
+      List<Object> ret = new ArrayList<>();
+      for(Object o : input) {
+        ret.add(expression.apply(listOf(o)));
+      }
+      return ret;
+    }
+  }
+
+  @Stellar(name="FILTER"
+          , description="Applies a filter in the form of a lambda expression 
to a list. e.g. FILTER( [ 'foo', 'bar' ] , (x) -> x == 'foo') would yield [ 
'foo']"
+          , params = {
+                      "list - List of arguments."
+                     ,"predicate - The lambda expression to apply.  This 
expression is assumed to take one argument and return a boolean."
+                     }
+          , returns = "The input list filtered by the predicate."
+          )
+  public static class Filter extends BaseStellarFunction {
+
+    @Override
+    public Object apply(List<Object> args) {
+      List<Object> input = (List<Object>) args.get(0);
+      LambdaExpression expression = (LambdaExpression) args.get(1);
+      if(input == null || expression == null) {
+        return input;
+      }
+      List<Object> ret = new ArrayList<>();
+      for(Object o : input) {
+        Object result = expression.apply(listOf(o));
+        if(result != null && result instanceof Boolean && (Boolean)result) {
+          ret.add(o);
+        }
+      }
+      return ret;
+    }
+  }
+
+  @Stellar(name="REDUCE"
+          , description="Reduces a list by a binary lambda expression. That 
is, the expression takes two arguments.  Usage example: REDUCE( [ 1, 2, 3 ] , 
(x, y) -> x + y) would sum the input list, yielding 6."
+          , params = {
+                      "list - List of arguments."
+                     ,"binary_operation - The lambda expression function to 
apply to reduce the list. It is assumed that this takes two arguments, the 
first being the running total and the second being an item from the list."
+                     ,"initial_value - The initial value to use."
+                     }
+          , returns = "The reduction of the list."
+          )
+  public static class Reduce extends BaseStellarFunction {
+
+    @Override
+    public Object apply(List<Object> args) {
+      List<Object> input = (List<Object>) args.get(0);
+      if(input == null || input.size() < 3) {
+        return null;
+      }
+      LambdaExpression expression = (LambdaExpression) args.get(1);
+
+      Object runningResult = args.get(2);
+      if(expression == null || runningResult == null) {
+        return null;
+      }
+      for(int i = 0;i < input.size();++i) {
+        Object rhs = input.get(i);
+        runningResult = expression.apply(listOf(runningResult, rhs));
+      }
+      return runningResult;
+    }
+  }
+
+  private static List<Object> listOf(Object... vals) {
+    List<Object> ret = new ArrayList<>(vals.length);
+    for(int i = 0;i < vals.length;++i) {
+      ret.add(vals[i]);
+    }
+    return ret;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/LambdaExpression.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/LambdaExpression.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/LambdaExpression.java
new file mode 100644
index 0000000..f5b0f07
--- /dev/null
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/LambdaExpression.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.metron.common.stellar;
+
+import org.apache.metron.common.dsl.Token;
+import org.apache.metron.common.dsl.VariableResolver;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+
+
+public class LambdaExpression extends StellarCompiler.Expression {
+  StellarCompiler.ExpressionState state;
+  List<String> variables;
+  public LambdaExpression(List<String> variables, Deque<Token<?>> tokenDeque, 
StellarCompiler.ExpressionState state) {
+    super(tokenDeque);
+    this.state = state;
+    this.variables = variables;
+  }
+
+  @Override
+  public Deque<Token<?>> getTokenDeque() {
+    Deque<Token<?>> ret = new ArrayDeque<>(super.getTokenDeque().size());
+    for(Token<?> token : super.getTokenDeque()) {
+      ret.add(token);
+    }
+    return ret;
+  }
+
+  public Object apply(List<Object> variableArgs) {
+    Map<String, Object> lambdaVariables = new HashMap<>();
+    int i = 0;
+    for(;i < Math.min(variables.size(),variableArgs.size()) ;++i) {
+      lambdaVariables.put(variables.get(i), variableArgs.get(i));
+    }
+    for(;i < variables.size();++i) {
+      lambdaVariables.put(variables.get(i), null);
+    }
+
+    VariableResolver variableResolver = variable -> 
lambdaVariables.getOrDefault(variable
+                                                                               
 , state.variableResolver.resolve(variable)
+                                                                               
 );
+    StellarCompiler.ExpressionState localState = new 
StellarCompiler.ExpressionState(
+            state.context
+          , state.functionResolver
+          , variableResolver);
+    return apply(localState);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarCompiler.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarCompiler.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarCompiler.java
index 1c37009..044b25a 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarCompiler.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarCompiler.java
@@ -33,11 +33,15 @@ import org.apache.metron.common.dsl.ParseException;
 import org.apache.metron.common.dsl.StellarFunction;
 import org.apache.metron.common.utils.ConversionUtils;
 
+import java.io.Serializable;
 import java.util.*;
 
 import static java.lang.String.format;
 
 public class StellarCompiler extends StellarBaseListener {
+  private static Token<?> EXPRESSION_REFERENCE = new Token<>(null, 
Object.class);
+  private static Token<?> LAMBDA_VARIABLES = new Token<>(null, Object.class);
+
   private Expression expression;
   private final ArithmeticEvaluator arithmeticEvaluator;
   private final NumberLiteralEvaluator numberLiteralEvaluator;
@@ -57,17 +61,21 @@ public class StellarCompiler extends StellarBaseListener {
     }
   }
 
-  public static class Expression {
+  public static class Expression implements Serializable {
     final Deque<Token<?>> tokenDeque;
     final Set<String> variablesUsed;
-    Expression(Deque<Token<?>> tokenDeque) {
+    public Expression(Deque<Token<?>> tokenDeque) {
       this.tokenDeque = tokenDeque;
       this.variablesUsed = new HashSet<>();
     }
 
+    public Deque<Token<?>> getTokenDeque() {
+      return tokenDeque;
+    }
+
     public Object apply(ExpressionState state) {
       Deque<Token<?>> instanceDeque = new ArrayDeque<>();
-      for(Iterator<Token<?>> it = 
tokenDeque.descendingIterator();it.hasNext();) {
+      for(Iterator<Token<?>> it = 
getTokenDeque().descendingIterator();it.hasNext();) {
         Token<?> token = it.next();
         if(token.getUnderlyingType() == DeferredFunction.class) {
           DeferredFunction func = (DeferredFunction) token.getValue();
@@ -322,6 +330,82 @@ public class StellarCompiler extends StellarBaseListener {
     return op.op(l, r);
   }
 
+
+  @Override
+  public void 
enterSingle_lambda_variable(StellarParser.Single_lambda_variableContext ctx) {
+    enterLambdaVariables();
+  }
+
+  @Override
+  public void 
exitSingle_lambda_variable(StellarParser.Single_lambda_variableContext ctx) {
+    exitLambdaVariables();
+  }
+
+  @Override
+  public void enterLambda_variables(StellarParser.Lambda_variablesContext ctx) 
{
+    enterLambdaVariables();
+  }
+
+  @Override
+  public void exitLambda_variables(StellarParser.Lambda_variablesContext ctx) {
+    exitLambdaVariables();
+  }
+
+  @Override
+  public void exitLambda_variable(StellarParser.Lambda_variableContext ctx) {
+    expression.tokenDeque.push(new Token<>(ctx.getText(), String.class));
+  }
+
+  private void enterLambdaVariables() {
+    expression.tokenDeque.push(LAMBDA_VARIABLES);
+  }
+
+  private void exitLambdaVariables() {
+    Token<?> t = expression.tokenDeque.pop();
+    LinkedList<String> variables = new LinkedList<>();
+    for(; !expression.tokenDeque.isEmpty() && t != LAMBDA_VARIABLES; t = 
expression.tokenDeque.pop()) {
+      variables.addFirst(t.getValue().toString());
+    }
+    expression.tokenDeque.push(new Token<>(variables, List.class));
+  }
+
+  private void enterLambda() {
+    expression.tokenDeque.push(EXPRESSION_REFERENCE);
+  }
+
+  private void exitLambda(boolean hasArgs) {
+    Token<?> t = expression.tokenDeque.pop();
+    final Deque<Token<?>> instanceDeque = new ArrayDeque<>();
+    for(; !expression.tokenDeque.isEmpty() && t != EXPRESSION_REFERENCE; t = 
expression.tokenDeque.pop()) {
+      instanceDeque.addLast(t);
+    }
+    final List<String> variables = hasArgs? (List<String>) 
instanceDeque.removeLast().getValue() :new ArrayList<>();
+    expression.tokenDeque.push(new Token<>( (tokenDeque, state) -> {
+      LambdaExpression expr = new LambdaExpression(variables, instanceDeque, 
state);
+      tokenDeque.push(new Token<>(expr, Object.class));
+    }, DeferredFunction.class) );
+  }
+
+  @Override
+  public void enterLambda_with_args(StellarParser.Lambda_with_argsContext ctx) 
{
+    enterLambda();
+  }
+
+  @Override
+  public void exitLambda_with_args(StellarParser.Lambda_with_argsContext ctx) {
+    exitLambda(true);
+  }
+
+  @Override
+  public void 
enterLambda_without_args(StellarParser.Lambda_without_argsContext ctx) {
+    enterLambda();
+  }
+
+  @Override
+  public void exitLambda_without_args(StellarParser.Lambda_without_argsContext 
ctx) {
+    exitLambda(false);
+  }
+
   @Override
   public void exitTransformationFunc(StellarParser.TransformationFuncContext 
ctx) {
 

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarBaseListener.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarBaseListener.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarBaseListener.java
index c13930d..2be710b 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarBaseListener.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarBaseListener.java
@@ -553,6 +553,30 @@ public class StellarBaseListener implements 
StellarListener {
         *
         * <p>The default implementation does nothing.</p>
         */
+       @Override public void 
enterLambdaWithArgsExpr(StellarParser.LambdaWithArgsExprContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
exitLambdaWithArgsExpr(StellarParser.LambdaWithArgsExprContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
enterLambdaWithoutArgsExpr(StellarParser.LambdaWithoutArgsExprContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
exitLambdaWithoutArgsExpr(StellarParser.LambdaWithoutArgsExprContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
        @Override public void 
enterArithmeticOperands(StellarParser.ArithmeticOperandsContext ctx) { }
        /**
         * {@inheritDoc}
@@ -632,6 +656,66 @@ public class StellarBaseListener implements 
StellarListener {
         * <p>The default implementation does nothing.</p>
         */
        @Override public void 
exitCondExpr_paren(StellarParser.CondExpr_parenContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
enterLambda_without_args(StellarParser.Lambda_without_argsContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
exitLambda_without_args(StellarParser.Lambda_without_argsContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
enterLambda_with_args(StellarParser.Lambda_with_argsContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
exitLambda_with_args(StellarParser.Lambda_with_argsContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
enterLambda_variables(StellarParser.Lambda_variablesContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
exitLambda_variables(StellarParser.Lambda_variablesContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
enterSingle_lambda_variable(StellarParser.Single_lambda_variableContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
exitSingle_lambda_variable(StellarParser.Single_lambda_variableContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
enterLambda_variable(StellarParser.Lambda_variableContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
exitLambda_variable(StellarParser.Lambda_variableContext ctx) { }
 
        /**
         * {@inheritDoc}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java
index ff2e9cb..9f8e0d1 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java
@@ -37,37 +37,39 @@ public class StellarLexer extends Lexer {
        protected static final PredictionContextCache _sharedContextCache =
                new PredictionContextCache();
        public static final int
-               DOUBLE_QUOTE=1, SINGLE_QUOTE=2, COMMA=3, PERIOD=4, AND=5, OR=6, 
NOT=7, 
-               TRUE=8, FALSE=9, EQ=10, NEQ=11, LT=12, LTE=13, GT=14, GTE=15, 
QUESTION=16, 
-               COLON=17, IF=18, THEN=19, ELSE=20, NULL=21, MINUS=22, PLUS=23, 
DIV=24, 
-               MUL=25, LBRACE=26, RBRACE=27, LBRACKET=28, RBRACKET=29, 
LPAREN=30, RPAREN=31, 
-               IN=32, NIN=33, EXISTS=34, EXPONENT=35, INT_LITERAL=36, 
DOUBLE_LITERAL=37, 
-               FLOAT_LITERAL=38, LONG_LITERAL=39, IDENTIFIER=40, 
STRING_LITERAL=41, COMMENT=42, 
-               WS=43;
+               IN=1, LAMBDA_OP=2, DOUBLE_QUOTE=3, SINGLE_QUOTE=4, COMMA=5, 
PERIOD=6, 
+               AND=7, OR=8, NOT=9, TRUE=10, FALSE=11, EQ=12, NEQ=13, LT=14, 
LTE=15, GT=16, 
+               GTE=17, QUESTION=18, COLON=19, IF=20, THEN=21, ELSE=22, 
NULL=23, MINUS=24, 
+               PLUS=25, DIV=26, MUL=27, LBRACE=28, RBRACE=29, LBRACKET=30, 
RBRACKET=31, 
+               LPAREN=32, RPAREN=33, NIN=34, EXISTS=35, EXPONENT=36, 
INT_LITERAL=37, 
+               DOUBLE_LITERAL=38, FLOAT_LITERAL=39, LONG_LITERAL=40, 
IDENTIFIER=41, STRING_LITERAL=42, 
+               COMMENT=43, WS=44;
        public static String[] modeNames = {
                "DEFAULT_MODE"
        };
 
        public static final String[] ruleNames = {
-               "DOUBLE_QUOTE", "SINGLE_QUOTE", "COMMA", "PERIOD", "AND", "OR", 
"NOT", 
-               "TRUE", "FALSE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", 
"QUESTION", "COLON", 
-               "IF", "THEN", "ELSE", "NULL", "MINUS", "PLUS", "DIV", "MUL", 
"LBRACE", 
-               "RBRACE", "LBRACKET", "RBRACKET", "LPAREN", "RPAREN", "IN", 
"NIN", "EXISTS", 
-               "EXPONENT", "INT_LITERAL", "DOUBLE_LITERAL", "FLOAT_LITERAL", 
"LONG_LITERAL", 
-               "IDENTIFIER", "STRING_LITERAL", "COMMENT", "WS", "ZERO", 
"FIRST_DIGIT", 
-               "DIGIT", "SCHAR", "D", "E", "F", "L", "EOL"
+               "IN", "LAMBDA_OP", "DOUBLE_QUOTE", "SINGLE_QUOTE", "COMMA", 
"PERIOD", 
+               "AND", "OR", "NOT", "TRUE", "FALSE", "EQ", "NEQ", "LT", "LTE", 
"GT", "GTE", 
+               "QUESTION", "COLON", "IF", "THEN", "ELSE", "NULL", "MINUS", 
"PLUS", "DIV", 
+               "MUL", "LBRACE", "RBRACE", "LBRACKET", "RBRACKET", "LPAREN", 
"RPAREN", 
+               "NIN", "EXISTS", "EXPONENT", "INT_LITERAL", "DOUBLE_LITERAL", 
"FLOAT_LITERAL", 
+               "LONG_LITERAL", "IDENTIFIER", "STRING_LITERAL", "COMMENT", 
"WS", "ZERO", 
+               "FIRST_DIGIT", "DIGIT", "SCHAR", "D", "E", "F", "L", "EOL", 
"IDENTIFIER_START", 
+               "IDENTIFIER_MIDDLE", "IDENTIFIER_END"
        };
 
        private static final String[] _LITERAL_NAMES = {
-               null, "'\"'", "'''", "','", "'.'", null, null, null, null, 
null, "'=='", 
-               "'!='", "'<'", "'<='", "'>'", "'>='", "'?'", "':'", null, null, 
null, 
-               null, "'-'", "'+'", "'/'", "'*'", "'{'", "'}'", "'['", "']'", 
"'('", "')'"
+               null, null, "'->'", "'\"'", "'''", "','", "'.'", null, null, 
null, null, 
+               null, "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'?'", 
"':'", null, 
+               null, null, null, "'-'", "'+'", "'/'", "'*'", "'{'", "'}'", 
"'['", "']'", 
+               "'('", "')'"
        };
        private static final String[] _SYMBOLIC_NAMES = {
-               null, "DOUBLE_QUOTE", "SINGLE_QUOTE", "COMMA", "PERIOD", "AND", 
"OR", 
-               "NOT", "TRUE", "FALSE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", 
"QUESTION", 
-               "COLON", "IF", "THEN", "ELSE", "NULL", "MINUS", "PLUS", "DIV", 
"MUL", 
-               "LBRACE", "RBRACE", "LBRACKET", "RBRACKET", "LPAREN", "RPAREN", 
"IN", 
+               null, "IN", "LAMBDA_OP", "DOUBLE_QUOTE", "SINGLE_QUOTE", 
"COMMA", "PERIOD", 
+               "AND", "OR", "NOT", "TRUE", "FALSE", "EQ", "NEQ", "LT", "LTE", 
"GT", "GTE", 
+               "QUESTION", "COLON", "IF", "THEN", "ELSE", "NULL", "MINUS", 
"PLUS", "DIV", 
+               "MUL", "LBRACE", "RBRACE", "LBRACKET", "RBRACKET", "LPAREN", 
"RPAREN", 
                "NIN", "EXISTS", "EXPONENT", "INT_LITERAL", "DOUBLE_LITERAL", 
"FLOAT_LITERAL", 
                "LONG_LITERAL", "IDENTIFIER", "STRING_LITERAL", "COMMENT", "WS"
        };
@@ -126,163 +128,171 @@ public class StellarLexer extends Lexer {
        public ATN getATN() { return _ATN; }
 
        public static final String _serializedATN =
-               
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2-\u01ba\b\1\4\2\t"+
+               
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2.\u01d0\b\1\4\2\t"+
                
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
                
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
                
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
                "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 
\t \4!"+
                
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
                
",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
-               
"\64\4\65\t\65\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6"+
-               
"\3\6\3\6\5\6|\n\6\3\7\3\7\3\7\3\7\3\7\3\7\5\7\u0084\n\7\3\b\3\b\3\b\3"+
-               
"\b\3\b\3\b\5\b\u008c\n\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0096\n\t"+
-               
"\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u00a2\n\n\3\13\3\13\3\13"+
-               
"\3\f\3\f\3\f\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\21\3\21"+
-               
"\3\22\3\22\3\23\3\23\3\23\3\23\5\23\u00bc\n\23\3\24\3\24\3\24\3\24\3\24"+
-               
"\3\24\3\24\3\24\5\24\u00c6\n\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+
-               
"\5\25\u00d0\n\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u00da\n"+
-               
"\26\3\27\3\27\3\30\3\30\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3"+
-               "\35\3\36\3\36\3\37\3\37\3 \3 
\3!\3!\3!\3!\5!\u00f4\n!\3\"\3\"\3\"\3\""+
-               
"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\5\"\u0102\n\"\3#\3#\3#\3#\3#\3#\3#\3"+
-               
"#\3#\3#\3#\3#\5#\u0110\n#\3$\3$\3$\5$\u0115\n$\3$\6$\u0118\n$\r$\16$\u0119"+
-               
"\3%\5%\u011d\n%\3%\3%\5%\u0121\n%\3%\3%\7%\u0125\n%\f%\16%\u0128\13%\5"+
-               
"%\u012a\n%\3&\3&\3&\7&\u012f\n&\f&\16&\u0132\13&\3&\5&\u0135\n&\3&\5&"+
-               
"\u0138\n&\3&\3&\6&\u013c\n&\r&\16&\u013d\3&\5&\u0141\n&\3&\5&\u0144\n"+
-               
"&\3&\3&\3&\5&\u0149\n&\3&\3&\5&\u014d\n&\3&\3&\5&\u0151\n&\3\'\3\'\3\'"+
-               
"\7\'\u0156\n\'\f\'\16\'\u0159\13\'\3\'\5\'\u015c\n\'\3\'\3\'\3\'\5\'\u0161"+
-               
"\n\'\3\'\3\'\6\'\u0165\n\'\r\'\16\'\u0166\3\'\5\'\u016a\n\'\3\'\3\'\3"+
-               
"\'\3\'\5\'\u0170\n\'\3\'\3\'\5\'\u0174\n\'\3(\3(\3(\3)\3)\7)\u017b\n)"+
-               
"\f)\16)\u017e\13)\3*\3*\7*\u0182\n*\f*\16*\u0185\13*\3*\3*\3*\3*\7*\u018b"+
-               
"\n*\f*\16*\u018e\13*\3*\3*\5*\u0192\n*\3+\3+\3+\3+\6+\u0198\n+\r+\16+"+
-               
"\u0199\3+\3+\5+\u019e\n+\3+\3+\3,\6,\u01a3\n,\r,\16,\u01a4\3,\3,\3-\3"+
-               
"-\3.\3.\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63\3\64\3\64\3\65\3"+
-               
"\65\3\u0199\2\66\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31"+
-               
"\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65"+
-               "\34\67\359\36;\37= 
?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y\2[\2]\2_\2a\2c\2e\2g"+
-               
"\2i\2\3\2\n\5\2C\\aac|\b\2\60\60\62<C\\^^aac|\5\2\13\f\16\17\"\"\7\2\f"+
-               
"\f\17\17$$))^^\4\2FFff\4\2GGgg\4\2HHhh\4\2NNnn\u01df\2\3\3\2\2\2\2\5\3"+
-               
"\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2"+
-               
"\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3"+
-               
"\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'"+
-               
"\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63"+
-               
"\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2"+
-               
"?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3"+
-               
"\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2"+
-               
"\2\3k\3\2\2\2\5m\3\2\2\2\7o\3\2\2\2\tq\3\2\2\2\13{\3\2\2\2\r\u0083\3\2"+
-               
"\2\2\17\u008b\3\2\2\2\21\u0095\3\2\2\2\23\u00a1\3\2\2\2\25\u00a3\3\2\2"+
-               
"\2\27\u00a6\3\2\2\2\31\u00a9\3\2\2\2\33\u00ab\3\2\2\2\35\u00ae\3\2\2\2"+
-               
"\37\u00b0\3\2\2\2!\u00b3\3\2\2\2#\u00b5\3\2\2\2%\u00bb\3\2\2\2\'\u00c5"+
-               
"\3\2\2\2)\u00cf\3\2\2\2+\u00d9\3\2\2\2-\u00db\3\2\2\2/\u00dd\3\2\2\2\61"+
-               
"\u00df\3\2\2\2\63\u00e1\3\2\2\2\65\u00e3\3\2\2\2\67\u00e5\3\2\2\29\u00e7"+
-               
"\3\2\2\2;\u00e9\3\2\2\2=\u00eb\3\2\2\2?\u00ed\3\2\2\2A\u00f3\3\2\2\2C"+
-               
"\u0101\3\2\2\2E\u010f\3\2\2\2G\u0111\3\2\2\2I\u0129\3\2\2\2K\u0150\3\2"+
-               
"\2\2M\u0173\3\2\2\2O\u0175\3\2\2\2Q\u0178\3\2\2\2S\u0191\3\2\2\2U\u0193"+
-               
"\3\2\2\2W\u01a2\3\2\2\2Y\u01a8\3\2\2\2[\u01aa\3\2\2\2]\u01ac\3\2\2\2_"+
-               
"\u01ae\3\2\2\2a\u01b0\3\2\2\2c\u01b2\3\2\2\2e\u01b4\3\2\2\2g\u01b6\3\2"+
-               
"\2\2i\u01b8\3\2\2\2kl\7$\2\2l\4\3\2\2\2mn\7)\2\2n\6\3\2\2\2op\7.\2\2p"+
-               
"\b\3\2\2\2qr\7\60\2\2r\n\3\2\2\2st\7c\2\2tu\7p\2\2u|\7f\2\2vw\7(\2\2w"+
-               
"|\7(\2\2xy\7C\2\2yz\7P\2\2z|\7F\2\2{s\3\2\2\2{v\3\2\2\2{x\3\2\2\2|\f\3"+
-               
"\2\2\2}~\7q\2\2~\u0084\7t\2\2\177\u0080\7~\2\2\u0080\u0084\7~\2\2\u0081"+
-               
"\u0082\7Q\2\2\u0082\u0084\7T\2\2\u0083}\3\2\2\2\u0083\177\3\2\2\2\u0083"+
-               
"\u0081\3\2\2\2\u0084\16\3\2\2\2\u0085\u0086\7p\2\2\u0086\u0087\7q\2\2"+
-               
"\u0087\u008c\7v\2\2\u0088\u0089\7P\2\2\u0089\u008a\7Q\2\2\u008a\u008c"+
-               
"\7V\2\2\u008b\u0085\3\2\2\2\u008b\u0088\3\2\2\2\u008c\20\3\2\2\2\u008d"+
-               
"\u008e\7v\2\2\u008e\u008f\7t\2\2\u008f\u0090\7w\2\2\u0090\u0096\7g\2\2"+
-               
"\u0091\u0092\7V\2\2\u0092\u0093\7T\2\2\u0093\u0094\7W\2\2\u0094\u0096"+
-               
"\7G\2\2\u0095\u008d\3\2\2\2\u0095\u0091\3\2\2\2\u0096\22\3\2\2\2\u0097"+
-               
"\u0098\7h\2\2\u0098\u0099\7c\2\2\u0099\u009a\7n\2\2\u009a\u009b\7u\2\2"+
-               
"\u009b\u00a2\7g\2\2\u009c\u009d\7H\2\2\u009d\u009e\7C\2\2\u009e\u009f"+
-               
"\7N\2\2\u009f\u00a0\7U\2\2\u00a0\u00a2\7G\2\2\u00a1\u0097\3\2\2\2\u00a1"+
-               
"\u009c\3\2\2\2\u00a2\24\3\2\2\2\u00a3\u00a4\7?\2\2\u00a4\u00a5\7?\2\2"+
-               
"\u00a5\26\3\2\2\2\u00a6\u00a7\7#\2\2\u00a7\u00a8\7?\2\2\u00a8\30\3\2\2"+
-               
"\2\u00a9\u00aa\7>\2\2\u00aa\32\3\2\2\2\u00ab\u00ac\7>\2\2\u00ac\u00ad"+
-               
"\7?\2\2\u00ad\34\3\2\2\2\u00ae\u00af\7@\2\2\u00af\36\3\2\2\2\u00b0\u00b1"+
-               "\7@\2\2\u00b1\u00b2\7?\2\2\u00b2 
\3\2\2\2\u00b3\u00b4\7A\2\2\u00b4\"\3"+
-               
"\2\2\2\u00b5\u00b6\7<\2\2\u00b6$\3\2\2\2\u00b7\u00b8\7K\2\2\u00b8\u00bc"+
-               
"\7H\2\2\u00b9\u00ba\7k\2\2\u00ba\u00bc\7h\2\2\u00bb\u00b7\3\2\2\2\u00bb"+
-               
"\u00b9\3\2\2\2\u00bc&\3\2\2\2\u00bd\u00be\7V\2\2\u00be\u00bf\7J\2\2\u00bf"+
-               
"\u00c0\7G\2\2\u00c0\u00c6\7P\2\2\u00c1\u00c2\7v\2\2\u00c2\u00c3\7j\2\2"+
-               
"\u00c3\u00c4\7g\2\2\u00c4\u00c6\7p\2\2\u00c5\u00bd\3\2\2\2\u00c5\u00c1"+
-               
"\3\2\2\2\u00c6(\3\2\2\2\u00c7\u00c8\7G\2\2\u00c8\u00c9\7N\2\2\u00c9\u00ca"+
-               
"\7U\2\2\u00ca\u00d0\7G\2\2\u00cb\u00cc\7g\2\2\u00cc\u00cd\7n\2\2\u00cd"+
-               
"\u00ce\7u\2\2\u00ce\u00d0\7g\2\2\u00cf\u00c7\3\2\2\2\u00cf\u00cb\3\2\2"+
-               
"\2\u00d0*\3\2\2\2\u00d1\u00d2\7p\2\2\u00d2\u00d3\7w\2\2\u00d3\u00d4\7"+
-               
"n\2\2\u00d4\u00da\7n\2\2\u00d5\u00d6\7P\2\2\u00d6\u00d7\7W\2\2\u00d7\u00d8"+
-               
"\7N\2\2\u00d8\u00da\7N\2\2\u00d9\u00d1\3\2\2\2\u00d9\u00d5\3\2\2\2\u00da"+
-               
",\3\2\2\2\u00db\u00dc\7/\2\2\u00dc.\3\2\2\2\u00dd\u00de\7-\2\2\u00de\60"+
-               
"\3\2\2\2\u00df\u00e0\7\61\2\2\u00e0\62\3\2\2\2\u00e1\u00e2\7,\2\2\u00e2"+
-               
"\64\3\2\2\2\u00e3\u00e4\7}\2\2\u00e4\66\3\2\2\2\u00e5\u00e6\7\177\2\2"+
-               
"\u00e68\3\2\2\2\u00e7\u00e8\7]\2\2\u00e8:\3\2\2\2\u00e9\u00ea\7_\2\2\u00ea"+
-               
"<\3\2\2\2\u00eb\u00ec\7*\2\2\u00ec>\3\2\2\2\u00ed\u00ee\7+\2\2\u00ee@"+
-               
"\3\2\2\2\u00ef\u00f0\7k\2\2\u00f0\u00f4\7p\2\2\u00f1\u00f2\7K\2\2\u00f2"+
-               
"\u00f4\7P\2\2\u00f3\u00ef\3\2\2\2\u00f3\u00f1\3\2\2\2\u00f4B\3\2\2\2\u00f5"+
-               
"\u00f6\7p\2\2\u00f6\u00f7\7q\2\2\u00f7\u00f8\7v\2\2\u00f8\u00f9\7\"\2"+
-               
"\2\u00f9\u00fa\7k\2\2\u00fa\u0102\7p\2\2\u00fb\u00fc\7P\2\2\u00fc\u00fd"+
-               
"\7Q\2\2\u00fd\u00fe\7V\2\2\u00fe\u00ff\7\"\2\2\u00ff\u0100\7K\2\2\u0100"+
-               
"\u0102\7P\2\2\u0101\u00f5\3\2\2\2\u0101\u00fb\3\2\2\2\u0102D\3\2\2\2\u0103"+
-               
"\u0104\7g\2\2\u0104\u0105\7z\2\2\u0105\u0106\7k\2\2\u0106\u0107\7u\2\2"+
-               
"\u0107\u0108\7v\2\2\u0108\u0110\7u\2\2\u0109\u010a\7G\2\2\u010a\u010b"+
-               
"\7Z\2\2\u010b\u010c\7K\2\2\u010c\u010d\7U\2\2\u010d\u010e\7V\2\2\u010e"+
-               
"\u0110\7U\2\2\u010f\u0103\3\2\2\2\u010f\u0109\3\2\2\2\u0110F\3\2\2\2\u0111"+
-               
"\u0114\5c\62\2\u0112\u0115\5/\30\2\u0113\u0115\5-\27\2\u0114\u0112\3\2"+
-               
"\2\2\u0114\u0113\3\2\2\2\u0114\u0115\3\2\2\2\u0115\u0117\3\2\2\2\u0116"+
-               
"\u0118\5]/\2\u0117\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u0117\3\2\2"+
-               
"\2\u0119\u011a\3\2\2\2\u011aH\3\2\2\2\u011b\u011d\5-\27\2\u011c\u011b"+
-               
"\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u012a\5Y-\2\u011f"+
-               
"\u0121\5-\27\2\u0120\u011f\3\2\2\2\u0120\u0121\3\2\2\2\u0121\u0122\3\2"+
-               
"\2\2\u0122\u0126\5[.\2\u0123\u0125\5]/\2\u0124\u0123\3\2\2\2\u0125\u0128"+
-               
"\3\2\2\2\u0126\u0124\3\2\2\2\u0126\u0127\3\2\2\2\u0127\u012a\3\2\2\2\u0128"+
-               
"\u0126\3\2\2\2\u0129\u011c\3\2\2\2\u0129\u0120\3\2\2\2\u012aJ\3\2\2\2"+
-               
"\u012b\u012c\5I%\2\u012c\u0130\5\t\5\2\u012d\u012f\5]/\2\u012e\u012d\3"+
-               
"\2\2\2\u012f\u0132\3\2\2\2\u0130\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131"+
-               
"\u0134\3\2\2\2\u0132\u0130\3\2\2\2\u0133\u0135\5G$\2\u0134\u0133\3\2\2"+
-               
"\2\u0134\u0135\3\2\2\2\u0135\u0137\3\2\2\2\u0136\u0138\5a\61\2\u0137\u0136"+
-               
"\3\2\2\2\u0137\u0138\3\2\2\2\u0138\u0151\3\2\2\2\u0139\u013b\5\t\5\2\u013a"+
-               
"\u013c\5]/\2\u013b\u013a\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u013b\3\2\2"+
-               
"\2\u013d\u013e\3\2\2\2\u013e\u0140\3\2\2\2\u013f\u0141\5G$\2\u0140\u013f"+
-               
"\3\2\2\2\u0140\u0141\3\2\2\2\u0141\u0143\3\2\2\2\u0142\u0144\5a\61\2\u0143"+
-               
"\u0142\3\2\2\2\u0143\u0144\3\2\2\2\u0144\u0151\3\2\2\2\u0145\u0146\5I"+
-               
"%\2\u0146\u0148\5G$\2\u0147\u0149\5a\61\2\u0148\u0147\3\2\2\2\u0148\u0149"+
-               
"\3\2\2\2\u0149\u0151\3\2\2\2\u014a\u014c\5I%\2\u014b\u014d\5G$\2\u014c"+
-               
"\u014b\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u014f\5a"+
-               
"\61\2\u014f\u0151\3\2\2\2\u0150\u012b\3\2\2\2\u0150\u0139\3\2\2\2\u0150"+
-               
"\u0145\3\2\2\2\u0150\u014a\3\2\2\2\u0151L\3\2\2\2\u0152\u0153\5I%\2\u0153"+
-               
"\u0157\5\t\5\2\u0154\u0156\5]/\2\u0155\u0154\3\2\2\2\u0156\u0159\3\2\2"+
-               
"\2\u0157\u0155\3\2\2\2\u0157\u0158\3\2\2\2\u0158\u015b\3\2\2\2\u0159\u0157"+
-               
"\3\2\2\2\u015a\u015c\5G$\2\u015b\u015a\3\2\2\2\u015b\u015c\3\2\2\2\u015c"+
-               
"\u015d\3\2\2\2\u015d\u015e\5e\63\2\u015e\u0174\3\2\2\2\u015f\u0161\5-"+
-               
"\27\2\u0160\u015f\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0162\3\2\2\2\u0162"+
-               
"\u0164\5\t\5\2\u0163\u0165\5]/\2\u0164\u0163\3\2\2\2\u0165\u0166\3\2\2"+
-               
"\2\u0166\u0164\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0169\3\2\2\2\u0168\u016a"+
-               
"\5G$\2\u0169\u0168\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016b\3\2\2\2\u016b"+
-               
"\u016c\5e\63\2\u016c\u0174\3\2\2\2\u016d\u016f\5I%\2\u016e\u0170\5G$\2"+
-               
"\u016f\u016e\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171\u0172"+
-               
"\5e\63\2\u0172\u0174\3\2\2\2\u0173\u0152\3\2\2\2\u0173\u0160\3\2\2\2\u0173"+
-               
"\u016d\3\2\2\2\u0174N\3\2\2\2\u0175\u0176\5I%\2\u0176\u0177\5g\64\2\u0177"+
-               
"P\3\2\2\2\u0178\u017c\t\2\2\2\u0179\u017b\t\3\2\2\u017a\u0179\3\2\2\2"+
-               
"\u017b\u017e\3\2\2\2\u017c\u017a\3\2\2\2\u017c\u017d\3\2\2\2\u017dR\3"+
-               
"\2\2\2\u017e\u017c\3\2\2\2\u017f\u0183\5\3\2\2\u0180\u0182\5_\60\2\u0181"+
-               
"\u0180\3\2\2\2\u0182\u0185\3\2\2\2\u0183\u0181\3\2\2\2\u0183\u0184\3\2"+
-               
"\2\2\u0184\u0186\3\2\2\2\u0185\u0183\3\2\2\2\u0186\u0187\5\3\2\2\u0187"+
-               
"\u0192\3\2\2\2\u0188\u018c\5\5\3\2\u0189\u018b\5_\60\2\u018a\u0189\3\2"+
-               
"\2\2\u018b\u018e\3\2\2\2\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d"+
-               
"\u018f\3\2\2\2\u018e\u018c\3\2\2\2\u018f\u0190\5\5\3\2\u0190\u0192\3\2"+
-               
"\2\2\u0191\u017f\3\2\2\2\u0191\u0188\3\2\2\2\u0192T\3\2\2\2\u0193\u0194"+
-               
"\7\61\2\2\u0194\u0195\7\61\2\2\u0195\u0197\3\2\2\2\u0196\u0198\13\2\2"+
-               
"\2\u0197\u0196\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019a\3\2\2\2\u0199\u0197"+
-               
"\3\2\2\2\u019a\u019d\3\2\2\2\u019b\u019e\5i\65\2\u019c\u019e\7\2\2\3\u019d"+
-               
"\u019b\3\2\2\2\u019d\u019c\3\2\2\2\u019e\u019f\3\2\2\2\u019f\u01a0\b+"+
-               
"\2\2\u01a0V\3\2\2\2\u01a1\u01a3\t\4\2\2\u01a2\u01a1\3\2\2\2\u01a3\u01a4"+
-               
"\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+
-               
"\u01a7\b,\2\2\u01a7X\3\2\2\2\u01a8\u01a9\7\62\2\2\u01a9Z\3\2\2\2\u01aa"+
-               
"\u01ab\4\63;\2\u01ab\\\3\2\2\2\u01ac\u01ad\4\62;\2\u01ad^\3\2\2\2\u01ae"+
-               
"\u01af\n\5\2\2\u01af`\3\2\2\2\u01b0\u01b1\t\6\2\2\u01b1b\3\2\2\2\u01b2"+
-               
"\u01b3\t\7\2\2\u01b3d\3\2\2\2\u01b4\u01b5\t\b\2\2\u01b5f\3\2\2\2\u01b6"+
-               
"\u01b7\t\t\2\2\u01b7h\3\2\2\2\u01b8\u01b9\7\f\2\2\u01b9j\3\2\2\2,\2{\u0083"+
-               
"\u008b\u0095\u00a1\u00bb\u00c5\u00cf\u00d9\u00f3\u0101\u010f\u0114\u0119"+
-               
"\u011c\u0120\u0126\u0129\u0130\u0134\u0137\u013d\u0140\u0143\u0148\u014c"+
-               
"\u0150\u0157\u015b\u0160\u0166\u0169\u016f\u0173\u017c\u0183\u018c\u0191"+
-               "\u0199\u019d\u01a4\3\b\2\2";
+               
"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\3\2\3\2\3\2\3\2\5\2x\n\2"+
+               
"\3\3\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3"+
+               
"\b\3\b\5\b\u008d\n\b\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0095\n\t\3\n\3\n\3\n"+
+               
"\3\n\3\n\3\n\5\n\u009d\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\5\13"+
+               
"\u00a7\n\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\u00b3\n\f\3\r"+
+               
"\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3\22\3\22\3"+
+               
"\22\3\23\3\23\3\24\3\24\3\25\3\25\3\25\3\25\5\25\u00cd\n\25\3\26\3\26"+
+               
"\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u00d7\n\26\3\27\3\27\3\27\3\27\3\27"+
+               
"\3\27\3\27\3\27\5\27\u00e1\n\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
+               
"\5\30\u00eb\n\30\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3\35\3\36"+
+               "\3\36\3\37\3\37\3 \3 
\3!\3!\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3"+
+               
"#\5#\u010d\n#\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\5$\u011b\n$\3%\3%\3"+
+               
"%\5%\u0120\n%\3%\6%\u0123\n%\r%\16%\u0124\3&\5&\u0128\n&\3&\3&\5&\u012c"+
+               
"\n&\3&\3&\7&\u0130\n&\f&\16&\u0133\13&\5&\u0135\n&\3\'\3\'\3\'\7\'\u013a"+
+               
"\n\'\f\'\16\'\u013d\13\'\3\'\5\'\u0140\n\'\3\'\5\'\u0143\n\'\3\'\3\'\6"+
+               
"\'\u0147\n\'\r\'\16\'\u0148\3\'\5\'\u014c\n\'\3\'\5\'\u014f\n\'\3\'\3"+
+               
"\'\3\'\5\'\u0154\n\'\3\'\3\'\5\'\u0158\n\'\3\'\3\'\5\'\u015c\n\'\3(\3"+
+               
"(\3(\7(\u0161\n(\f(\16(\u0164\13(\3(\5(\u0167\n(\3(\3(\3(\5(\u016c\n("+
+               
"\3(\3(\6(\u0170\n(\r(\16(\u0171\3(\5(\u0175\n(\3(\3(\3(\3(\5(\u017b\n"+
+               
"(\3(\3(\5(\u017f\n(\3)\3)\3)\3*\3*\3*\7*\u0187\n*\f*\16*\u018a\13*\3*"+
+               
"\3*\5*\u018e\n*\3+\3+\7+\u0192\n+\f+\16+\u0195\13+\3+\3+\3+\3+\7+\u019b"+
+               
"\n+\f+\16+\u019e\13+\3+\3+\5+\u01a2\n+\3,\3,\3,\3,\6,\u01a8\n,\r,\16,"+
+               
"\u01a9\3,\3,\5,\u01ae\n,\3,\3,\3-\6-\u01b3\n-\r-\16-\u01b4\3-\3-\3.\3"+
+               
".\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63\3\64\3\64\3\65\3\65\3"+
+               
"\66\3\66\3\67\3\67\38\38\39\39\3\u01a9\2:\3\3\5\4\7\5\t\6\13\7\r\b\17"+
+               
"\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+"+
+               "\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= 
?!A\"C#E$G%I&K\'M(O)Q*S+"+
+               
"U,W-Y.[\2]\2_\2a\2c\2e\2g\2i\2k\2m\2o\2q\2\3\2\13\5\2\13\f\16\17\"\"\7"+
+               
"\2\f\f\17\17$$))^^\4\2FFff\4\2GGgg\4\2HHhh\4\2NNnn\6\2&&C\\aac|\b\2\60"+
+               
"\60\62<C\\^^aac|\b\2\60\60\62;C\\^^aac|\u01f3\2\3\3\2\2\2\2\5\3\2\2\2"+
+               
"\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3"+
+               
"\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2"+
+               
"\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2"+
+               
"\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2"+
+               
"\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2"+
+               
"\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2"+
+               
"\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y"+
+               
"\3\2\2\2\3w\3\2\2\2\5y\3\2\2\2\7|\3\2\2\2\t~\3\2\2\2\13\u0080\3\2\2\2"+
+               
"\r\u0082\3\2\2\2\17\u008c\3\2\2\2\21\u0094\3\2\2\2\23\u009c\3\2\2\2\25"+
+               
"\u00a6\3\2\2\2\27\u00b2\3\2\2\2\31\u00b4\3\2\2\2\33\u00b7\3\2\2\2\35\u00ba"+
+               
"\3\2\2\2\37\u00bc\3\2\2\2!\u00bf\3\2\2\2#\u00c1\3\2\2\2%\u00c4\3\2\2\2"+
+               
"\'\u00c6\3\2\2\2)\u00cc\3\2\2\2+\u00d6\3\2\2\2-\u00e0\3\2\2\2/\u00ea\3"+
+               
"\2\2\2\61\u00ec\3\2\2\2\63\u00ee\3\2\2\2\65\u00f0\3\2\2\2\67\u00f2\3\2"+
+               
"\2\29\u00f4\3\2\2\2;\u00f6\3\2\2\2=\u00f8\3\2\2\2?\u00fa\3\2\2\2A\u00fc"+
+               
"\3\2\2\2C\u00fe\3\2\2\2E\u010c\3\2\2\2G\u011a\3\2\2\2I\u011c\3\2\2\2K"+
+               
"\u0134\3\2\2\2M\u015b\3\2\2\2O\u017e\3\2\2\2Q\u0180\3\2\2\2S\u018d\3\2"+
+               
"\2\2U\u01a1\3\2\2\2W\u01a3\3\2\2\2Y\u01b2\3\2\2\2[\u01b8\3\2\2\2]\u01ba"+
+               
"\3\2\2\2_\u01bc\3\2\2\2a\u01be\3\2\2\2c\u01c0\3\2\2\2e\u01c2\3\2\2\2g"+
+               
"\u01c4\3\2\2\2i\u01c6\3\2\2\2k\u01c8\3\2\2\2m\u01ca\3\2\2\2o\u01cc\3\2"+
+               
"\2\2q\u01ce\3\2\2\2st\7k\2\2tx\7p\2\2uv\7K\2\2vx\7P\2\2ws\3\2\2\2wu\3"+
+               
"\2\2\2x\4\3\2\2\2yz\7/\2\2z{\7@\2\2{\6\3\2\2\2|}\7$\2\2}\b\3\2\2\2~\177"+
+               
"\7)\2\2\177\n\3\2\2\2\u0080\u0081\7.\2\2\u0081\f\3\2\2\2\u0082\u0083\7"+
+               
"\60\2\2\u0083\16\3\2\2\2\u0084\u0085\7c\2\2\u0085\u0086\7p\2\2\u0086\u008d"+
+               
"\7f\2\2\u0087\u0088\7(\2\2\u0088\u008d\7(\2\2\u0089\u008a\7C\2\2\u008a"+
+               
"\u008b\7P\2\2\u008b\u008d\7F\2\2\u008c\u0084\3\2\2\2\u008c\u0087\3\2\2"+
+               
"\2\u008c\u0089\3\2\2\2\u008d\20\3\2\2\2\u008e\u008f\7q\2\2\u008f\u0095"+
+               
"\7t\2\2\u0090\u0091\7~\2\2\u0091\u0095\7~\2\2\u0092\u0093\7Q\2\2\u0093"+
+               
"\u0095\7T\2\2\u0094\u008e\3\2\2\2\u0094\u0090\3\2\2\2\u0094\u0092\3\2"+
+               
"\2\2\u0095\22\3\2\2\2\u0096\u0097\7p\2\2\u0097\u0098\7q\2\2\u0098\u009d"+
+               
"\7v\2\2\u0099\u009a\7P\2\2\u009a\u009b\7Q\2\2\u009b\u009d\7V\2\2\u009c"+
+               
"\u0096\3\2\2\2\u009c\u0099\3\2\2\2\u009d\24\3\2\2\2\u009e\u009f\7v\2\2"+
+               
"\u009f\u00a0\7t\2\2\u00a0\u00a1\7w\2\2\u00a1\u00a7\7g\2\2\u00a2\u00a3"+
+               
"\7V\2\2\u00a3\u00a4\7T\2\2\u00a4\u00a5\7W\2\2\u00a5\u00a7\7G\2\2\u00a6"+
+               
"\u009e\3\2\2\2\u00a6\u00a2\3\2\2\2\u00a7\26\3\2\2\2\u00a8\u00a9\7h\2\2"+
+               
"\u00a9\u00aa\7c\2\2\u00aa\u00ab\7n\2\2\u00ab\u00ac\7u\2\2\u00ac\u00b3"+
+               
"\7g\2\2\u00ad\u00ae\7H\2\2\u00ae\u00af\7C\2\2\u00af\u00b0\7N\2\2\u00b0"+
+               
"\u00b1\7U\2\2\u00b1\u00b3\7G\2\2\u00b2\u00a8\3\2\2\2\u00b2\u00ad\3\2\2"+
+               
"\2\u00b3\30\3\2\2\2\u00b4\u00b5\7?\2\2\u00b5\u00b6\7?\2\2\u00b6\32\3\2"+
+               
"\2\2\u00b7\u00b8\7#\2\2\u00b8\u00b9\7?\2\2\u00b9\34\3\2\2\2\u00ba\u00bb"+
+               
"\7>\2\2\u00bb\36\3\2\2\2\u00bc\u00bd\7>\2\2\u00bd\u00be\7?\2\2\u00be "+
+               
"\3\2\2\2\u00bf\u00c0\7@\2\2\u00c0\"\3\2\2\2\u00c1\u00c2\7@\2\2\u00c2\u00c3"+
+               
"\7?\2\2\u00c3$\3\2\2\2\u00c4\u00c5\7A\2\2\u00c5&\3\2\2\2\u00c6\u00c7\7"+
+               
"<\2\2\u00c7(\3\2\2\2\u00c8\u00c9\7K\2\2\u00c9\u00cd\7H\2\2\u00ca\u00cb"+
+               
"\7k\2\2\u00cb\u00cd\7h\2\2\u00cc\u00c8\3\2\2\2\u00cc\u00ca\3\2\2\2\u00cd"+
+               
"*\3\2\2\2\u00ce\u00cf\7V\2\2\u00cf\u00d0\7J\2\2\u00d0\u00d1\7G\2\2\u00d1"+
+               
"\u00d7\7P\2\2\u00d2\u00d3\7v\2\2\u00d3\u00d4\7j\2\2\u00d4\u00d5\7g\2\2"+
+               
"\u00d5\u00d7\7p\2\2\u00d6\u00ce\3\2\2\2\u00d6\u00d2\3\2\2\2\u00d7,\3\2"+
+               
"\2\2\u00d8\u00d9\7G\2\2\u00d9\u00da\7N\2\2\u00da\u00db\7U\2\2\u00db\u00e1"+
+               
"\7G\2\2\u00dc\u00dd\7g\2\2\u00dd\u00de\7n\2\2\u00de\u00df\7u\2\2\u00df"+
+               
"\u00e1\7g\2\2\u00e0\u00d8\3\2\2\2\u00e0\u00dc\3\2\2\2\u00e1.\3\2\2\2\u00e2"+
+               
"\u00e3\7p\2\2\u00e3\u00e4\7w\2\2\u00e4\u00e5\7n\2\2\u00e5\u00eb\7n\2\2"+
+               
"\u00e6\u00e7\7P\2\2\u00e7\u00e8\7W\2\2\u00e8\u00e9\7N\2\2\u00e9\u00eb"+
+               
"\7N\2\2\u00ea\u00e2\3\2\2\2\u00ea\u00e6\3\2\2\2\u00eb\60\3\2\2\2\u00ec"+
+               
"\u00ed\7/\2\2\u00ed\62\3\2\2\2\u00ee\u00ef\7-\2\2\u00ef\64\3\2\2\2\u00f0"+
+               
"\u00f1\7\61\2\2\u00f1\66\3\2\2\2\u00f2\u00f3\7,\2\2\u00f38\3\2\2\2\u00f4"+
+               
"\u00f5\7}\2\2\u00f5:\3\2\2\2\u00f6\u00f7\7\177\2\2\u00f7<\3\2\2\2\u00f8"+
+               
"\u00f9\7]\2\2\u00f9>\3\2\2\2\u00fa\u00fb\7_\2\2\u00fb@\3\2\2\2\u00fc\u00fd"+
+               
"\7*\2\2\u00fdB\3\2\2\2\u00fe\u00ff\7+\2\2\u00ffD\3\2\2\2\u0100\u0101\7"+
+               
"p\2\2\u0101\u0102\7q\2\2\u0102\u0103\7v\2\2\u0103\u0104\7\"\2\2\u0104"+
+               
"\u0105\7k\2\2\u0105\u010d\7p\2\2\u0106\u0107\7P\2\2\u0107\u0108\7Q\2\2"+
+               
"\u0108\u0109\7V\2\2\u0109\u010a\7\"\2\2\u010a\u010b\7K\2\2\u010b\u010d"+
+               
"\7P\2\2\u010c\u0100\3\2\2\2\u010c\u0106\3\2\2\2\u010dF\3\2\2\2\u010e\u010f"+
+               
"\7g\2\2\u010f\u0110\7z\2\2\u0110\u0111\7k\2\2\u0111\u0112\7u\2\2\u0112"+
+               
"\u0113\7v\2\2\u0113\u011b\7u\2\2\u0114\u0115\7G\2\2\u0115\u0116\7Z\2\2"+
+               
"\u0116\u0117\7K\2\2\u0117\u0118\7U\2\2\u0118\u0119\7V\2\2\u0119\u011b"+
+               
"\7U\2\2\u011a\u010e\3\2\2\2\u011a\u0114\3\2\2\2\u011bH\3\2\2\2\u011c\u011f"+
+               
"\5e\63\2\u011d\u0120\5\63\32\2\u011e\u0120\5\61\31\2\u011f\u011d\3\2\2"+
+               
"\2\u011f\u011e\3\2\2\2\u011f\u0120\3\2\2\2\u0120\u0122\3\2\2\2\u0121\u0123"+
+               
"\5_\60\2\u0122\u0121\3\2\2\2\u0123\u0124\3\2\2\2\u0124\u0122\3\2\2\2\u0124"+
+               
"\u0125\3\2\2\2\u0125J\3\2\2\2\u0126\u0128\5\61\31\2\u0127\u0126\3\2\2"+
+               
"\2\u0127\u0128\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u0135\5[.\2\u012a\u012c"+
+               
"\5\61\31\2\u012b\u012a\3\2\2\2\u012b\u012c\3\2\2\2\u012c\u012d\3\2\2\2"+
+               
"\u012d\u0131\5]/\2\u012e\u0130\5_\60\2\u012f\u012e\3\2\2\2\u0130\u0133"+
+               
"\3\2\2\2\u0131\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132\u0135\3\2\2\2\u0133"+
+               
"\u0131\3\2\2\2\u0134\u0127\3\2\2\2\u0134\u012b\3\2\2\2\u0135L\3\2\2\2"+
+               
"\u0136\u0137\5K&\2\u0137\u013b\5\r\7\2\u0138\u013a\5_\60\2\u0139\u0138"+
+               
"\3\2\2\2\u013a\u013d\3\2\2\2\u013b\u0139\3\2\2\2\u013b\u013c\3\2\2\2\u013c"+
+               
"\u013f\3\2\2\2\u013d\u013b\3\2\2\2\u013e\u0140\5I%\2\u013f\u013e\3\2\2"+
+               
"\2\u013f\u0140\3\2\2\2\u0140\u0142\3\2\2\2\u0141\u0143\5c\62\2\u0142\u0141"+
+               
"\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u015c\3\2\2\2\u0144\u0146\5\r\7\2\u0145"+
+               
"\u0147\5_\60\2\u0146\u0145\3\2\2\2\u0147\u0148\3\2\2\2\u0148\u0146\3\2"+
+               
"\2\2\u0148\u0149\3\2\2\2\u0149\u014b\3\2\2\2\u014a\u014c\5I%\2\u014b\u014a"+
+               
"\3\2\2\2\u014b\u014c\3\2\2\2\u014c\u014e\3\2\2\2\u014d\u014f\5c\62\2\u014e"+
+               
"\u014d\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u015c\3\2\2\2\u0150\u0151\5K"+
+               
"&\2\u0151\u0153\5I%\2\u0152\u0154\5c\62\2\u0153\u0152\3\2\2\2\u0153\u0154"+
+               
"\3\2\2\2\u0154\u015c\3\2\2\2\u0155\u0157\5K&\2\u0156\u0158\5I%\2\u0157"+
+               
"\u0156\3\2\2\2\u0157\u0158\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\5c"+
+               
"\62\2\u015a\u015c\3\2\2\2\u015b\u0136\3\2\2\2\u015b\u0144\3\2\2\2\u015b"+
+               
"\u0150\3\2\2\2\u015b\u0155\3\2\2\2\u015cN\3\2\2\2\u015d\u015e\5K&\2\u015e"+
+               
"\u0162\5\r\7\2\u015f\u0161\5_\60\2\u0160\u015f\3\2\2\2\u0161\u0164\3\2"+
+               
"\2\2\u0162\u0160\3\2\2\2\u0162\u0163\3\2\2\2\u0163\u0166\3\2\2\2\u0164"+
+               
"\u0162\3\2\2\2\u0165\u0167\5I%\2\u0166\u0165\3\2\2\2\u0166\u0167\3\2\2"+
+               
"\2\u0167\u0168\3\2\2\2\u0168\u0169\5g\64\2\u0169\u017f\3\2\2\2\u016a\u016c"+
+               
"\5\61\31\2\u016b\u016a\3\2\2\2\u016b\u016c\3\2\2\2\u016c\u016d\3\2\2\2"+
+               
"\u016d\u016f\5\r\7\2\u016e\u0170\5_\60\2\u016f\u016e\3\2\2\2\u0170\u0171"+
+               
"\3\2\2\2\u0171\u016f\3\2\2\2\u0171\u0172\3\2\2\2\u0172\u0174\3\2\2\2\u0173"+
+               
"\u0175\5I%\2\u0174\u0173\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176\3\2\2"+
+               
"\2\u0176\u0177\5g\64\2\u0177\u017f\3\2\2\2\u0178\u017a\5K&\2\u0179\u017b"+
+               
"\5I%\2\u017a\u0179\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017c\3\2\2\2\u017c"+
+               
"\u017d\5g\64\2\u017d\u017f\3\2\2\2\u017e\u015d\3\2\2\2\u017e\u016b\3\2"+
+               
"\2\2\u017e\u0178\3\2\2\2\u017fP\3\2\2\2\u0180\u0181\5K&\2\u0181\u0182"+
+               
"\5i\65\2\u0182R\3\2\2\2\u0183\u018e\5m\67\2\u0184\u0188\5m\67\2\u0185"+
+               
"\u0187\5o8\2\u0186\u0185\3\2\2\2\u0187\u018a\3\2\2\2\u0188\u0186\3\2\2"+
+               
"\2\u0188\u0189\3\2\2\2\u0189\u018b\3\2\2\2\u018a\u0188\3\2\2\2\u018b\u018c"+
+               
"\5q9\2\u018c\u018e\3\2\2\2\u018d\u0183\3\2\2\2\u018d\u0184\3\2\2\2\u018e"+
+               
"T\3\2\2\2\u018f\u0193\5\7\4\2\u0190\u0192\5a\61\2\u0191\u0190\3\2\2\2"+
+               
"\u0192\u0195\3\2\2\2\u0193\u0191\3\2\2\2\u0193\u0194\3\2\2\2\u0194\u0196"+
+               
"\3\2\2\2\u0195\u0193\3\2\2\2\u0196\u0197\5\7\4\2\u0197\u01a2\3\2\2\2\u0198"+
+               
"\u019c\5\t\5\2\u0199\u019b\5a\61\2\u019a\u0199\3\2\2\2\u019b\u019e\3\2"+
+               
"\2\2\u019c\u019a\3\2\2\2\u019c\u019d\3\2\2\2\u019d\u019f\3\2\2\2\u019e"+
+               
"\u019c\3\2\2\2\u019f\u01a0\5\t\5\2\u01a0\u01a2\3\2\2\2\u01a1\u018f\3\2"+
+               
"\2\2\u01a1\u0198\3\2\2\2\u01a2V\3\2\2\2\u01a3\u01a4\7\61\2\2\u01a4\u01a5"+
+               
"\7\61\2\2\u01a5\u01a7\3\2\2\2\u01a6\u01a8\13\2\2\2\u01a7\u01a6\3\2\2\2"+
+               
"\u01a8\u01a9\3\2\2\2\u01a9\u01aa\3\2\2\2\u01a9\u01a7\3\2\2\2\u01aa\u01ad"+
+               
"\3\2\2\2\u01ab\u01ae\5k\66\2\u01ac\u01ae\7\2\2\3\u01ad\u01ab\3\2\2\2\u01ad"+
+               
"\u01ac\3\2\2\2\u01ae\u01af\3\2\2\2\u01af\u01b0\b,\2\2\u01b0X\3\2\2\2\u01b1"+
+               
"\u01b3\t\2\2\2\u01b2\u01b1\3\2\2\2\u01b3\u01b4\3\2\2\2\u01b4\u01b2\3\2"+
+               
"\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b7\b-\2\2\u01b7"+
+               
"Z\3\2\2\2\u01b8\u01b9\7\62\2\2\u01b9\\\3\2\2\2\u01ba\u01bb\4\63;\2\u01bb"+
+               
"^\3\2\2\2\u01bc\u01bd\4\62;\2\u01bd`\3\2\2\2\u01be\u01bf\n\3\2\2\u01bf"+
+               
"b\3\2\2\2\u01c0\u01c1\t\4\2\2\u01c1d\3\2\2\2\u01c2\u01c3\t\5\2\2\u01c3"+
+               
"f\3\2\2\2\u01c4\u01c5\t\6\2\2\u01c5h\3\2\2\2\u01c6\u01c7\t\7\2\2\u01c7"+
+               
"j\3\2\2\2\u01c8\u01c9\7\f\2\2\u01c9l\3\2\2\2\u01ca\u01cb\t\b\2\2\u01cb"+
+               
"n\3\2\2\2\u01cc\u01cd\t\t\2\2\u01cdp\3\2\2\2\u01ce\u01cf\t\n\2\2\u01cf"+
+               
"r\3\2\2\2-\2w\u008c\u0094\u009c\u00a6\u00b2\u00cc\u00d6\u00e0\u00ea\u010c"+
+               
"\u011a\u011f\u0124\u0127\u012b\u0131\u0134\u013b\u013f\u0142\u0148\u014b"+
+               
"\u014e\u0153\u0157\u015b\u0162\u0166\u016b\u0171\u0174\u017a\u017e\u0188"+
+               "\u018d\u0193\u019c\u01a1\u01a9\u01ad\u01b4\3\b\2\2";
        public static final ATN _ATN =
                new ATNDeserializer().deserialize(_serializedATN.toCharArray());
        static {

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/ab80e7b1/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarListener.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarListener.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarListener.java
index bf3c272..66493f7 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarListener.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarListener.java
@@ -529,6 +529,30 @@ public interface StellarListener extends ParseTreeListener 
{
         */
        void exitLogicalConst(StellarParser.LogicalConstContext ctx);
        /**
+        * Enter a parse tree produced by the {@code LambdaWithArgsExpr}
+        * labeled alternative in {@link StellarParser#identifier_operand}.
+        * @param ctx the parse tree
+        */
+       void enterLambdaWithArgsExpr(StellarParser.LambdaWithArgsExprContext 
ctx);
+       /**
+        * Exit a parse tree produced by the {@code LambdaWithArgsExpr}
+        * labeled alternative in {@link StellarParser#identifier_operand}.
+        * @param ctx the parse tree
+        */
+       void exitLambdaWithArgsExpr(StellarParser.LambdaWithArgsExprContext 
ctx);
+       /**
+        * Enter a parse tree produced by the {@code LambdaWithoutArgsExpr}
+        * labeled alternative in {@link StellarParser#identifier_operand}.
+        * @param ctx the parse tree
+        */
+       void 
enterLambdaWithoutArgsExpr(StellarParser.LambdaWithoutArgsExprContext ctx);
+       /**
+        * Exit a parse tree produced by the {@code LambdaWithoutArgsExpr}
+        * labeled alternative in {@link StellarParser#identifier_operand}.
+        * @param ctx the parse tree
+        */
+       void 
exitLambdaWithoutArgsExpr(StellarParser.LambdaWithoutArgsExprContext ctx);
+       /**
         * Enter a parse tree produced by the {@code ArithmeticOperands}
         * labeled alternative in {@link StellarParser#identifier_operand}.
         * @param ctx the parse tree
@@ -612,4 +636,54 @@ public interface StellarListener extends ParseTreeListener 
{
         * @param ctx the parse tree
         */
        void exitCondExpr_paren(StellarParser.CondExpr_parenContext ctx);
+       /**
+        * Enter a parse tree produced by {@link 
StellarParser#lambda_without_args}.
+        * @param ctx the parse tree
+        */
+       void enterLambda_without_args(StellarParser.Lambda_without_argsContext 
ctx);
+       /**
+        * Exit a parse tree produced by {@link 
StellarParser#lambda_without_args}.
+        * @param ctx the parse tree
+        */
+       void exitLambda_without_args(StellarParser.Lambda_without_argsContext 
ctx);
+       /**
+        * Enter a parse tree produced by {@link 
StellarParser#lambda_with_args}.
+        * @param ctx the parse tree
+        */
+       void enterLambda_with_args(StellarParser.Lambda_with_argsContext ctx);
+       /**
+        * Exit a parse tree produced by {@link StellarParser#lambda_with_args}.
+        * @param ctx the parse tree
+        */
+       void exitLambda_with_args(StellarParser.Lambda_with_argsContext ctx);
+       /**
+        * Enter a parse tree produced by {@link 
StellarParser#lambda_variables}.
+        * @param ctx the parse tree
+        */
+       void enterLambda_variables(StellarParser.Lambda_variablesContext ctx);
+       /**
+        * Exit a parse tree produced by {@link StellarParser#lambda_variables}.
+        * @param ctx the parse tree
+        */
+       void exitLambda_variables(StellarParser.Lambda_variablesContext ctx);
+       /**
+        * Enter a parse tree produced by {@link 
StellarParser#single_lambda_variable}.
+        * @param ctx the parse tree
+        */
+       void 
enterSingle_lambda_variable(StellarParser.Single_lambda_variableContext ctx);
+       /**
+        * Exit a parse tree produced by {@link 
StellarParser#single_lambda_variable}.
+        * @param ctx the parse tree
+        */
+       void 
exitSingle_lambda_variable(StellarParser.Single_lambda_variableContext ctx);
+       /**
+        * Enter a parse tree produced by {@link StellarParser#lambda_variable}.
+        * @param ctx the parse tree
+        */
+       void enterLambda_variable(StellarParser.Lambda_variableContext ctx);
+       /**
+        * Exit a parse tree produced by {@link StellarParser#lambda_variable}.
+        * @param ctx the parse tree
+        */
+       void exitLambda_variable(StellarParser.Lambda_variableContext ctx);
 }
\ No newline at end of file

Reply via email to