Browse Source

Support multivalued constants (ESQL-1094)

This adds support for constants like `[1, 2]` and `["foo", "bar"]`.
Nik Everett 2 years ago
parent
commit
8195b43fc9
17 changed files with 1247 additions and 762 deletions
  1. 13 0
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/math.csv-spec
  2. 13 0
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/string.csv-spec
  3. 16 3
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4
  4. 83 80
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens
  5. 8 0
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4
  6. 83 80
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens
  7. 10 1
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java
  8. 20 6
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp
  9. 454 433
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java
  10. 13 4
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp
  11. 243 153
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java
  12. 48 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java
  13. 28 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java
  14. 46 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java
  15. 27 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java
  16. 34 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java
  17. 108 2
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java

+ 13 - 0
x-pack/plugin/esql/qa/testFixtures/src/main/resources/math.csv-spec

@@ -226,6 +226,19 @@ emp_no:integer | salary_change.int:integer | salary_change:integer
 10015          |[12, 14]                   |12             
 ;
 
+mvMinSimple
+// tag::mv_min[]
+ROW a=[2, 1]
+| EVAL min_a = MV_MIN(a)
+// end::mv_min[]
+;
+
+// tag::mv_min-result[]
+a:integer | min_a:integer
+   [2, 1] | 1
+// end::mv_min-result[]
+;
+
 mvSum
 from employees | where emp_no > 10008 | eval salary_change = mv_sum(salary_change.int) | sort emp_no | project emp_no, salary_change.int, salary_change | limit 7;
 

+ 13 - 0
x-pack/plugin/esql/qa/testFixtures/src/main/resources/string.csv-spec

@@ -209,3 +209,16 @@ words:keyword | word:keyword
 foo;bar;baz;qux;quux;corge | [foo,bar,baz,qux,quux,corge]
 // end::split-result[]
 ;
+
+mvMin
+// tag::mv_min[]
+ROW a=["foo", "bar"]
+| EVAL min_a = MV_MIN(a)
+// end::mv_min[]
+;
+
+// tag::mv_min-result[]
+     a:keyword | min_a:keyword
+["foo", "bar"] | "bar"
+// end::mv_min-result[]
+;

+ 16 - 3
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4

@@ -2,7 +2,7 @@ lexer grammar EsqlBaseLexer;
 
 DISSECT : 'dissect' -> pushMode(EXPRESSION);
 EVAL : 'eval' -> pushMode(EXPRESSION);
-EXPLAIN : 'explain' -> pushMode(EXPRESSION);
+EXPLAIN : 'explain' -> pushMode(EXPLAIN_MODE);
 FROM : 'from' -> pushMode(SOURCE_IDENTIFIERS);
 INLINESTATS : 'inlinestats' -> pushMode(EXPRESSION);
 GROK : 'grok' -> pushMode(EXPRESSION);
@@ -30,6 +30,12 @@ WS
     ;
 
 
+mode EXPLAIN_MODE;
+EXPLAIN_OPENING_BRACKET : '[' -> type(OPENING_BRACKET), pushMode(DEFAULT_MODE);
+EXPLAIN_PIPE : '|' -> type(PIPE), popMode;
+EXPLAIN_WS : WS -> channel(HIDDEN);
+EXPLAIN_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN);
+EXPLAIN_MULTILINE_COMMENT : MULTILINE_COMMENT -> channel(HIDDEN);
 
 mode EXPRESSION;
 
@@ -83,8 +89,6 @@ FALSE : 'false';
 FIRST : 'first';
 LAST : 'last';
 LP : '(';
-OPENING_BRACKET : '[' -> pushMode(DEFAULT_MODE);
-CLOSING_BRACKET : ']' -> popMode, popMode; // pop twice, once to clear mode of current cmd and once to exit DEFAULT_MODE
 LIKE: 'like';
 NOT : 'not';
 NULL : 'null';
@@ -109,6 +113,15 @@ ASTERISK : '*';
 SLASH : '/';
 PERCENT : '%';
 
+// Brackets are funny. We can happen upon a CLOSING_BRACKET in two ways - one
+// way is to start in an explain command which then shifts us to expression
+// mode. Thus, the two popModes on CLOSING_BRACKET. The other way could as
+// the start of a multivalued field constant. To line up with the double pop
+// the explain mode needs, we double push when we see that.
+OPENING_BRACKET : '[' -> pushMode(EXPRESSION), pushMode(EXPRESSION);
+CLOSING_BRACKET : ']' -> popMode, popMode;
+
+
 UNQUOTED_IDENTIFIER
     : LETTER (LETTER | DIGIT | '_')*
     // only allow @ at beginning of identifier to keep the option to allow @ as infix operator in the future

+ 83 - 80
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens

@@ -17,54 +17,58 @@ UNKNOWN_CMD=16
 LINE_COMMENT=17
 MULTILINE_COMMENT=18
 WS=19
-PIPE=20
-STRING=21
-INTEGER_LITERAL=22
-DECIMAL_LITERAL=23
-BY=24
-AND=25
-ASC=26
-ASSIGN=27
-COMMA=28
-DESC=29
-DOT=30
-FALSE=31
-FIRST=32
-LAST=33
-LP=34
-OPENING_BRACKET=35
-CLOSING_BRACKET=36
-LIKE=37
-NOT=38
-NULL=39
-NULLS=40
-OR=41
-RLIKE=42
-RP=43
-TRUE=44
-INFO=45
-FUNCTIONS=46
-EQ=47
-NEQ=48
-LT=49
-LTE=50
-GT=51
-GTE=52
-PLUS=53
-MINUS=54
-ASTERISK=55
-SLASH=56
-PERCENT=57
-UNQUOTED_IDENTIFIER=58
-QUOTED_IDENTIFIER=59
-EXPR_LINE_COMMENT=60
-EXPR_MULTILINE_COMMENT=61
-EXPR_WS=62
-SRC_UNQUOTED_IDENTIFIER=63
-SRC_QUOTED_IDENTIFIER=64
-SRC_LINE_COMMENT=65
-SRC_MULTILINE_COMMENT=66
-SRC_WS=67
+EXPLAIN_WS=20
+EXPLAIN_LINE_COMMENT=21
+EXPLAIN_MULTILINE_COMMENT=22
+PIPE=23
+STRING=24
+INTEGER_LITERAL=25
+DECIMAL_LITERAL=26
+BY=27
+AND=28
+ASC=29
+ASSIGN=30
+COMMA=31
+DESC=32
+DOT=33
+FALSE=34
+FIRST=35
+LAST=36
+LP=37
+LIKE=38
+NOT=39
+NULL=40
+NULLS=41
+OR=42
+RLIKE=43
+RP=44
+TRUE=45
+INFO=46
+FUNCTIONS=47
+EQ=48
+NEQ=49
+LT=50
+LTE=51
+GT=52
+GTE=53
+PLUS=54
+MINUS=55
+ASTERISK=56
+SLASH=57
+PERCENT=58
+OPENING_BRACKET=59
+CLOSING_BRACKET=60
+UNQUOTED_IDENTIFIER=61
+QUOTED_IDENTIFIER=62
+EXPR_LINE_COMMENT=63
+EXPR_MULTILINE_COMMENT=64
+EXPR_WS=65
+SRC_UNQUOTED_IDENTIFIER=66
+SRC_QUOTED_IDENTIFIER=67
+SRC_LINE_COMMENT=68
+SRC_MULTILINE_COMMENT=69
+SRC_WS=70
+EXPLAIN_PIPE=71
 'dissect'=1
 'eval'=2
 'explain'=3
@@ -80,35 +84,34 @@ SRC_WS=67
 'rename'=13
 'project'=14
 'show'=15
-'by'=24
-'and'=25
-'asc'=26
-'desc'=29
-'.'=30
-'false'=31
-'first'=32
-'last'=33
-'('=34
-'['=35
-']'=36
-'like'=37
-'not'=38
-'null'=39
-'nulls'=40
-'or'=41
-'rlike'=42
-')'=43
-'true'=44
-'info'=45
-'functions'=46
-'=='=47
-'!='=48
-'<'=49
-'<='=50
-'>'=51
-'>='=52
-'+'=53
-'-'=54
-'*'=55
-'/'=56
-'%'=57
+'by'=27
+'and'=28
+'asc'=29
+'desc'=32
+'.'=33
+'false'=34
+'first'=35
+'last'=36
+'('=37
+'like'=38
+'not'=39
+'null'=40
+'nulls'=41
+'or'=42
+'rlike'=43
+')'=44
+'true'=45
+'info'=46
+'functions'=47
+'=='=48
+'!='=49
+'<'=50
+'<='=51
+'>'=52
+'>='=53
+'+'=54
+'-'=55
+'*'=56
+'/'=57
+'%'=58
+']'=60

+ 8 - 0
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4

@@ -131,6 +131,9 @@ constant
     | integerValue                                                                      #integerLiteral
     | booleanValue                                                                      #booleanLiteral
     | string                                                                            #stringLiteral
+    | OPENING_BRACKET numericValue (COMMA numericValue)* CLOSING_BRACKET                #numericArrayLiteral
+    | OPENING_BRACKET booleanValue (COMMA booleanValue)* CLOSING_BRACKET                #booleanArrayLiteral
+    | OPENING_BRACKET string (COMMA string)* CLOSING_BRACKET                            #stringArrayLiteral
     ;
 
 limitCommand
@@ -181,6 +184,11 @@ booleanValue
     : TRUE | FALSE
     ;
 
+numericValue
+    : decimalValue
+    | integerValue
+    ;
+
 decimalValue
     : DECIMAL_LITERAL
     ;

+ 83 - 80
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens

@@ -17,54 +17,58 @@ UNKNOWN_CMD=16
 LINE_COMMENT=17
 MULTILINE_COMMENT=18
 WS=19
-PIPE=20
-STRING=21
-INTEGER_LITERAL=22
-DECIMAL_LITERAL=23
-BY=24
-AND=25
-ASC=26
-ASSIGN=27
-COMMA=28
-DESC=29
-DOT=30
-FALSE=31
-FIRST=32
-LAST=33
-LP=34
-OPENING_BRACKET=35
-CLOSING_BRACKET=36
-LIKE=37
-NOT=38
-NULL=39
-NULLS=40
-OR=41
-RLIKE=42
-RP=43
-TRUE=44
-INFO=45
-FUNCTIONS=46
-EQ=47
-NEQ=48
-LT=49
-LTE=50
-GT=51
-GTE=52
-PLUS=53
-MINUS=54
-ASTERISK=55
-SLASH=56
-PERCENT=57
-UNQUOTED_IDENTIFIER=58
-QUOTED_IDENTIFIER=59
-EXPR_LINE_COMMENT=60
-EXPR_MULTILINE_COMMENT=61
-EXPR_WS=62
-SRC_UNQUOTED_IDENTIFIER=63
-SRC_QUOTED_IDENTIFIER=64
-SRC_LINE_COMMENT=65
-SRC_MULTILINE_COMMENT=66
-SRC_WS=67
+EXPLAIN_WS=20
+EXPLAIN_LINE_COMMENT=21
+EXPLAIN_MULTILINE_COMMENT=22
+PIPE=23
+STRING=24
+INTEGER_LITERAL=25
+DECIMAL_LITERAL=26
+BY=27
+AND=28
+ASC=29
+ASSIGN=30
+COMMA=31
+DESC=32
+DOT=33
+FALSE=34
+FIRST=35
+LAST=36
+LP=37
+LIKE=38
+NOT=39
+NULL=40
+NULLS=41
+OR=42
+RLIKE=43
+RP=44
+TRUE=45
+INFO=46
+FUNCTIONS=47
+EQ=48
+NEQ=49
+LT=50
+LTE=51
+GT=52
+GTE=53
+PLUS=54
+MINUS=55
+ASTERISK=56
+SLASH=57
+PERCENT=58
+OPENING_BRACKET=59
+CLOSING_BRACKET=60
+UNQUOTED_IDENTIFIER=61
+QUOTED_IDENTIFIER=62
+EXPR_LINE_COMMENT=63
+EXPR_MULTILINE_COMMENT=64
+EXPR_WS=65
+SRC_UNQUOTED_IDENTIFIER=66
+SRC_QUOTED_IDENTIFIER=67
+SRC_LINE_COMMENT=68
+SRC_MULTILINE_COMMENT=69
+SRC_WS=70
+EXPLAIN_PIPE=71
 'dissect'=1
 'eval'=2
 'explain'=3
@@ -80,35 +84,34 @@ SRC_WS=67
 'rename'=13
 'project'=14
 'show'=15
-'by'=24
-'and'=25
-'asc'=26
-'desc'=29
-'.'=30
-'false'=31
-'first'=32
-'last'=33
-'('=34
-'['=35
-']'=36
-'like'=37
-'not'=38
-'null'=39
-'nulls'=40
-'or'=41
-'rlike'=42
-')'=43
-'true'=44
-'info'=45
-'functions'=46
-'=='=47
-'!='=48
-'<'=49
-'<='=50
-'>'=51
-'>='=52
-'+'=53
-'-'=54
-'*'=55
-'/'=56
-'%'=57
+'by'=27
+'and'=28
+'asc'=29
+'desc'=32
+'.'=33
+'false'=34
+'first'=35
+'last'=36
+'('=37
+'like'=38
+'not'=39
+'null'=40
+'nulls'=41
+'or'=42
+'rlike'=43
+')'=44
+'true'=45
+'info'=46
+'functions'=47
+'=='=48
+'!='=49
+'<'=50
+'<='=51
+'>'=52
+'>='=53
+'+'=54
+'-'=55
+'*'=56
+'/'=57
+'%'=58
+']'=60

+ 10 - 1
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java

@@ -111,9 +111,18 @@ public class LogicalPlanOptimizer extends RuleExecutor<LogicalPlan> {
 
         @Override
         protected Expression rule(Literal lit) {
-            if (lit.value() != null && lit.value() instanceof String s) {
+            if (lit.value() == null) {
+                return lit;
+            }
+            if (lit.value() instanceof String s) {
                 return Literal.of(lit, new BytesRef(s));
             }
+            if (lit.value() instanceof List<?> l) {
+                if (l.isEmpty() || false == l.get(0) instanceof String) {
+                    return lit;
+                }
+                return Literal.of(lit, l.stream().map(v -> new BytesRef((String) v)).toList());
+            }
             return lit;
         }
     }

File diff suppressed because it is too large
+ 20 - 6
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp


+ 454 - 433
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java

@@ -19,38 +19,40 @@ public class EsqlBaseLexer extends Lexer {
   public static final int
     DISSECT=1, EVAL=2, EXPLAIN=3, FROM=4, INLINESTATS=5, GROK=6, ROW=7, STATS=8, 
     WHERE=9, SORT=10, LIMIT=11, DROP=12, RENAME=13, PROJECT=14, SHOW=15, UNKNOWN_CMD=16, 
-    LINE_COMMENT=17, MULTILINE_COMMENT=18, WS=19, PIPE=20, STRING=21, INTEGER_LITERAL=22, 
-    DECIMAL_LITERAL=23, BY=24, AND=25, ASC=26, ASSIGN=27, COMMA=28, DESC=29, 
-    DOT=30, FALSE=31, FIRST=32, LAST=33, LP=34, OPENING_BRACKET=35, CLOSING_BRACKET=36, 
-    LIKE=37, NOT=38, NULL=39, NULLS=40, OR=41, RLIKE=42, RP=43, TRUE=44, INFO=45, 
-    FUNCTIONS=46, EQ=47, NEQ=48, LT=49, LTE=50, GT=51, GTE=52, PLUS=53, MINUS=54, 
-    ASTERISK=55, SLASH=56, PERCENT=57, UNQUOTED_IDENTIFIER=58, QUOTED_IDENTIFIER=59, 
-    EXPR_LINE_COMMENT=60, EXPR_MULTILINE_COMMENT=61, EXPR_WS=62, SRC_UNQUOTED_IDENTIFIER=63, 
-    SRC_QUOTED_IDENTIFIER=64, SRC_LINE_COMMENT=65, SRC_MULTILINE_COMMENT=66, 
-    SRC_WS=67;
+    LINE_COMMENT=17, MULTILINE_COMMENT=18, WS=19, EXPLAIN_WS=20, EXPLAIN_LINE_COMMENT=21, 
+    EXPLAIN_MULTILINE_COMMENT=22, PIPE=23, STRING=24, INTEGER_LITERAL=25, 
+    DECIMAL_LITERAL=26, BY=27, AND=28, ASC=29, ASSIGN=30, COMMA=31, DESC=32, 
+    DOT=33, FALSE=34, FIRST=35, LAST=36, LP=37, LIKE=38, NOT=39, NULL=40, 
+    NULLS=41, OR=42, RLIKE=43, RP=44, TRUE=45, INFO=46, FUNCTIONS=47, EQ=48, 
+    NEQ=49, LT=50, LTE=51, GT=52, GTE=53, PLUS=54, MINUS=55, ASTERISK=56, 
+    SLASH=57, PERCENT=58, OPENING_BRACKET=59, CLOSING_BRACKET=60, UNQUOTED_IDENTIFIER=61, 
+    QUOTED_IDENTIFIER=62, EXPR_LINE_COMMENT=63, EXPR_MULTILINE_COMMENT=64, 
+    EXPR_WS=65, SRC_UNQUOTED_IDENTIFIER=66, SRC_QUOTED_IDENTIFIER=67, SRC_LINE_COMMENT=68, 
+    SRC_MULTILINE_COMMENT=69, SRC_WS=70, EXPLAIN_PIPE=71;
   public static final int
-    EXPRESSION=1, SOURCE_IDENTIFIERS=2;
+    EXPLAIN_MODE=1, EXPRESSION=2, SOURCE_IDENTIFIERS=3;
   public static String[] channelNames = {
     "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
   };
 
   public static String[] modeNames = {
-    "DEFAULT_MODE", "EXPRESSION", "SOURCE_IDENTIFIERS"
+    "DEFAULT_MODE", "EXPLAIN_MODE", "EXPRESSION", "SOURCE_IDENTIFIERS"
   };
 
   private static String[] makeRuleNames() {
     return new String[] {
       "DISSECT", "EVAL", "EXPLAIN", "FROM", "INLINESTATS", "GROK", "ROW", "STATS", 
       "WHERE", "SORT", "LIMIT", "DROP", "RENAME", "PROJECT", "SHOW", "UNKNOWN_CMD", 
-      "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", "LETTER", 
-      "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", "STRING", "INTEGER_LITERAL", 
-      "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "COMMA", "DESC", "DOT", 
-      "FALSE", "FIRST", "LAST", "LP", "OPENING_BRACKET", "CLOSING_BRACKET", 
-      "LIKE", "NOT", "NULL", "NULLS", "OR", "RLIKE", "RP", "TRUE", "INFO", 
-      "FUNCTIONS", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", 
-      "ASTERISK", "SLASH", "PERCENT", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", 
-      "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "SRC_PIPE", 
-      "SRC_CLOSING_BRACKET", "SRC_COMMA", "SRC_ASSIGN", "SRC_UNQUOTED_IDENTIFIER", 
+      "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "EXPLAIN_OPENING_BRACKET", 
+      "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", 
+      "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", 
+      "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", 
+      "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "LIKE", "NOT", 
+      "NULL", "NULLS", "OR", "RLIKE", "RP", "TRUE", "INFO", "FUNCTIONS", "EQ", 
+      "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", 
+      "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", 
+      "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", 
+      "SRC_PIPE", "SRC_CLOSING_BRACKET", "SRC_COMMA", "SRC_ASSIGN", "SRC_UNQUOTED_IDENTIFIER", 
       "SRC_UNQUOTED_IDENTIFIER_PART", "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", 
       "SRC_MULTILINE_COMMENT", "SRC_WS"
     };
@@ -62,11 +64,11 @@ public class EsqlBaseLexer extends Lexer {
       null, "'dissect'", "'eval'", "'explain'", "'from'", "'inlinestats'", 
       "'grok'", "'row'", "'stats'", "'where'", "'sort'", "'limit'", "'drop'", 
       "'rename'", "'project'", "'show'", null, null, null, null, null, null, 
-      null, null, "'by'", "'and'", "'asc'", null, null, "'desc'", "'.'", "'false'", 
-      "'first'", "'last'", "'('", "'['", "']'", "'like'", "'not'", "'null'", 
+      null, null, null, null, null, "'by'", "'and'", "'asc'", null, null, "'desc'", 
+      "'.'", "'false'", "'first'", "'last'", "'('", "'like'", "'not'", "'null'", 
       "'nulls'", "'or'", "'rlike'", "')'", "'true'", "'info'", "'functions'", 
       "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", 
-      "'%'"
+      "'%'", null, "']'"
     };
   }
   private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -74,15 +76,16 @@ public class EsqlBaseLexer extends Lexer {
     return new String[] {
       null, "DISSECT", "EVAL", "EXPLAIN", "FROM", "INLINESTATS", "GROK", "ROW", 
       "STATS", "WHERE", "SORT", "LIMIT", "DROP", "RENAME", "PROJECT", "SHOW", 
-      "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "STRING", 
+      "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "EXPLAIN_WS", 
+      "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", "PIPE", "STRING", 
       "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "COMMA", 
-      "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "OPENING_BRACKET", "CLOSING_BRACKET", 
-      "LIKE", "NOT", "NULL", "NULLS", "OR", "RLIKE", "RP", "TRUE", "INFO", 
-      "FUNCTIONS", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", 
-      "ASTERISK", "SLASH", "PERCENT", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", 
+      "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "LIKE", "NOT", "NULL", 
+      "NULLS", "OR", "RLIKE", "RP", "TRUE", "INFO", "FUNCTIONS", "EQ", "NEQ", 
+      "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", 
+      "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", 
       "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "SRC_UNQUOTED_IDENTIFIER", 
       "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", 
-      "SRC_WS"
+      "SRC_WS", "EXPLAIN_PIPE"
     };
   }
   private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -144,417 +147,435 @@ public class EsqlBaseLexer extends Lexer {
   public ATN getATN() { return _ATN; }
 
   public static final String _serializedATN =
-    "\u0004\u0000C\u0286\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+
-    "\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002"+
-    "\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005"+
-    "\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002"+
-    "\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002"+
-    "\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010"+
-    "\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013"+
-    "\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016"+
-    "\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019"+
-    "\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c"+
-    "\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f"+
-    "\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007"+
-    "#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007"+
-    "(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007"+
-    "-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u00022\u0007"+
-    "2\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u00027\u0007"+
-    "7\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007"+
-    "<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007"+
-    "A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007"+
-    "F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007"+
-    "K\u0002L\u0007L\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+
-    "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+
+    "\u0004\u0000G\u02a8\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+
+    "\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+
+    "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+
+    "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+
+    "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+
+    "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+
+    "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+
+    "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+
+    "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+
+    "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+
+    "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+
+    "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+
+    "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+
+    "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+
+    "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+
+    "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+
+    "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002"+
+    "<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002"+
+    "A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002"+
+    "F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002"+
+    "K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002"+
+    "P\u0007P\u0002Q\u0007Q\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+
+    "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+
     "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
-    "\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+
-    "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001"+
-    "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+
-    "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+
-    "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+
-    "\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+
-    "\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+
-    "\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+
-    "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+
-    "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+
+    "\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+
+    "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003"+
+    "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
+    "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
+    "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
+    "\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
+    "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006"+
+    "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007"+
+    "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+
+    "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+
     "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+
     "\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+
     "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+
     "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+
     "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+
     "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0004"+
-    "\u000f\u011c\b\u000f\u000b\u000f\f\u000f\u011d\u0001\u000f\u0001\u000f"+
-    "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0005\u0010\u0126\b\u0010"+
-    "\n\u0010\f\u0010\u0129\t\u0010\u0001\u0010\u0003\u0010\u012c\b\u0010\u0001"+
-    "\u0010\u0003\u0010\u012f\b\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001"+
-    "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0005\u0011\u0138\b\u0011\n"+
-    "\u0011\f\u0011\u013b\t\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+
-    "\u0011\u0001\u0011\u0001\u0012\u0004\u0012\u0143\b\u0012\u000b\u0012\f"+
-    "\u0012\u0144\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+
-    "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0016"+
-    "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+
-    "\u0003\u0018\u0158\b\u0018\u0001\u0018\u0004\u0018\u015b\b\u0018\u000b"+
-    "\u0018\f\u0018\u015c\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0162"+
-    "\b\u0019\n\u0019\f\u0019\u0165\t\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+
-    "\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u016d\b\u0019\n\u0019"+
-    "\f\u0019\u0170\t\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+
-    "\u0001\u0019\u0003\u0019\u0177\b\u0019\u0001\u0019\u0003\u0019\u017a\b"+
-    "\u0019\u0003\u0019\u017c\b\u0019\u0001\u001a\u0004\u001a\u017f\b\u001a"+
-    "\u000b\u001a\f\u001a\u0180\u0001\u001b\u0004\u001b\u0184\b\u001b\u000b"+
-    "\u001b\f\u001b\u0185\u0001\u001b\u0001\u001b\u0005\u001b\u018a\b\u001b"+
-    "\n\u001b\f\u001b\u018d\t\u001b\u0001\u001b\u0001\u001b\u0004\u001b\u0191"+
-    "\b\u001b\u000b\u001b\f\u001b\u0192\u0001\u001b\u0004\u001b\u0196\b\u001b"+
-    "\u000b\u001b\f\u001b\u0197\u0001\u001b\u0001\u001b\u0005\u001b\u019c\b"+
-    "\u001b\n\u001b\f\u001b\u019f\t\u001b\u0003\u001b\u01a1\b\u001b\u0001\u001b"+
-    "\u0001\u001b\u0001\u001b\u0001\u001b\u0004\u001b\u01a7\b\u001b\u000b\u001b"+
-    "\f\u001b\u01a8\u0001\u001b\u0001\u001b\u0003\u001b\u01ad\b\u001b\u0001"+
-    "\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+
-    "\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+
-    "\u001f\u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001"+
-    "\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001"+
-    "$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+
-    "\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001"+
-    ")\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001"+
-    "+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001"+
-    "-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+
-    "0\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u0001"+
-    "2\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+
-    "3\u00013\u00013\u00014\u00014\u00014\u00015\u00015\u00016\u00016\u0001"+
-    "6\u00017\u00017\u00018\u00018\u00018\u00019\u00019\u0001:\u0001:\u0001"+
-    ";\u0001;\u0001<\u0001<\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0005"+
-    ">\u0232\b>\n>\f>\u0235\t>\u0001>\u0001>\u0001>\u0001>\u0004>\u023b\b>"+
-    "\u000b>\f>\u023c\u0003>\u023f\b>\u0001?\u0001?\u0001?\u0001?\u0005?\u0245"+
-    "\b?\n?\f?\u0248\t?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001A\u0001"+
-    "A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+
-    "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001"+
-    "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001G\u0004G\u026c\bG\u000bG\fG"+
-    "\u026d\u0001H\u0004H\u0271\bH\u000bH\fH\u0272\u0001H\u0001H\u0003H\u0277"+
-    "\bH\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001"+
-    "K\u0001L\u0001L\u0001L\u0001L\u0002\u0139\u016e\u0000M\u0003\u0001\u0005"+
-    "\u0002\u0007\u0003\t\u0004\u000b\u0005\r\u0006\u000f\u0007\u0011\b\u0013"+
-    "\t\u0015\n\u0017\u000b\u0019\f\u001b\r\u001d\u000e\u001f\u000f!\u0010"+
-    "#\u0011%\u0012\'\u0013)\u0014+\u0000-\u0000/\u00001\u00003\u00005\u0015"+
-    "7\u00169\u0017;\u0018=\u0019?\u001aA\u001bC\u001cE\u001dG\u001eI\u001f"+
-    "K M!O\"Q#S$U%W&Y\'[(])_*a+c,e-g.i/k0m1o2q3s4u5w6y7{8}9\u007f:\u0081;\u0083"+
-    "<\u0085=\u0087>\u0089\u0000\u008b\u0000\u008d\u0000\u008f\u0000\u0091"+
-    "?\u0093\u0000\u0095@\u0097A\u0099B\u009bC\u0003\u0000\u0001\u0002\r\u0006"+
-    "\u0000\t\n\r\r  //[[]]\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r  \u0001"+
-    "\u000009\u0002\u0000AZaz\u0005\u0000\"\"\\\\nnrrtt\u0004\u0000\n\n\r\r"+
-    "\"\"\\\\\u0002\u0000EEee\u0002\u0000++--\u0002\u0000@@__\u0001\u0000`"+
-    "`\n\u0000\t\n\r\r  ,,//==[[]]``||\u0002\u0000**//\u02a3\u0000\u0003\u0001"+
-    "\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001"+
-    "\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000"+
-    "\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000"+
-    "\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000"+
-    "\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000"+
-    "\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000"+
-    "\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000"+
-    "\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000"+
-    "%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0001)\u0001"+
-    "\u0000\u0000\u0000\u00015\u0001\u0000\u0000\u0000\u00017\u0001\u0000\u0000"+
-    "\u0000\u00019\u0001\u0000\u0000\u0000\u0001;\u0001\u0000\u0000\u0000\u0001"+
-    "=\u0001\u0000\u0000\u0000\u0001?\u0001\u0000\u0000\u0000\u0001A\u0001"+
-    "\u0000\u0000\u0000\u0001C\u0001\u0000\u0000\u0000\u0001E\u0001\u0000\u0000"+
-    "\u0000\u0001G\u0001\u0000\u0000\u0000\u0001I\u0001\u0000\u0000\u0000\u0001"+
-    "K\u0001\u0000\u0000\u0000\u0001M\u0001\u0000\u0000\u0000\u0001O\u0001"+
-    "\u0000\u0000\u0000\u0001Q\u0001\u0000\u0000\u0000\u0001S\u0001\u0000\u0000"+
-    "\u0000\u0001U\u0001\u0000\u0000\u0000\u0001W\u0001\u0000\u0000\u0000\u0001"+
-    "Y\u0001\u0000\u0000\u0000\u0001[\u0001\u0000\u0000\u0000\u0001]\u0001"+
-    "\u0000\u0000\u0000\u0001_\u0001\u0000\u0000\u0000\u0001a\u0001\u0000\u0000"+
-    "\u0000\u0001c\u0001\u0000\u0000\u0000\u0001e\u0001\u0000\u0000\u0000\u0001"+
-    "g\u0001\u0000\u0000\u0000\u0001i\u0001\u0000\u0000\u0000\u0001k\u0001"+
-    "\u0000\u0000\u0000\u0001m\u0001\u0000\u0000\u0000\u0001o\u0001\u0000\u0000"+
-    "\u0000\u0001q\u0001\u0000\u0000\u0000\u0001s\u0001\u0000\u0000\u0000\u0001"+
-    "u\u0001\u0000\u0000\u0000\u0001w\u0001\u0000\u0000\u0000\u0001y\u0001"+
-    "\u0000\u0000\u0000\u0001{\u0001\u0000\u0000\u0000\u0001}\u0001\u0000\u0000"+
-    "\u0000\u0001\u007f\u0001\u0000\u0000\u0000\u0001\u0081\u0001\u0000\u0000"+
-    "\u0000\u0001\u0083\u0001\u0000\u0000\u0000\u0001\u0085\u0001\u0000\u0000"+
-    "\u0000\u0001\u0087\u0001\u0000\u0000\u0000\u0002\u0089\u0001\u0000\u0000"+
-    "\u0000\u0002\u008b\u0001\u0000\u0000\u0000\u0002\u008d\u0001\u0000\u0000"+
-    "\u0000\u0002\u008f\u0001\u0000\u0000\u0000\u0002\u0091\u0001\u0000\u0000"+
-    "\u0000\u0002\u0095\u0001\u0000\u0000\u0000\u0002\u0097\u0001\u0000\u0000"+
-    "\u0000\u0002\u0099\u0001\u0000\u0000\u0000\u0002\u009b\u0001\u0000\u0000"+
-    "\u0000\u0003\u009d\u0001\u0000\u0000\u0000\u0005\u00a7\u0001\u0000\u0000"+
-    "\u0000\u0007\u00ae\u0001\u0000\u0000\u0000\t\u00b8\u0001\u0000\u0000\u0000"+
-    "\u000b\u00bf\u0001\u0000\u0000\u0000\r\u00cd\u0001\u0000\u0000\u0000\u000f"+
-    "\u00d4\u0001\u0000\u0000\u0000\u0011\u00da\u0001\u0000\u0000\u0000\u0013"+
-    "\u00e2\u0001\u0000\u0000\u0000\u0015\u00ea\u0001\u0000\u0000\u0000\u0017"+
-    "\u00f1\u0001\u0000\u0000\u0000\u0019\u00f9\u0001\u0000\u0000\u0000\u001b"+
-    "\u0100\u0001\u0000\u0000\u0000\u001d\u0109\u0001\u0000\u0000\u0000\u001f"+
-    "\u0113\u0001\u0000\u0000\u0000!\u011b\u0001\u0000\u0000\u0000#\u0121\u0001"+
-    "\u0000\u0000\u0000%\u0132\u0001\u0000\u0000\u0000\'\u0142\u0001\u0000"+
-    "\u0000\u0000)\u0148\u0001\u0000\u0000\u0000+\u014c\u0001\u0000\u0000\u0000"+
-    "-\u014e\u0001\u0000\u0000\u0000/\u0150\u0001\u0000\u0000\u00001\u0153"+
-    "\u0001\u0000\u0000\u00003\u0155\u0001\u0000\u0000\u00005\u017b\u0001\u0000"+
-    "\u0000\u00007\u017e\u0001\u0000\u0000\u00009\u01ac\u0001\u0000\u0000\u0000"+
-    ";\u01ae\u0001\u0000\u0000\u0000=\u01b1\u0001\u0000\u0000\u0000?\u01b5"+
-    "\u0001\u0000\u0000\u0000A\u01b9\u0001\u0000\u0000\u0000C\u01bb\u0001\u0000"+
-    "\u0000\u0000E\u01bd\u0001\u0000\u0000\u0000G\u01c2\u0001\u0000\u0000\u0000"+
-    "I\u01c4\u0001\u0000\u0000\u0000K\u01ca\u0001\u0000\u0000\u0000M\u01d0"+
-    "\u0001\u0000\u0000\u0000O\u01d5\u0001\u0000\u0000\u0000Q\u01d7\u0001\u0000"+
-    "\u0000\u0000S\u01db\u0001\u0000\u0000\u0000U\u01e0\u0001\u0000\u0000\u0000"+
-    "W\u01e5\u0001\u0000\u0000\u0000Y\u01e9\u0001\u0000\u0000\u0000[\u01ee"+
-    "\u0001\u0000\u0000\u0000]\u01f4\u0001\u0000\u0000\u0000_\u01f7\u0001\u0000"+
-    "\u0000\u0000a\u01fd\u0001\u0000\u0000\u0000c\u01ff\u0001\u0000\u0000\u0000"+
-    "e\u0204\u0001\u0000\u0000\u0000g\u0209\u0001\u0000\u0000\u0000i\u0213"+
-    "\u0001\u0000\u0000\u0000k\u0216\u0001\u0000\u0000\u0000m\u0219\u0001\u0000"+
-    "\u0000\u0000o\u021b\u0001\u0000\u0000\u0000q\u021e\u0001\u0000\u0000\u0000"+
-    "s\u0220\u0001\u0000\u0000\u0000u\u0223\u0001\u0000\u0000\u0000w\u0225"+
-    "\u0001\u0000\u0000\u0000y\u0227\u0001\u0000\u0000\u0000{\u0229\u0001\u0000"+
-    "\u0000\u0000}\u022b\u0001\u0000\u0000\u0000\u007f\u023e\u0001\u0000\u0000"+
-    "\u0000\u0081\u0240\u0001\u0000\u0000\u0000\u0083\u024b\u0001\u0000\u0000"+
-    "\u0000\u0085\u024f\u0001\u0000\u0000\u0000\u0087\u0253\u0001\u0000\u0000"+
-    "\u0000\u0089\u0257\u0001\u0000\u0000\u0000\u008b\u025c\u0001\u0000\u0000"+
-    "\u0000\u008d\u0262\u0001\u0000\u0000\u0000\u008f\u0266\u0001\u0000\u0000"+
-    "\u0000\u0091\u026b\u0001\u0000\u0000\u0000\u0093\u0276\u0001\u0000\u0000"+
-    "\u0000\u0095\u0278\u0001\u0000\u0000\u0000\u0097\u027a\u0001\u0000\u0000"+
-    "\u0000\u0099\u027e\u0001\u0000\u0000\u0000\u009b\u0282\u0001\u0000\u0000"+
-    "\u0000\u009d\u009e\u0005d\u0000\u0000\u009e\u009f\u0005i\u0000\u0000\u009f"+
-    "\u00a0\u0005s\u0000\u0000\u00a0\u00a1\u0005s\u0000\u0000\u00a1\u00a2\u0005"+
-    "e\u0000\u0000\u00a2\u00a3\u0005c\u0000\u0000\u00a3\u00a4\u0005t\u0000"+
-    "\u0000\u00a4\u00a5\u0001\u0000\u0000\u0000\u00a5\u00a6\u0006\u0000\u0000"+
-    "\u0000\u00a6\u0004\u0001\u0000\u0000\u0000\u00a7\u00a8\u0005e\u0000\u0000"+
-    "\u00a8\u00a9\u0005v\u0000\u0000\u00a9\u00aa\u0005a\u0000\u0000\u00aa\u00ab"+
-    "\u0005l\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac\u00ad\u0006"+
-    "\u0001\u0000\u0000\u00ad\u0006\u0001\u0000\u0000\u0000\u00ae\u00af\u0005"+
-    "e\u0000\u0000\u00af\u00b0\u0005x\u0000\u0000\u00b0\u00b1\u0005p\u0000"+
-    "\u0000\u00b1\u00b2\u0005l\u0000\u0000\u00b2\u00b3\u0005a\u0000\u0000\u00b3"+
-    "\u00b4\u0005i\u0000\u0000\u00b4\u00b5\u0005n\u0000\u0000\u00b5\u00b6\u0001"+
-    "\u0000\u0000\u0000\u00b6\u00b7\u0006\u0002\u0000\u0000\u00b7\b\u0001\u0000"+
-    "\u0000\u0000\u00b8\u00b9\u0005f\u0000\u0000\u00b9\u00ba\u0005r\u0000\u0000"+
-    "\u00ba\u00bb\u0005o\u0000\u0000\u00bb\u00bc\u0005m\u0000\u0000\u00bc\u00bd"+
-    "\u0001\u0000\u0000\u0000\u00bd\u00be\u0006\u0003\u0001\u0000\u00be\n\u0001"+
-    "\u0000\u0000\u0000\u00bf\u00c0\u0005i\u0000\u0000\u00c0\u00c1\u0005n\u0000"+
-    "\u0000\u00c1\u00c2\u0005l\u0000\u0000\u00c2\u00c3\u0005i\u0000\u0000\u00c3"+
-    "\u00c4\u0005n\u0000\u0000\u00c4\u00c5\u0005e\u0000\u0000\u00c5\u00c6\u0005"+
-    "s\u0000\u0000\u00c6\u00c7\u0005t\u0000\u0000\u00c7\u00c8\u0005a\u0000"+
-    "\u0000\u00c8\u00c9\u0005t\u0000\u0000\u00c9\u00ca\u0005s\u0000\u0000\u00ca"+
-    "\u00cb\u0001\u0000\u0000\u0000\u00cb\u00cc\u0006\u0004\u0000\u0000\u00cc"+
-    "\f\u0001\u0000\u0000\u0000\u00cd\u00ce\u0005g\u0000\u0000\u00ce\u00cf"+
-    "\u0005r\u0000\u0000\u00cf\u00d0\u0005o\u0000\u0000\u00d0\u00d1\u0005k"+
-    "\u0000\u0000\u00d1\u00d2\u0001\u0000\u0000\u0000\u00d2\u00d3\u0006\u0005"+
-    "\u0000\u0000\u00d3\u000e\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005r\u0000"+
-    "\u0000\u00d5\u00d6\u0005o\u0000\u0000\u00d6\u00d7\u0005w\u0000\u0000\u00d7"+
-    "\u00d8\u0001\u0000\u0000\u0000\u00d8\u00d9\u0006\u0006\u0000\u0000\u00d9"+
-    "\u0010\u0001\u0000\u0000\u0000\u00da\u00db\u0005s\u0000\u0000\u00db\u00dc"+
-    "\u0005t\u0000\u0000\u00dc\u00dd\u0005a\u0000\u0000\u00dd\u00de\u0005t"+
-    "\u0000\u0000\u00de\u00df\u0005s\u0000\u0000\u00df\u00e0\u0001\u0000\u0000"+
-    "\u0000\u00e0\u00e1\u0006\u0007\u0000\u0000\u00e1\u0012\u0001\u0000\u0000"+
-    "\u0000\u00e2\u00e3\u0005w\u0000\u0000\u00e3\u00e4\u0005h\u0000\u0000\u00e4"+
-    "\u00e5\u0005e\u0000\u0000\u00e5\u00e6\u0005r\u0000\u0000\u00e6\u00e7\u0005"+
-    "e\u0000\u0000\u00e7\u00e8\u0001\u0000\u0000\u0000\u00e8\u00e9\u0006\b"+
-    "\u0000\u0000\u00e9\u0014\u0001\u0000\u0000\u0000\u00ea\u00eb\u0005s\u0000"+
-    "\u0000\u00eb\u00ec\u0005o\u0000\u0000\u00ec\u00ed\u0005r\u0000\u0000\u00ed"+
-    "\u00ee\u0005t\u0000\u0000\u00ee\u00ef\u0001\u0000\u0000\u0000\u00ef\u00f0"+
-    "\u0006\t\u0000\u0000\u00f0\u0016\u0001\u0000\u0000\u0000\u00f1\u00f2\u0005"+
-    "l\u0000\u0000\u00f2\u00f3\u0005i\u0000\u0000\u00f3\u00f4\u0005m\u0000"+
-    "\u0000\u00f4\u00f5\u0005i\u0000\u0000\u00f5\u00f6\u0005t\u0000\u0000\u00f6"+
-    "\u00f7\u0001\u0000\u0000\u0000\u00f7\u00f8\u0006\n\u0000\u0000\u00f8\u0018"+
-    "\u0001\u0000\u0000\u0000\u00f9\u00fa\u0005d\u0000\u0000\u00fa\u00fb\u0005"+
-    "r\u0000\u0000\u00fb\u00fc\u0005o\u0000\u0000\u00fc\u00fd\u0005p\u0000"+
-    "\u0000\u00fd\u00fe\u0001\u0000\u0000\u0000\u00fe\u00ff\u0006\u000b\u0001"+
-    "\u0000\u00ff\u001a\u0001\u0000\u0000\u0000\u0100\u0101\u0005r\u0000\u0000"+
-    "\u0101\u0102\u0005e\u0000\u0000\u0102\u0103\u0005n\u0000\u0000\u0103\u0104"+
-    "\u0005a\u0000\u0000\u0104\u0105\u0005m\u0000\u0000\u0105\u0106\u0005e"+
-    "\u0000\u0000\u0106\u0107\u0001\u0000\u0000\u0000\u0107\u0108\u0006\f\u0001"+
-    "\u0000\u0108\u001c\u0001\u0000\u0000\u0000\u0109\u010a\u0005p\u0000\u0000"+
-    "\u010a\u010b\u0005r\u0000\u0000\u010b\u010c\u0005o\u0000\u0000\u010c\u010d"+
-    "\u0005j\u0000\u0000\u010d\u010e\u0005e\u0000\u0000\u010e\u010f\u0005c"+
-    "\u0000\u0000\u010f\u0110\u0005t\u0000\u0000\u0110\u0111\u0001\u0000\u0000"+
-    "\u0000\u0111\u0112\u0006\r\u0001\u0000\u0112\u001e\u0001\u0000\u0000\u0000"+
-    "\u0113\u0114\u0005s\u0000\u0000\u0114\u0115\u0005h\u0000\u0000\u0115\u0116"+
-    "\u0005o\u0000\u0000\u0116\u0117\u0005w\u0000\u0000\u0117\u0118\u0001\u0000"+
-    "\u0000\u0000\u0118\u0119\u0006\u000e\u0000\u0000\u0119 \u0001\u0000\u0000"+
-    "\u0000\u011a\u011c\b\u0000\u0000\u0000\u011b\u011a\u0001\u0000\u0000\u0000"+
-    "\u011c\u011d\u0001\u0000\u0000\u0000\u011d\u011b\u0001\u0000\u0000\u0000"+
-    "\u011d\u011e\u0001\u0000\u0000\u0000\u011e\u011f\u0001\u0000\u0000\u0000"+
-    "\u011f\u0120\u0006\u000f\u0000\u0000\u0120\"\u0001\u0000\u0000\u0000\u0121"+
-    "\u0122\u0005/\u0000\u0000\u0122\u0123\u0005/\u0000\u0000\u0123\u0127\u0001"+
-    "\u0000\u0000\u0000\u0124\u0126\b\u0001\u0000\u0000\u0125\u0124\u0001\u0000"+
-    "\u0000\u0000\u0126\u0129\u0001\u0000\u0000\u0000\u0127\u0125\u0001\u0000"+
-    "\u0000\u0000\u0127\u0128\u0001\u0000\u0000\u0000\u0128\u012b\u0001\u0000"+
-    "\u0000\u0000\u0129\u0127\u0001\u0000\u0000\u0000\u012a\u012c\u0005\r\u0000"+
-    "\u0000\u012b\u012a\u0001\u0000\u0000\u0000\u012b\u012c\u0001\u0000\u0000"+
-    "\u0000\u012c\u012e\u0001\u0000\u0000\u0000\u012d\u012f\u0005\n\u0000\u0000"+
-    "\u012e\u012d\u0001\u0000\u0000\u0000\u012e\u012f\u0001\u0000\u0000\u0000"+
-    "\u012f\u0130\u0001\u0000\u0000\u0000\u0130\u0131\u0006\u0010\u0002\u0000"+
-    "\u0131$\u0001\u0000\u0000\u0000\u0132\u0133\u0005/\u0000\u0000\u0133\u0134"+
-    "\u0005*\u0000\u0000\u0134\u0139\u0001\u0000\u0000\u0000\u0135\u0138\u0003"+
-    "%\u0011\u0000\u0136\u0138\t\u0000\u0000\u0000\u0137\u0135\u0001\u0000"+
-    "\u0000\u0000\u0137\u0136\u0001\u0000\u0000\u0000\u0138\u013b\u0001\u0000"+
-    "\u0000\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u0139\u0137\u0001\u0000"+
-    "\u0000\u0000\u013a\u013c\u0001\u0000\u0000\u0000\u013b\u0139\u0001\u0000"+
-    "\u0000\u0000\u013c\u013d\u0005*\u0000\u0000\u013d\u013e\u0005/\u0000\u0000"+
-    "\u013e\u013f\u0001\u0000\u0000\u0000\u013f\u0140\u0006\u0011\u0002\u0000"+
-    "\u0140&\u0001\u0000\u0000\u0000\u0141\u0143\u0007\u0002\u0000\u0000\u0142"+
-    "\u0141\u0001\u0000\u0000\u0000\u0143\u0144\u0001\u0000\u0000\u0000\u0144"+
-    "\u0142\u0001\u0000\u0000\u0000\u0144\u0145\u0001\u0000\u0000\u0000\u0145"+
-    "\u0146\u0001\u0000\u0000\u0000\u0146\u0147\u0006\u0012\u0002\u0000\u0147"+
-    "(\u0001\u0000\u0000\u0000\u0148\u0149\u0005|\u0000\u0000\u0149\u014a\u0001"+
-    "\u0000\u0000\u0000\u014a\u014b\u0006\u0013\u0003\u0000\u014b*\u0001\u0000"+
-    "\u0000\u0000\u014c\u014d\u0007\u0003\u0000\u0000\u014d,\u0001\u0000\u0000"+
-    "\u0000\u014e\u014f\u0007\u0004\u0000\u0000\u014f.\u0001\u0000\u0000\u0000"+
-    "\u0150\u0151\u0005\\\u0000\u0000\u0151\u0152\u0007\u0005\u0000\u0000\u0152"+
-    "0\u0001\u0000\u0000\u0000\u0153\u0154\b\u0006\u0000\u0000\u01542\u0001"+
-    "\u0000\u0000\u0000\u0155\u0157\u0007\u0007\u0000\u0000\u0156\u0158\u0007"+
-    "\b\u0000\u0000\u0157\u0156\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000"+
-    "\u0000\u0000\u0158\u015a\u0001\u0000\u0000\u0000\u0159\u015b\u0003+\u0014"+
-    "\u0000\u015a\u0159\u0001\u0000\u0000\u0000\u015b\u015c\u0001\u0000\u0000"+
-    "\u0000\u015c\u015a\u0001\u0000\u0000\u0000\u015c\u015d\u0001\u0000\u0000"+
-    "\u0000\u015d4\u0001\u0000\u0000\u0000\u015e\u0163\u0005\"\u0000\u0000"+
-    "\u015f\u0162\u0003/\u0016\u0000\u0160\u0162\u00031\u0017\u0000\u0161\u015f"+
-    "\u0001\u0000\u0000\u0000\u0161\u0160\u0001\u0000\u0000\u0000\u0162\u0165"+
-    "\u0001\u0000\u0000\u0000\u0163\u0161\u0001\u0000\u0000\u0000\u0163\u0164"+
-    "\u0001\u0000\u0000\u0000\u0164\u0166\u0001\u0000\u0000\u0000\u0165\u0163"+
-    "\u0001\u0000\u0000\u0000\u0166\u017c\u0005\"\u0000\u0000\u0167\u0168\u0005"+
-    "\"\u0000\u0000\u0168\u0169\u0005\"\u0000\u0000\u0169\u016a\u0005\"\u0000"+
-    "\u0000\u016a\u016e\u0001\u0000\u0000\u0000\u016b\u016d\b\u0001\u0000\u0000"+
-    "\u016c\u016b\u0001\u0000\u0000\u0000\u016d\u0170\u0001\u0000\u0000\u0000"+
-    "\u016e\u016f\u0001\u0000\u0000\u0000\u016e\u016c\u0001\u0000\u0000\u0000"+
-    "\u016f\u0171\u0001\u0000\u0000\u0000\u0170\u016e\u0001\u0000\u0000\u0000"+
-    "\u0171\u0172\u0005\"\u0000\u0000\u0172\u0173\u0005\"\u0000\u0000\u0173"+
-    "\u0174\u0005\"\u0000\u0000\u0174\u0176\u0001\u0000\u0000\u0000\u0175\u0177"+
-    "\u0005\"\u0000\u0000\u0176\u0175\u0001\u0000\u0000\u0000\u0176\u0177\u0001"+
-    "\u0000\u0000\u0000\u0177\u0179\u0001\u0000\u0000\u0000\u0178\u017a\u0005"+
-    "\"\u0000\u0000\u0179\u0178\u0001\u0000\u0000\u0000\u0179\u017a\u0001\u0000"+
-    "\u0000\u0000\u017a\u017c\u0001\u0000\u0000\u0000\u017b\u015e\u0001\u0000"+
-    "\u0000\u0000\u017b\u0167\u0001\u0000\u0000\u0000\u017c6\u0001\u0000\u0000"+
-    "\u0000\u017d\u017f\u0003+\u0014\u0000\u017e\u017d\u0001\u0000\u0000\u0000"+
-    "\u017f\u0180\u0001\u0000\u0000\u0000\u0180\u017e\u0001\u0000\u0000\u0000"+
-    "\u0180\u0181\u0001\u0000\u0000\u0000\u01818\u0001\u0000\u0000\u0000\u0182"+
-    "\u0184\u0003+\u0014\u0000\u0183\u0182\u0001\u0000\u0000\u0000\u0184\u0185"+
-    "\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000\u0000\u0000\u0185\u0186"+
-    "\u0001\u0000\u0000\u0000\u0186\u0187\u0001\u0000\u0000\u0000\u0187\u018b"+
-    "\u0003G\"\u0000\u0188\u018a\u0003+\u0014\u0000\u0189\u0188\u0001\u0000"+
-    "\u0000\u0000\u018a\u018d\u0001\u0000\u0000\u0000\u018b\u0189\u0001\u0000"+
-    "\u0000\u0000\u018b\u018c\u0001\u0000\u0000\u0000\u018c\u01ad\u0001\u0000"+
-    "\u0000\u0000\u018d\u018b\u0001\u0000\u0000\u0000\u018e\u0190\u0003G\""+
-    "\u0000\u018f\u0191\u0003+\u0014\u0000\u0190\u018f\u0001\u0000\u0000\u0000"+
-    "\u0191\u0192\u0001\u0000\u0000\u0000\u0192\u0190\u0001\u0000\u0000\u0000"+
-    "\u0192\u0193\u0001\u0000\u0000\u0000\u0193\u01ad\u0001\u0000\u0000\u0000"+
-    "\u0194\u0196\u0003+\u0014\u0000\u0195\u0194\u0001\u0000\u0000\u0000\u0196"+
-    "\u0197\u0001\u0000\u0000\u0000\u0197\u0195\u0001\u0000\u0000\u0000\u0197"+
-    "\u0198\u0001\u0000\u0000\u0000\u0198\u01a0\u0001\u0000\u0000\u0000\u0199"+
-    "\u019d\u0003G\"\u0000\u019a\u019c\u0003+\u0014\u0000\u019b\u019a\u0001"+
-    "\u0000\u0000\u0000\u019c\u019f\u0001\u0000\u0000\u0000\u019d\u019b\u0001"+
-    "\u0000\u0000\u0000\u019d\u019e\u0001\u0000\u0000\u0000\u019e\u01a1\u0001"+
-    "\u0000\u0000\u0000\u019f\u019d\u0001\u0000\u0000\u0000\u01a0\u0199\u0001"+
-    "\u0000\u0000\u0000\u01a0\u01a1\u0001\u0000\u0000\u0000\u01a1\u01a2\u0001"+
-    "\u0000\u0000\u0000\u01a2\u01a3\u00033\u0018\u0000\u01a3\u01ad\u0001\u0000"+
-    "\u0000\u0000\u01a4\u01a6\u0003G\"\u0000\u01a5\u01a7\u0003+\u0014\u0000"+
-    "\u01a6\u01a5\u0001\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000"+
-    "\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a8\u01a9\u0001\u0000\u0000\u0000"+
-    "\u01a9\u01aa\u0001\u0000\u0000\u0000\u01aa\u01ab\u00033\u0018\u0000\u01ab"+
-    "\u01ad\u0001\u0000\u0000\u0000\u01ac\u0183\u0001\u0000\u0000\u0000\u01ac"+
-    "\u018e\u0001\u0000\u0000\u0000\u01ac\u0195\u0001\u0000\u0000\u0000\u01ac"+
-    "\u01a4\u0001\u0000\u0000\u0000\u01ad:\u0001\u0000\u0000\u0000\u01ae\u01af"+
-    "\u0005b\u0000\u0000\u01af\u01b0\u0005y\u0000\u0000\u01b0<\u0001\u0000"+
-    "\u0000\u0000\u01b1\u01b2\u0005a\u0000\u0000\u01b2\u01b3\u0005n\u0000\u0000"+
-    "\u01b3\u01b4\u0005d\u0000\u0000\u01b4>\u0001\u0000\u0000\u0000\u01b5\u01b6"+
-    "\u0005a\u0000\u0000\u01b6\u01b7\u0005s\u0000\u0000\u01b7\u01b8\u0005c"+
-    "\u0000\u0000\u01b8@\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005=\u0000\u0000"+
-    "\u01baB\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005,\u0000\u0000\u01bcD"+
-    "\u0001\u0000\u0000\u0000\u01bd\u01be\u0005d\u0000\u0000\u01be\u01bf\u0005"+
-    "e\u0000\u0000\u01bf\u01c0\u0005s\u0000\u0000\u01c0\u01c1\u0005c\u0000"+
-    "\u0000\u01c1F\u0001\u0000\u0000\u0000\u01c2\u01c3\u0005.\u0000\u0000\u01c3"+
-    "H\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005f\u0000\u0000\u01c5\u01c6\u0005"+
-    "a\u0000\u0000\u01c6\u01c7\u0005l\u0000\u0000\u01c7\u01c8\u0005s\u0000"+
-    "\u0000\u01c8\u01c9\u0005e\u0000\u0000\u01c9J\u0001\u0000\u0000\u0000\u01ca"+
-    "\u01cb\u0005f\u0000\u0000\u01cb\u01cc\u0005i\u0000\u0000\u01cc\u01cd\u0005"+
-    "r\u0000\u0000\u01cd\u01ce\u0005s\u0000\u0000\u01ce\u01cf\u0005t\u0000"+
-    "\u0000\u01cfL\u0001\u0000\u0000\u0000\u01d0\u01d1\u0005l\u0000\u0000\u01d1"+
-    "\u01d2\u0005a\u0000\u0000\u01d2\u01d3\u0005s\u0000\u0000\u01d3\u01d4\u0005"+
-    "t\u0000\u0000\u01d4N\u0001\u0000\u0000\u0000\u01d5\u01d6\u0005(\u0000"+
-    "\u0000\u01d6P\u0001\u0000\u0000\u0000\u01d7\u01d8\u0005[\u0000\u0000\u01d8"+
-    "\u01d9\u0001\u0000\u0000\u0000\u01d9\u01da\u0006\'\u0004\u0000\u01daR"+
-    "\u0001\u0000\u0000\u0000\u01db\u01dc\u0005]\u0000\u0000\u01dc\u01dd\u0001"+
-    "\u0000\u0000\u0000\u01dd\u01de\u0006(\u0003\u0000\u01de\u01df\u0006(\u0003"+
-    "\u0000\u01dfT\u0001\u0000\u0000\u0000\u01e0\u01e1\u0005l\u0000\u0000\u01e1"+
-    "\u01e2\u0005i\u0000\u0000\u01e2\u01e3\u0005k\u0000\u0000\u01e3\u01e4\u0005"+
-    "e\u0000\u0000\u01e4V\u0001\u0000\u0000\u0000\u01e5\u01e6\u0005n\u0000"+
-    "\u0000\u01e6\u01e7\u0005o\u0000\u0000\u01e7\u01e8\u0005t\u0000\u0000\u01e8"+
-    "X\u0001\u0000\u0000\u0000\u01e9\u01ea\u0005n\u0000\u0000\u01ea\u01eb\u0005"+
-    "u\u0000\u0000\u01eb\u01ec\u0005l\u0000\u0000\u01ec\u01ed\u0005l\u0000"+
-    "\u0000\u01edZ\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005n\u0000\u0000\u01ef"+
-    "\u01f0\u0005u\u0000\u0000\u01f0\u01f1\u0005l\u0000\u0000\u01f1\u01f2\u0005"+
-    "l\u0000\u0000\u01f2\u01f3\u0005s\u0000\u0000\u01f3\\\u0001\u0000\u0000"+
-    "\u0000\u01f4\u01f5\u0005o\u0000\u0000\u01f5\u01f6\u0005r\u0000\u0000\u01f6"+
-    "^\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005r\u0000\u0000\u01f8\u01f9\u0005"+
-    "l\u0000\u0000\u01f9\u01fa\u0005i\u0000\u0000\u01fa\u01fb\u0005k\u0000"+
-    "\u0000\u01fb\u01fc\u0005e\u0000\u0000\u01fc`\u0001\u0000\u0000\u0000\u01fd"+
-    "\u01fe\u0005)\u0000\u0000\u01feb\u0001\u0000\u0000\u0000\u01ff\u0200\u0005"+
-    "t\u0000\u0000\u0200\u0201\u0005r\u0000\u0000\u0201\u0202\u0005u\u0000"+
-    "\u0000\u0202\u0203\u0005e\u0000\u0000\u0203d\u0001\u0000\u0000\u0000\u0204"+
-    "\u0205\u0005i\u0000\u0000\u0205\u0206\u0005n\u0000\u0000\u0206\u0207\u0005"+
-    "f\u0000\u0000\u0207\u0208\u0005o\u0000\u0000\u0208f\u0001\u0000\u0000"+
-    "\u0000\u0209\u020a\u0005f\u0000\u0000\u020a\u020b\u0005u\u0000\u0000\u020b"+
-    "\u020c\u0005n\u0000\u0000\u020c\u020d\u0005c\u0000\u0000\u020d\u020e\u0005"+
-    "t\u0000\u0000\u020e\u020f\u0005i\u0000\u0000\u020f\u0210\u0005o\u0000"+
-    "\u0000\u0210\u0211\u0005n\u0000\u0000\u0211\u0212\u0005s\u0000\u0000\u0212"+
-    "h\u0001\u0000\u0000\u0000\u0213\u0214\u0005=\u0000\u0000\u0214\u0215\u0005"+
-    "=\u0000\u0000\u0215j\u0001\u0000\u0000\u0000\u0216\u0217\u0005!\u0000"+
-    "\u0000\u0217\u0218\u0005=\u0000\u0000\u0218l\u0001\u0000\u0000\u0000\u0219"+
-    "\u021a\u0005<\u0000\u0000\u021an\u0001\u0000\u0000\u0000\u021b\u021c\u0005"+
-    "<\u0000\u0000\u021c\u021d\u0005=\u0000\u0000\u021dp\u0001\u0000\u0000"+
-    "\u0000\u021e\u021f\u0005>\u0000\u0000\u021fr\u0001\u0000\u0000\u0000\u0220"+
-    "\u0221\u0005>\u0000\u0000\u0221\u0222\u0005=\u0000\u0000\u0222t\u0001"+
-    "\u0000\u0000\u0000\u0223\u0224\u0005+\u0000\u0000\u0224v\u0001\u0000\u0000"+
-    "\u0000\u0225\u0226\u0005-\u0000\u0000\u0226x\u0001\u0000\u0000\u0000\u0227"+
-    "\u0228\u0005*\u0000\u0000\u0228z\u0001\u0000\u0000\u0000\u0229\u022a\u0005"+
-    "/\u0000\u0000\u022a|\u0001\u0000\u0000\u0000\u022b\u022c\u0005%\u0000"+
-    "\u0000\u022c~\u0001\u0000\u0000\u0000\u022d\u0233\u0003-\u0015\u0000\u022e"+
-    "\u0232\u0003-\u0015\u0000\u022f\u0232\u0003+\u0014\u0000\u0230\u0232\u0005"+
-    "_\u0000\u0000\u0231\u022e\u0001\u0000\u0000\u0000\u0231\u022f\u0001\u0000"+
-    "\u0000\u0000\u0231\u0230\u0001\u0000\u0000\u0000\u0232\u0235\u0001\u0000"+
-    "\u0000\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000"+
-    "\u0000\u0000\u0234\u023f\u0001\u0000\u0000\u0000\u0235\u0233\u0001\u0000"+
-    "\u0000\u0000\u0236\u023a\u0007\t\u0000\u0000\u0237\u023b\u0003-\u0015"+
-    "\u0000\u0238\u023b\u0003+\u0014\u0000\u0239\u023b\u0005_\u0000\u0000\u023a"+
-    "\u0237\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a"+
-    "\u0239\u0001\u0000\u0000\u0000\u023b\u023c\u0001\u0000\u0000\u0000\u023c"+
-    "\u023a\u0001\u0000\u0000\u0000\u023c\u023d\u0001\u0000\u0000\u0000\u023d"+
-    "\u023f\u0001\u0000\u0000\u0000\u023e\u022d\u0001\u0000\u0000\u0000\u023e"+
-    "\u0236\u0001\u0000\u0000\u0000\u023f\u0080\u0001\u0000\u0000\u0000\u0240"+
-    "\u0246\u0005`\u0000\u0000\u0241\u0245\b\n\u0000\u0000\u0242\u0243\u0005"+
-    "`\u0000\u0000\u0243\u0245\u0005`\u0000\u0000\u0244\u0241\u0001\u0000\u0000"+
-    "\u0000\u0244\u0242\u0001\u0000\u0000\u0000\u0245\u0248\u0001\u0000\u0000"+
-    "\u0000\u0246\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000"+
-    "\u0000\u0247\u0249\u0001\u0000\u0000\u0000\u0248\u0246\u0001\u0000\u0000"+
-    "\u0000\u0249\u024a\u0005`\u0000\u0000\u024a\u0082\u0001\u0000\u0000\u0000"+
-    "\u024b\u024c\u0003#\u0010\u0000\u024c\u024d\u0001\u0000\u0000\u0000\u024d"+
-    "\u024e\u0006@\u0002\u0000\u024e\u0084\u0001\u0000\u0000\u0000\u024f\u0250"+
-    "\u0003%\u0011\u0000\u0250\u0251\u0001\u0000\u0000\u0000\u0251\u0252\u0006"+
-    "A\u0002\u0000\u0252\u0086\u0001\u0000\u0000\u0000\u0253\u0254\u0003\'"+
-    "\u0012\u0000\u0254\u0255\u0001\u0000\u0000\u0000\u0255\u0256\u0006B\u0002"+
-    "\u0000\u0256\u0088\u0001\u0000\u0000\u0000\u0257\u0258\u0005|\u0000\u0000"+
-    "\u0258\u0259\u0001\u0000\u0000\u0000\u0259\u025a\u0006C\u0005\u0000\u025a"+
-    "\u025b\u0006C\u0003\u0000\u025b\u008a\u0001\u0000\u0000\u0000\u025c\u025d"+
-    "\u0005]\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025f\u0006"+
-    "D\u0003\u0000\u025f\u0260\u0006D\u0003\u0000\u0260\u0261\u0006D\u0006"+
-    "\u0000\u0261\u008c\u0001\u0000\u0000\u0000\u0262\u0263\u0005,\u0000\u0000"+
-    "\u0263\u0264\u0001\u0000\u0000\u0000\u0264\u0265\u0006E\u0007\u0000\u0265"+
-    "\u008e\u0001\u0000\u0000\u0000\u0266\u0267\u0005=\u0000\u0000\u0267\u0268"+
-    "\u0001\u0000\u0000\u0000\u0268\u0269\u0006F\b\u0000\u0269\u0090\u0001"+
-    "\u0000\u0000\u0000\u026a\u026c\u0003\u0093H\u0000\u026b\u026a\u0001\u0000"+
-    "\u0000\u0000\u026c\u026d\u0001\u0000\u0000\u0000\u026d\u026b\u0001\u0000"+
-    "\u0000\u0000\u026d\u026e\u0001\u0000\u0000\u0000\u026e\u0092\u0001\u0000"+
-    "\u0000\u0000\u026f\u0271\b\u000b\u0000\u0000\u0270\u026f\u0001\u0000\u0000"+
-    "\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0270\u0001\u0000\u0000"+
-    "\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0277\u0001\u0000\u0000"+
-    "\u0000\u0274\u0275\u0005/\u0000\u0000\u0275\u0277\b\f\u0000\u0000\u0276"+
-    "\u0270\u0001\u0000\u0000\u0000\u0276\u0274\u0001\u0000\u0000\u0000\u0277"+
-    "\u0094\u0001\u0000\u0000\u0000\u0278\u0279\u0003\u0081?\u0000\u0279\u0096"+
-    "\u0001\u0000\u0000\u0000\u027a\u027b\u0003#\u0010\u0000\u027b\u027c\u0001"+
-    "\u0000\u0000\u0000\u027c\u027d\u0006J\u0002\u0000\u027d\u0098\u0001\u0000"+
-    "\u0000\u0000\u027e\u027f\u0003%\u0011\u0000\u027f\u0280\u0001\u0000\u0000"+
-    "\u0000\u0280\u0281\u0006K\u0002\u0000\u0281\u009a\u0001\u0000\u0000\u0000"+
-    "\u0282\u0283\u0003\'\u0012\u0000\u0283\u0284\u0001\u0000\u0000\u0000\u0284"+
-    "\u0285\u0006L\u0002\u0000\u0285\u009c\u0001\u0000\u0000\u0000%\u0000\u0001"+
-    "\u0002\u011d\u0127\u012b\u012e\u0137\u0139\u0144\u0157\u015c\u0161\u0163"+
-    "\u016e\u0176\u0179\u017b\u0180\u0185\u018b\u0192\u0197\u019d\u01a0\u01a8"+
-    "\u01ac\u0231\u0233\u023a\u023c\u023e\u0244\u0246\u026d\u0272\u0276\t\u0005"+
-    "\u0001\u0000\u0005\u0002\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0005"+
-    "\u0000\u0000\u0007\u0014\u0000\u0007$\u0000\u0007\u001c\u0000\u0007\u001b"+
+    "\u000f\u0127\b\u000f\u000b\u000f\f\u000f\u0128\u0001\u000f\u0001\u000f"+
+    "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0005\u0010\u0131\b\u0010"+
+    "\n\u0010\f\u0010\u0134\t\u0010\u0001\u0010\u0003\u0010\u0137\b\u0010\u0001"+
+    "\u0010\u0003\u0010\u013a\b\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001"+
+    "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0005\u0011\u0143\b\u0011\n"+
+    "\u0011\f\u0011\u0146\t\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+
+    "\u0011\u0001\u0011\u0001\u0012\u0004\u0012\u014e\b\u0012\u000b\u0012\f"+
+    "\u0012\u014f\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+
+    "\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+
+    "\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016"+
+    "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+
+    "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019"+
+    "\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b"+
+    "\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003\u001d\u0179\b\u001d"+
+    "\u0001\u001d\u0004\u001d\u017c\b\u001d\u000b\u001d\f\u001d\u017d\u0001"+
+    "\u001e\u0001\u001e\u0001\u001e\u0005\u001e\u0183\b\u001e\n\u001e\f\u001e"+
+    "\u0186\t\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+
+    "\u0001\u001e\u0005\u001e\u018e\b\u001e\n\u001e\f\u001e\u0191\t\u001e\u0001"+
+    "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0003\u001e\u0198"+
+    "\b\u001e\u0001\u001e\u0003\u001e\u019b\b\u001e\u0003\u001e\u019d\b\u001e"+
+    "\u0001\u001f\u0004\u001f\u01a0\b\u001f\u000b\u001f\f\u001f\u01a1\u0001"+
+    " \u0004 \u01a5\b \u000b \f \u01a6\u0001 \u0001 \u0005 \u01ab\b \n \f "+
+    "\u01ae\t \u0001 \u0001 \u0004 \u01b2\b \u000b \f \u01b3\u0001 \u0004 "+
+    "\u01b7\b \u000b \f \u01b8\u0001 \u0001 \u0005 \u01bd\b \n \f \u01c0\t"+
+    " \u0003 \u01c2\b \u0001 \u0001 \u0001 \u0001 \u0004 \u01c8\b \u000b \f"+
+    " \u01c9\u0001 \u0001 \u0003 \u01ce\b \u0001!\u0001!\u0001!\u0001\"\u0001"+
+    "\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001%\u0001"+
+    "%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001(\u0001(\u0001"+
+    "(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+
+    "*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+
+    ",\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001"+
+    ".\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u0001"+
+    "1\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u00013\u00013\u0001"+
+    "3\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+
+    "5\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00016\u00016\u0001"+
+    "6\u00017\u00017\u00017\u00018\u00018\u00019\u00019\u00019\u0001:\u0001"+
+    ":\u0001;\u0001;\u0001;\u0001<\u0001<\u0001=\u0001=\u0001>\u0001>\u0001"+
+    "?\u0001?\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001"+
+    "B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0005C\u0254\bC\nC"+
+    "\fC\u0257\tC\u0001C\u0001C\u0001C\u0001C\u0004C\u025d\bC\u000bC\fC\u025e"+
+    "\u0003C\u0261\bC\u0001D\u0001D\u0001D\u0001D\u0005D\u0267\bD\nD\fD\u026a"+
+    "\tD\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001"+
+    "F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+
+    "I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001"+
+    "K\u0001K\u0001K\u0001K\u0001L\u0004L\u028e\bL\u000bL\fL\u028f\u0001M\u0004"+
+    "M\u0293\bM\u000bM\fM\u0294\u0001M\u0001M\u0003M\u0299\bM\u0001N\u0001"+
+    "N\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001"+
+    "Q\u0001Q\u0001Q\u0002\u0144\u018f\u0000R\u0004\u0001\u0006\u0002\b\u0003"+
+    "\n\u0004\f\u0005\u000e\u0006\u0010\u0007\u0012\b\u0014\t\u0016\n\u0018"+
+    "\u000b\u001a\f\u001c\r\u001e\u000e \u000f\"\u0010$\u0011&\u0012(\u0013"+
+    "*\u0000,G.\u00140\u00152\u00164\u00176\u00008\u0000:\u0000<\u0000>\u0000"+
+    "@\u0018B\u0019D\u001aF\u001bH\u001cJ\u001dL\u001eN\u001fP R!T\"V#X$Z%"+
+    "\\&^\'`(b)d*f+h,j-l.n/p0r1t2v3x4z5|6~7\u00808\u00829\u0084:\u0086;\u0088"+
+    "<\u008a=\u008c>\u008e?\u0090@\u0092A\u0094\u0000\u0096\u0000\u0098\u0000"+
+    "\u009a\u0000\u009cB\u009e\u0000\u00a0C\u00a2D\u00a4E\u00a6F\u0004\u0000"+
+    "\u0001\u0002\u0003\r\u0006\u0000\t\n\r\r  //[[]]\u0002\u0000\n\n\r\r\u0003"+
+    "\u0000\t\n\r\r  \u0001\u000009\u0002\u0000AZaz\u0005\u0000\"\"\\\\nnr"+
+    "rtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000EEee\u0002\u0000++--\u0002"+
+    "\u0000@@__\u0001\u0000``\n\u0000\t\n\r\r  ,,//==[[]]``||\u0002\u0000*"+
+    "*//\u02c4\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000"+
+    "\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000"+
+    "\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000"+
+    "\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000"+
+    "\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000"+
+    "\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000"+
+    "\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+
+    "\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+
+    "$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+
+    "\u0000\u0000\u0000\u0001*\u0001\u0000\u0000\u0000\u0001,\u0001\u0000\u0000"+
+    "\u0000\u0001.\u0001\u0000\u0000\u0000\u00010\u0001\u0000\u0000\u0000\u0001"+
+    "2\u0001\u0000\u0000\u0000\u00024\u0001\u0000\u0000\u0000\u0002@\u0001"+
+    "\u0000\u0000\u0000\u0002B\u0001\u0000\u0000\u0000\u0002D\u0001\u0000\u0000"+
+    "\u0000\u0002F\u0001\u0000\u0000\u0000\u0002H\u0001\u0000\u0000\u0000\u0002"+
+    "J\u0001\u0000\u0000\u0000\u0002L\u0001\u0000\u0000\u0000\u0002N\u0001"+
+    "\u0000\u0000\u0000\u0002P\u0001\u0000\u0000\u0000\u0002R\u0001\u0000\u0000"+
+    "\u0000\u0002T\u0001\u0000\u0000\u0000\u0002V\u0001\u0000\u0000\u0000\u0002"+
+    "X\u0001\u0000\u0000\u0000\u0002Z\u0001\u0000\u0000\u0000\u0002\\\u0001"+
+    "\u0000\u0000\u0000\u0002^\u0001\u0000\u0000\u0000\u0002`\u0001\u0000\u0000"+
+    "\u0000\u0002b\u0001\u0000\u0000\u0000\u0002d\u0001\u0000\u0000\u0000\u0002"+
+    "f\u0001\u0000\u0000\u0000\u0002h\u0001\u0000\u0000\u0000\u0002j\u0001"+
+    "\u0000\u0000\u0000\u0002l\u0001\u0000\u0000\u0000\u0002n\u0001\u0000\u0000"+
+    "\u0000\u0002p\u0001\u0000\u0000\u0000\u0002r\u0001\u0000\u0000\u0000\u0002"+
+    "t\u0001\u0000\u0000\u0000\u0002v\u0001\u0000\u0000\u0000\u0002x\u0001"+
+    "\u0000\u0000\u0000\u0002z\u0001\u0000\u0000\u0000\u0002|\u0001\u0000\u0000"+
+    "\u0000\u0002~\u0001\u0000\u0000\u0000\u0002\u0080\u0001\u0000\u0000\u0000"+
+    "\u0002\u0082\u0001\u0000\u0000\u0000\u0002\u0084\u0001\u0000\u0000\u0000"+
+    "\u0002\u0086\u0001\u0000\u0000\u0000\u0002\u0088\u0001\u0000\u0000\u0000"+
+    "\u0002\u008a\u0001\u0000\u0000\u0000\u0002\u008c\u0001\u0000\u0000\u0000"+
+    "\u0002\u008e\u0001\u0000\u0000\u0000\u0002\u0090\u0001\u0000\u0000\u0000"+
+    "\u0002\u0092\u0001\u0000\u0000\u0000\u0003\u0094\u0001\u0000\u0000\u0000"+
+    "\u0003\u0096\u0001\u0000\u0000\u0000\u0003\u0098\u0001\u0000\u0000\u0000"+
+    "\u0003\u009a\u0001\u0000\u0000\u0000\u0003\u009c\u0001\u0000\u0000\u0000"+
+    "\u0003\u00a0\u0001\u0000\u0000\u0000\u0003\u00a2\u0001\u0000\u0000\u0000"+
+    "\u0003\u00a4\u0001\u0000\u0000\u0000\u0003\u00a6\u0001\u0000\u0000\u0000"+
+    "\u0004\u00a8\u0001\u0000\u0000\u0000\u0006\u00b2\u0001\u0000\u0000\u0000"+
+    "\b\u00b9\u0001\u0000\u0000\u0000\n\u00c3\u0001\u0000\u0000\u0000\f\u00ca"+
+    "\u0001\u0000\u0000\u0000\u000e\u00d8\u0001\u0000\u0000\u0000\u0010\u00df"+
+    "\u0001\u0000\u0000\u0000\u0012\u00e5\u0001\u0000\u0000\u0000\u0014\u00ed"+
+    "\u0001\u0000\u0000\u0000\u0016\u00f5\u0001\u0000\u0000\u0000\u0018\u00fc"+
+    "\u0001\u0000\u0000\u0000\u001a\u0104\u0001\u0000\u0000\u0000\u001c\u010b"+
+    "\u0001\u0000\u0000\u0000\u001e\u0114\u0001\u0000\u0000\u0000 \u011e\u0001"+
+    "\u0000\u0000\u0000\"\u0126\u0001\u0000\u0000\u0000$\u012c\u0001\u0000"+
+    "\u0000\u0000&\u013d\u0001\u0000\u0000\u0000(\u014d\u0001\u0000\u0000\u0000"+
+    "*\u0153\u0001\u0000\u0000\u0000,\u0158\u0001\u0000\u0000\u0000.\u015d"+
+    "\u0001\u0000\u0000\u00000\u0161\u0001\u0000\u0000\u00002\u0165\u0001\u0000"+
+    "\u0000\u00004\u0169\u0001\u0000\u0000\u00006\u016d\u0001\u0000\u0000\u0000"+
+    "8\u016f\u0001\u0000\u0000\u0000:\u0171\u0001\u0000\u0000\u0000<\u0174"+
+    "\u0001\u0000\u0000\u0000>\u0176\u0001\u0000\u0000\u0000@\u019c\u0001\u0000"+
+    "\u0000\u0000B\u019f\u0001\u0000\u0000\u0000D\u01cd\u0001\u0000\u0000\u0000"+
+    "F\u01cf\u0001\u0000\u0000\u0000H\u01d2\u0001\u0000\u0000\u0000J\u01d6"+
+    "\u0001\u0000\u0000\u0000L\u01da\u0001\u0000\u0000\u0000N\u01dc\u0001\u0000"+
+    "\u0000\u0000P\u01de\u0001\u0000\u0000\u0000R\u01e3\u0001\u0000\u0000\u0000"+
+    "T\u01e5\u0001\u0000\u0000\u0000V\u01eb\u0001\u0000\u0000\u0000X\u01f1"+
+    "\u0001\u0000\u0000\u0000Z\u01f6\u0001\u0000\u0000\u0000\\\u01f8\u0001"+
+    "\u0000\u0000\u0000^\u01fd\u0001\u0000\u0000\u0000`\u0201\u0001\u0000\u0000"+
+    "\u0000b\u0206\u0001\u0000\u0000\u0000d\u020c\u0001\u0000\u0000\u0000f"+
+    "\u020f\u0001\u0000\u0000\u0000h\u0215\u0001\u0000\u0000\u0000j\u0217\u0001"+
+    "\u0000\u0000\u0000l\u021c\u0001\u0000\u0000\u0000n\u0221\u0001\u0000\u0000"+
+    "\u0000p\u022b\u0001\u0000\u0000\u0000r\u022e\u0001\u0000\u0000\u0000t"+
+    "\u0231\u0001\u0000\u0000\u0000v\u0233\u0001\u0000\u0000\u0000x\u0236\u0001"+
+    "\u0000\u0000\u0000z\u0238\u0001\u0000\u0000\u0000|\u023b\u0001\u0000\u0000"+
+    "\u0000~\u023d\u0001\u0000\u0000\u0000\u0080\u023f\u0001\u0000\u0000\u0000"+
+    "\u0082\u0241\u0001\u0000\u0000\u0000\u0084\u0243\u0001\u0000\u0000\u0000"+
+    "\u0086\u0245\u0001\u0000\u0000\u0000\u0088\u024a\u0001\u0000\u0000\u0000"+
+    "\u008a\u0260\u0001\u0000\u0000\u0000\u008c\u0262\u0001\u0000\u0000\u0000"+
+    "\u008e\u026d\u0001\u0000\u0000\u0000\u0090\u0271\u0001\u0000\u0000\u0000"+
+    "\u0092\u0275\u0001\u0000\u0000\u0000\u0094\u0279\u0001\u0000\u0000\u0000"+
+    "\u0096\u027e\u0001\u0000\u0000\u0000\u0098\u0284\u0001\u0000\u0000\u0000"+
+    "\u009a\u0288\u0001\u0000\u0000\u0000\u009c\u028d\u0001\u0000\u0000\u0000"+
+    "\u009e\u0298\u0001\u0000\u0000\u0000\u00a0\u029a\u0001\u0000\u0000\u0000"+
+    "\u00a2\u029c\u0001\u0000\u0000\u0000\u00a4\u02a0\u0001\u0000\u0000\u0000"+
+    "\u00a6\u02a4\u0001\u0000\u0000\u0000\u00a8\u00a9\u0005d\u0000\u0000\u00a9"+
+    "\u00aa\u0005i\u0000\u0000\u00aa\u00ab\u0005s\u0000\u0000\u00ab\u00ac\u0005"+
+    "s\u0000\u0000\u00ac\u00ad\u0005e\u0000\u0000\u00ad\u00ae\u0005c\u0000"+
+    "\u0000\u00ae\u00af\u0005t\u0000\u0000\u00af\u00b0\u0001\u0000\u0000\u0000"+
+    "\u00b0\u00b1\u0006\u0000\u0000\u0000\u00b1\u0005\u0001\u0000\u0000\u0000"+
+    "\u00b2\u00b3\u0005e\u0000\u0000\u00b3\u00b4\u0005v\u0000\u0000\u00b4\u00b5"+
+    "\u0005a\u0000\u0000\u00b5\u00b6\u0005l\u0000\u0000\u00b6\u00b7\u0001\u0000"+
+    "\u0000\u0000\u00b7\u00b8\u0006\u0001\u0000\u0000\u00b8\u0007\u0001\u0000"+
+    "\u0000\u0000\u00b9\u00ba\u0005e\u0000\u0000\u00ba\u00bb\u0005x\u0000\u0000"+
+    "\u00bb\u00bc\u0005p\u0000\u0000\u00bc\u00bd\u0005l\u0000\u0000\u00bd\u00be"+
+    "\u0005a\u0000\u0000\u00be\u00bf\u0005i\u0000\u0000\u00bf\u00c0\u0005n"+
+    "\u0000\u0000\u00c0\u00c1\u0001\u0000\u0000\u0000\u00c1\u00c2\u0006\u0002"+
+    "\u0001\u0000\u00c2\t\u0001\u0000\u0000\u0000\u00c3\u00c4\u0005f\u0000"+
+    "\u0000\u00c4\u00c5\u0005r\u0000\u0000\u00c5\u00c6\u0005o\u0000\u0000\u00c6"+
+    "\u00c7\u0005m\u0000\u0000\u00c7\u00c8\u0001\u0000\u0000\u0000\u00c8\u00c9"+
+    "\u0006\u0003\u0002\u0000\u00c9\u000b\u0001\u0000\u0000\u0000\u00ca\u00cb"+
+    "\u0005i\u0000\u0000\u00cb\u00cc\u0005n\u0000\u0000\u00cc\u00cd\u0005l"+
+    "\u0000\u0000\u00cd\u00ce\u0005i\u0000\u0000\u00ce\u00cf\u0005n\u0000\u0000"+
+    "\u00cf\u00d0\u0005e\u0000\u0000\u00d0\u00d1\u0005s\u0000\u0000\u00d1\u00d2"+
+    "\u0005t\u0000\u0000\u00d2\u00d3\u0005a\u0000\u0000\u00d3\u00d4\u0005t"+
+    "\u0000\u0000\u00d4\u00d5\u0005s\u0000\u0000\u00d5\u00d6\u0001\u0000\u0000"+
+    "\u0000\u00d6\u00d7\u0006\u0004\u0000\u0000\u00d7\r\u0001\u0000\u0000\u0000"+
+    "\u00d8\u00d9\u0005g\u0000\u0000\u00d9\u00da\u0005r\u0000\u0000\u00da\u00db"+
+    "\u0005o\u0000\u0000\u00db\u00dc\u0005k\u0000\u0000\u00dc\u00dd\u0001\u0000"+
+    "\u0000\u0000\u00dd\u00de\u0006\u0005\u0000\u0000\u00de\u000f\u0001\u0000"+
+    "\u0000\u0000\u00df\u00e0\u0005r\u0000\u0000\u00e0\u00e1\u0005o\u0000\u0000"+
+    "\u00e1\u00e2\u0005w\u0000\u0000\u00e2\u00e3\u0001\u0000\u0000\u0000\u00e3"+
+    "\u00e4\u0006\u0006\u0000\u0000\u00e4\u0011\u0001\u0000\u0000\u0000\u00e5"+
+    "\u00e6\u0005s\u0000\u0000\u00e6\u00e7\u0005t\u0000\u0000\u00e7\u00e8\u0005"+
+    "a\u0000\u0000\u00e8\u00e9\u0005t\u0000\u0000\u00e9\u00ea\u0005s\u0000"+
+    "\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb\u00ec\u0006\u0007\u0000"+
+    "\u0000\u00ec\u0013\u0001\u0000\u0000\u0000\u00ed\u00ee\u0005w\u0000\u0000"+
+    "\u00ee\u00ef\u0005h\u0000\u0000\u00ef\u00f0\u0005e\u0000\u0000\u00f0\u00f1"+
+    "\u0005r\u0000\u0000\u00f1\u00f2\u0005e\u0000\u0000\u00f2\u00f3\u0001\u0000"+
+    "\u0000\u0000\u00f3\u00f4\u0006\b\u0000\u0000\u00f4\u0015\u0001\u0000\u0000"+
+    "\u0000\u00f5\u00f6\u0005s\u0000\u0000\u00f6\u00f7\u0005o\u0000\u0000\u00f7"+
+    "\u00f8\u0005r\u0000\u0000\u00f8\u00f9\u0005t\u0000\u0000\u00f9\u00fa\u0001"+
+    "\u0000\u0000\u0000\u00fa\u00fb\u0006\t\u0000\u0000\u00fb\u0017\u0001\u0000"+
+    "\u0000\u0000\u00fc\u00fd\u0005l\u0000\u0000\u00fd\u00fe\u0005i\u0000\u0000"+
+    "\u00fe\u00ff\u0005m\u0000\u0000\u00ff\u0100\u0005i\u0000\u0000\u0100\u0101"+
+    "\u0005t\u0000\u0000\u0101\u0102\u0001\u0000\u0000\u0000\u0102\u0103\u0006"+
+    "\n\u0000\u0000\u0103\u0019\u0001\u0000\u0000\u0000\u0104\u0105\u0005d"+
+    "\u0000\u0000\u0105\u0106\u0005r\u0000\u0000\u0106\u0107\u0005o\u0000\u0000"+
+    "\u0107\u0108\u0005p\u0000\u0000\u0108\u0109\u0001\u0000\u0000\u0000\u0109"+
+    "\u010a\u0006\u000b\u0002\u0000\u010a\u001b\u0001\u0000\u0000\u0000\u010b"+
+    "\u010c\u0005r\u0000\u0000\u010c\u010d\u0005e\u0000\u0000\u010d\u010e\u0005"+
+    "n\u0000\u0000\u010e\u010f\u0005a\u0000\u0000\u010f\u0110\u0005m\u0000"+
+    "\u0000\u0110\u0111\u0005e\u0000\u0000\u0111\u0112\u0001\u0000\u0000\u0000"+
+    "\u0112\u0113\u0006\f\u0002\u0000\u0113\u001d\u0001\u0000\u0000\u0000\u0114"+
+    "\u0115\u0005p\u0000\u0000\u0115\u0116\u0005r\u0000\u0000\u0116\u0117\u0005"+
+    "o\u0000\u0000\u0117\u0118\u0005j\u0000\u0000\u0118\u0119\u0005e\u0000"+
+    "\u0000\u0119\u011a\u0005c\u0000\u0000\u011a\u011b\u0005t\u0000\u0000\u011b"+
+    "\u011c\u0001\u0000\u0000\u0000\u011c\u011d\u0006\r\u0002\u0000\u011d\u001f"+
+    "\u0001\u0000\u0000\u0000\u011e\u011f\u0005s\u0000\u0000\u011f\u0120\u0005"+
+    "h\u0000\u0000\u0120\u0121\u0005o\u0000\u0000\u0121\u0122\u0005w\u0000"+
+    "\u0000\u0122\u0123\u0001\u0000\u0000\u0000\u0123\u0124\u0006\u000e\u0000"+
+    "\u0000\u0124!\u0001\u0000\u0000\u0000\u0125\u0127\b\u0000\u0000\u0000"+
+    "\u0126\u0125\u0001\u0000\u0000\u0000\u0127\u0128\u0001\u0000\u0000\u0000"+
+    "\u0128\u0126\u0001\u0000\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000"+
+    "\u0129\u012a\u0001\u0000\u0000\u0000\u012a\u012b\u0006\u000f\u0000\u0000"+
+    "\u012b#\u0001\u0000\u0000\u0000\u012c\u012d\u0005/\u0000\u0000\u012d\u012e"+
+    "\u0005/\u0000\u0000\u012e\u0132\u0001\u0000\u0000\u0000\u012f\u0131\b"+
+    "\u0001\u0000\u0000\u0130\u012f\u0001\u0000\u0000\u0000\u0131\u0134\u0001"+
+    "\u0000\u0000\u0000\u0132\u0130\u0001\u0000\u0000\u0000\u0132\u0133\u0001"+
+    "\u0000\u0000\u0000\u0133\u0136\u0001\u0000\u0000\u0000\u0134\u0132\u0001"+
+    "\u0000\u0000\u0000\u0135\u0137\u0005\r\u0000\u0000\u0136\u0135\u0001\u0000"+
+    "\u0000\u0000\u0136\u0137\u0001\u0000\u0000\u0000\u0137\u0139\u0001\u0000"+
+    "\u0000\u0000\u0138\u013a\u0005\n\u0000\u0000\u0139\u0138\u0001\u0000\u0000"+
+    "\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u013a\u013b\u0001\u0000\u0000"+
+    "\u0000\u013b\u013c\u0006\u0010\u0003\u0000\u013c%\u0001\u0000\u0000\u0000"+
+    "\u013d\u013e\u0005/\u0000\u0000\u013e\u013f\u0005*\u0000\u0000\u013f\u0144"+
+    "\u0001\u0000\u0000\u0000\u0140\u0143\u0003&\u0011\u0000\u0141\u0143\t"+
+    "\u0000\u0000\u0000\u0142\u0140\u0001\u0000\u0000\u0000\u0142\u0141\u0001"+
+    "\u0000\u0000\u0000\u0143\u0146\u0001\u0000\u0000\u0000\u0144\u0145\u0001"+
+    "\u0000\u0000\u0000\u0144\u0142\u0001\u0000\u0000\u0000\u0145\u0147\u0001"+
+    "\u0000\u0000\u0000\u0146\u0144\u0001\u0000\u0000\u0000\u0147\u0148\u0005"+
+    "*\u0000\u0000\u0148\u0149\u0005/\u0000\u0000\u0149\u014a\u0001\u0000\u0000"+
+    "\u0000\u014a\u014b\u0006\u0011\u0003\u0000\u014b\'\u0001\u0000\u0000\u0000"+
+    "\u014c\u014e\u0007\u0002\u0000\u0000\u014d\u014c\u0001\u0000\u0000\u0000"+
+    "\u014e\u014f\u0001\u0000\u0000\u0000\u014f\u014d\u0001\u0000\u0000\u0000"+
+    "\u014f\u0150\u0001\u0000\u0000\u0000\u0150\u0151\u0001\u0000\u0000\u0000"+
+    "\u0151\u0152\u0006\u0012\u0003\u0000\u0152)\u0001\u0000\u0000\u0000\u0153"+
+    "\u0154\u0005[\u0000\u0000\u0154\u0155\u0001\u0000\u0000\u0000\u0155\u0156"+
+    "\u0006\u0013\u0004\u0000\u0156\u0157\u0006\u0013\u0005\u0000\u0157+\u0001"+
+    "\u0000\u0000\u0000\u0158\u0159\u0005|\u0000\u0000\u0159\u015a\u0001\u0000"+
+    "\u0000\u0000\u015a\u015b\u0006\u0014\u0006\u0000\u015b\u015c\u0006\u0014"+
+    "\u0007\u0000\u015c-\u0001\u0000\u0000\u0000\u015d\u015e\u0003(\u0012\u0000"+
+    "\u015e\u015f\u0001\u0000\u0000\u0000\u015f\u0160\u0006\u0015\u0003\u0000"+
+    "\u0160/\u0001\u0000\u0000\u0000\u0161\u0162\u0003$\u0010\u0000\u0162\u0163"+
+    "\u0001\u0000\u0000\u0000\u0163\u0164\u0006\u0016\u0003\u0000\u01641\u0001"+
+    "\u0000\u0000\u0000\u0165\u0166\u0003&\u0011\u0000\u0166\u0167\u0001\u0000"+
+    "\u0000\u0000\u0167\u0168\u0006\u0017\u0003\u0000\u01683\u0001\u0000\u0000"+
+    "\u0000\u0169\u016a\u0005|\u0000\u0000\u016a\u016b\u0001\u0000\u0000\u0000"+
+    "\u016b\u016c\u0006\u0018\u0007\u0000\u016c5\u0001\u0000\u0000\u0000\u016d"+
+    "\u016e\u0007\u0003\u0000\u0000\u016e7\u0001\u0000\u0000\u0000\u016f\u0170"+
+    "\u0007\u0004\u0000\u0000\u01709\u0001\u0000\u0000\u0000\u0171\u0172\u0005"+
+    "\\\u0000\u0000\u0172\u0173\u0007\u0005\u0000\u0000\u0173;\u0001\u0000"+
+    "\u0000\u0000\u0174\u0175\b\u0006\u0000\u0000\u0175=\u0001\u0000\u0000"+
+    "\u0000\u0176\u0178\u0007\u0007\u0000\u0000\u0177\u0179\u0007\b\u0000\u0000"+
+    "\u0178\u0177\u0001\u0000\u0000\u0000\u0178\u0179\u0001\u0000\u0000\u0000"+
+    "\u0179\u017b\u0001\u0000\u0000\u0000\u017a\u017c\u00036\u0019\u0000\u017b"+
+    "\u017a\u0001\u0000\u0000\u0000\u017c\u017d\u0001\u0000\u0000\u0000\u017d"+
+    "\u017b\u0001\u0000\u0000\u0000\u017d\u017e\u0001\u0000\u0000\u0000\u017e"+
+    "?\u0001\u0000\u0000\u0000\u017f\u0184\u0005\"\u0000\u0000\u0180\u0183"+
+    "\u0003:\u001b\u0000\u0181\u0183\u0003<\u001c\u0000\u0182\u0180\u0001\u0000"+
+    "\u0000\u0000\u0182\u0181\u0001\u0000\u0000\u0000\u0183\u0186\u0001\u0000"+
+    "\u0000\u0000\u0184\u0182\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000"+
+    "\u0000\u0000\u0185\u0187\u0001\u0000\u0000\u0000\u0186\u0184\u0001\u0000"+
+    "\u0000\u0000\u0187\u019d\u0005\"\u0000\u0000\u0188\u0189\u0005\"\u0000"+
+    "\u0000\u0189\u018a\u0005\"\u0000\u0000\u018a\u018b\u0005\"\u0000\u0000"+
+    "\u018b\u018f\u0001\u0000\u0000\u0000\u018c\u018e\b\u0001\u0000\u0000\u018d"+
+    "\u018c\u0001\u0000\u0000\u0000\u018e\u0191\u0001\u0000\u0000\u0000\u018f"+
+    "\u0190\u0001\u0000\u0000\u0000\u018f\u018d\u0001\u0000\u0000\u0000\u0190"+
+    "\u0192\u0001\u0000\u0000\u0000\u0191\u018f\u0001\u0000\u0000\u0000\u0192"+
+    "\u0193\u0005\"\u0000\u0000\u0193\u0194\u0005\"\u0000\u0000\u0194\u0195"+
+    "\u0005\"\u0000\u0000\u0195\u0197\u0001\u0000\u0000\u0000\u0196\u0198\u0005"+
+    "\"\u0000\u0000\u0197\u0196\u0001\u0000\u0000\u0000\u0197\u0198\u0001\u0000"+
+    "\u0000\u0000\u0198\u019a\u0001\u0000\u0000\u0000\u0199\u019b\u0005\"\u0000"+
+    "\u0000\u019a\u0199\u0001\u0000\u0000\u0000\u019a\u019b\u0001\u0000\u0000"+
+    "\u0000\u019b\u019d\u0001\u0000\u0000\u0000\u019c\u017f\u0001\u0000\u0000"+
+    "\u0000\u019c\u0188\u0001\u0000\u0000\u0000\u019dA\u0001\u0000\u0000\u0000"+
+    "\u019e\u01a0\u00036\u0019\u0000\u019f\u019e\u0001\u0000\u0000\u0000\u01a0"+
+    "\u01a1\u0001\u0000\u0000\u0000\u01a1\u019f\u0001\u0000\u0000\u0000\u01a1"+
+    "\u01a2\u0001\u0000\u0000\u0000\u01a2C\u0001\u0000\u0000\u0000\u01a3\u01a5"+
+    "\u00036\u0019\u0000\u01a4\u01a3\u0001\u0000\u0000\u0000\u01a5\u01a6\u0001"+
+    "\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a6\u01a7\u0001"+
+    "\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000\u01a8\u01ac\u0003"+
+    "R\'\u0000\u01a9\u01ab\u00036\u0019\u0000\u01aa\u01a9\u0001\u0000\u0000"+
+    "\u0000\u01ab\u01ae\u0001\u0000\u0000\u0000\u01ac\u01aa\u0001\u0000\u0000"+
+    "\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000\u01ad\u01ce\u0001\u0000\u0000"+
+    "\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01af\u01b1\u0003R\'\u0000"+
+    "\u01b0\u01b2\u00036\u0019\u0000\u01b1\u01b0\u0001\u0000\u0000\u0000\u01b2"+
+    "\u01b3\u0001\u0000\u0000\u0000\u01b3\u01b1\u0001\u0000\u0000\u0000\u01b3"+
+    "\u01b4\u0001\u0000\u0000\u0000\u01b4\u01ce\u0001\u0000\u0000\u0000\u01b5"+
+    "\u01b7\u00036\u0019\u0000\u01b6\u01b5\u0001\u0000\u0000\u0000\u01b7\u01b8"+
+    "\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b9"+
+    "\u0001\u0000\u0000\u0000\u01b9\u01c1\u0001\u0000\u0000\u0000\u01ba\u01be"+
+    "\u0003R\'\u0000\u01bb\u01bd\u00036\u0019\u0000\u01bc\u01bb\u0001\u0000"+
+    "\u0000\u0000\u01bd\u01c0\u0001\u0000\u0000\u0000\u01be\u01bc\u0001\u0000"+
+    "\u0000\u0000\u01be\u01bf\u0001\u0000\u0000\u0000\u01bf\u01c2\u0001\u0000"+
+    "\u0000\u0000\u01c0\u01be\u0001\u0000\u0000\u0000\u01c1\u01ba\u0001\u0000"+
+    "\u0000\u0000\u01c1\u01c2\u0001\u0000\u0000\u0000\u01c2\u01c3\u0001\u0000"+
+    "\u0000\u0000\u01c3\u01c4\u0003>\u001d\u0000\u01c4\u01ce\u0001\u0000\u0000"+
+    "\u0000\u01c5\u01c7\u0003R\'\u0000\u01c6\u01c8\u00036\u0019\u0000\u01c7"+
+    "\u01c6\u0001\u0000\u0000\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9"+
+    "\u01c7\u0001\u0000\u0000\u0000\u01c9\u01ca\u0001\u0000\u0000\u0000\u01ca"+
+    "\u01cb\u0001\u0000\u0000\u0000\u01cb\u01cc\u0003>\u001d\u0000\u01cc\u01ce"+
+    "\u0001\u0000\u0000\u0000\u01cd\u01a4\u0001\u0000\u0000\u0000\u01cd\u01af"+
+    "\u0001\u0000\u0000\u0000\u01cd\u01b6\u0001\u0000\u0000\u0000\u01cd\u01c5"+
+    "\u0001\u0000\u0000\u0000\u01ceE\u0001\u0000\u0000\u0000\u01cf\u01d0\u0005"+
+    "b\u0000\u0000\u01d0\u01d1\u0005y\u0000\u0000\u01d1G\u0001\u0000\u0000"+
+    "\u0000\u01d2\u01d3\u0005a\u0000\u0000\u01d3\u01d4\u0005n\u0000\u0000\u01d4"+
+    "\u01d5\u0005d\u0000\u0000\u01d5I\u0001\u0000\u0000\u0000\u01d6\u01d7\u0005"+
+    "a\u0000\u0000\u01d7\u01d8\u0005s\u0000\u0000\u01d8\u01d9\u0005c\u0000"+
+    "\u0000\u01d9K\u0001\u0000\u0000\u0000\u01da\u01db\u0005=\u0000\u0000\u01db"+
+    "M\u0001\u0000\u0000\u0000\u01dc\u01dd\u0005,\u0000\u0000\u01ddO\u0001"+
+    "\u0000\u0000\u0000\u01de\u01df\u0005d\u0000\u0000\u01df\u01e0\u0005e\u0000"+
+    "\u0000\u01e0\u01e1\u0005s\u0000\u0000\u01e1\u01e2\u0005c\u0000\u0000\u01e2"+
+    "Q\u0001\u0000\u0000\u0000\u01e3\u01e4\u0005.\u0000\u0000\u01e4S\u0001"+
+    "\u0000\u0000\u0000\u01e5\u01e6\u0005f\u0000\u0000\u01e6\u01e7\u0005a\u0000"+
+    "\u0000\u01e7\u01e8\u0005l\u0000\u0000\u01e8\u01e9\u0005s\u0000\u0000\u01e9"+
+    "\u01ea\u0005e\u0000\u0000\u01eaU\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005"+
+    "f\u0000\u0000\u01ec\u01ed\u0005i\u0000\u0000\u01ed\u01ee\u0005r\u0000"+
+    "\u0000\u01ee\u01ef\u0005s\u0000\u0000\u01ef\u01f0\u0005t\u0000\u0000\u01f0"+
+    "W\u0001\u0000\u0000\u0000\u01f1\u01f2\u0005l\u0000\u0000\u01f2\u01f3\u0005"+
+    "a\u0000\u0000\u01f3\u01f4\u0005s\u0000\u0000\u01f4\u01f5\u0005t\u0000"+
+    "\u0000\u01f5Y\u0001\u0000\u0000\u0000\u01f6\u01f7\u0005(\u0000\u0000\u01f7"+
+    "[\u0001\u0000\u0000\u0000\u01f8\u01f9\u0005l\u0000\u0000\u01f9\u01fa\u0005"+
+    "i\u0000\u0000\u01fa\u01fb\u0005k\u0000\u0000\u01fb\u01fc\u0005e\u0000"+
+    "\u0000\u01fc]\u0001\u0000\u0000\u0000\u01fd\u01fe\u0005n\u0000\u0000\u01fe"+
+    "\u01ff\u0005o\u0000\u0000\u01ff\u0200\u0005t\u0000\u0000\u0200_\u0001"+
+    "\u0000\u0000\u0000\u0201\u0202\u0005n\u0000\u0000\u0202\u0203\u0005u\u0000"+
+    "\u0000\u0203\u0204\u0005l\u0000\u0000\u0204\u0205\u0005l\u0000\u0000\u0205"+
+    "a\u0001\u0000\u0000\u0000\u0206\u0207\u0005n\u0000\u0000\u0207\u0208\u0005"+
+    "u\u0000\u0000\u0208\u0209\u0005l\u0000\u0000\u0209\u020a\u0005l\u0000"+
+    "\u0000\u020a\u020b\u0005s\u0000\u0000\u020bc\u0001\u0000\u0000\u0000\u020c"+
+    "\u020d\u0005o\u0000\u0000\u020d\u020e\u0005r\u0000\u0000\u020ee\u0001"+
+    "\u0000\u0000\u0000\u020f\u0210\u0005r\u0000\u0000\u0210\u0211\u0005l\u0000"+
+    "\u0000\u0211\u0212\u0005i\u0000\u0000\u0212\u0213\u0005k\u0000\u0000\u0213"+
+    "\u0214\u0005e\u0000\u0000\u0214g\u0001\u0000\u0000\u0000\u0215\u0216\u0005"+
+    ")\u0000\u0000\u0216i\u0001\u0000\u0000\u0000\u0217\u0218\u0005t\u0000"+
+    "\u0000\u0218\u0219\u0005r\u0000\u0000\u0219\u021a\u0005u\u0000\u0000\u021a"+
+    "\u021b\u0005e\u0000\u0000\u021bk\u0001\u0000\u0000\u0000\u021c\u021d\u0005"+
+    "i\u0000\u0000\u021d\u021e\u0005n\u0000\u0000\u021e\u021f\u0005f\u0000"+
+    "\u0000\u021f\u0220\u0005o\u0000\u0000\u0220m\u0001\u0000\u0000\u0000\u0221"+
+    "\u0222\u0005f\u0000\u0000\u0222\u0223\u0005u\u0000\u0000\u0223\u0224\u0005"+
+    "n\u0000\u0000\u0224\u0225\u0005c\u0000\u0000\u0225\u0226\u0005t\u0000"+
+    "\u0000\u0226\u0227\u0005i\u0000\u0000\u0227\u0228\u0005o\u0000\u0000\u0228"+
+    "\u0229\u0005n\u0000\u0000\u0229\u022a\u0005s\u0000\u0000\u022ao\u0001"+
+    "\u0000\u0000\u0000\u022b\u022c\u0005=\u0000\u0000\u022c\u022d\u0005=\u0000"+
+    "\u0000\u022dq\u0001\u0000\u0000\u0000\u022e\u022f\u0005!\u0000\u0000\u022f"+
+    "\u0230\u0005=\u0000\u0000\u0230s\u0001\u0000\u0000\u0000\u0231\u0232\u0005"+
+    "<\u0000\u0000\u0232u\u0001\u0000\u0000\u0000\u0233\u0234\u0005<\u0000"+
+    "\u0000\u0234\u0235\u0005=\u0000\u0000\u0235w\u0001\u0000\u0000\u0000\u0236"+
+    "\u0237\u0005>\u0000\u0000\u0237y\u0001\u0000\u0000\u0000\u0238\u0239\u0005"+
+    ">\u0000\u0000\u0239\u023a\u0005=\u0000\u0000\u023a{\u0001\u0000\u0000"+
+    "\u0000\u023b\u023c\u0005+\u0000\u0000\u023c}\u0001\u0000\u0000\u0000\u023d"+
+    "\u023e\u0005-\u0000\u0000\u023e\u007f\u0001\u0000\u0000\u0000\u023f\u0240"+
+    "\u0005*\u0000\u0000\u0240\u0081\u0001\u0000\u0000\u0000\u0241\u0242\u0005"+
+    "/\u0000\u0000\u0242\u0083\u0001\u0000\u0000\u0000\u0243\u0244\u0005%\u0000"+
+    "\u0000\u0244\u0085\u0001\u0000\u0000\u0000\u0245\u0246\u0005[\u0000\u0000"+
+    "\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0248\u0006A\u0000\u0000\u0248"+
+    "\u0249\u0006A\u0000\u0000\u0249\u0087\u0001\u0000\u0000\u0000\u024a\u024b"+
+    "\u0005]\u0000\u0000\u024b\u024c\u0001\u0000\u0000\u0000\u024c\u024d\u0006"+
+    "B\u0007\u0000\u024d\u024e\u0006B\u0007\u0000\u024e\u0089\u0001\u0000\u0000"+
+    "\u0000\u024f\u0255\u00038\u001a\u0000\u0250\u0254\u00038\u001a\u0000\u0251"+
+    "\u0254\u00036\u0019\u0000\u0252\u0254\u0005_\u0000\u0000\u0253\u0250\u0001"+
+    "\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253\u0252\u0001"+
+    "\u0000\u0000\u0000\u0254\u0257\u0001\u0000\u0000\u0000\u0255\u0253\u0001"+
+    "\u0000\u0000\u0000\u0255\u0256\u0001\u0000\u0000\u0000\u0256\u0261\u0001"+
+    "\u0000\u0000\u0000\u0257\u0255\u0001\u0000\u0000\u0000\u0258\u025c\u0007"+
+    "\t\u0000\u0000\u0259\u025d\u00038\u001a\u0000\u025a\u025d\u00036\u0019"+
+    "\u0000\u025b\u025d\u0005_\u0000\u0000\u025c\u0259\u0001\u0000\u0000\u0000"+
+    "\u025c\u025a\u0001\u0000\u0000\u0000\u025c\u025b\u0001\u0000\u0000\u0000"+
+    "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025c\u0001\u0000\u0000\u0000"+
+    "\u025e\u025f\u0001\u0000\u0000\u0000\u025f\u0261\u0001\u0000\u0000\u0000"+
+    "\u0260\u024f\u0001\u0000\u0000\u0000\u0260\u0258\u0001\u0000\u0000\u0000"+
+    "\u0261\u008b\u0001\u0000\u0000\u0000\u0262\u0268\u0005`\u0000\u0000\u0263"+
+    "\u0267\b\n\u0000\u0000\u0264\u0265\u0005`\u0000\u0000\u0265\u0267\u0005"+
+    "`\u0000\u0000\u0266\u0263\u0001\u0000\u0000\u0000\u0266\u0264\u0001\u0000"+
+    "\u0000\u0000\u0267\u026a\u0001\u0000\u0000\u0000\u0268\u0266\u0001\u0000"+
+    "\u0000\u0000\u0268\u0269\u0001\u0000\u0000\u0000\u0269\u026b\u0001\u0000"+
+    "\u0000\u0000\u026a\u0268\u0001\u0000\u0000\u0000\u026b\u026c\u0005`\u0000"+
+    "\u0000\u026c\u008d\u0001\u0000\u0000\u0000\u026d\u026e\u0003$\u0010\u0000"+
+    "\u026e\u026f\u0001\u0000\u0000\u0000\u026f\u0270\u0006E\u0003\u0000\u0270"+
+    "\u008f\u0001\u0000\u0000\u0000\u0271\u0272\u0003&\u0011\u0000\u0272\u0273"+
+    "\u0001\u0000\u0000\u0000\u0273\u0274\u0006F\u0003\u0000\u0274\u0091\u0001"+
+    "\u0000\u0000\u0000\u0275\u0276\u0003(\u0012\u0000\u0276\u0277\u0001\u0000"+
+    "\u0000\u0000\u0277\u0278\u0006G\u0003\u0000\u0278\u0093\u0001\u0000\u0000"+
+    "\u0000\u0279\u027a\u0005|\u0000\u0000\u027a\u027b\u0001\u0000\u0000\u0000"+
+    "\u027b\u027c\u0006H\u0006\u0000\u027c\u027d\u0006H\u0007\u0000\u027d\u0095"+
+    "\u0001\u0000\u0000\u0000\u027e\u027f\u0005]\u0000\u0000\u027f\u0280\u0001"+
+    "\u0000\u0000\u0000\u0280\u0281\u0006I\u0007\u0000\u0281\u0282\u0006I\u0007"+
+    "\u0000\u0282\u0283\u0006I\b\u0000\u0283\u0097\u0001\u0000\u0000\u0000"+
+    "\u0284\u0285\u0005,\u0000\u0000\u0285\u0286\u0001\u0000\u0000\u0000\u0286"+
+    "\u0287\u0006J\t\u0000\u0287\u0099\u0001\u0000\u0000\u0000\u0288\u0289"+
+    "\u0005=\u0000\u0000\u0289\u028a\u0001\u0000\u0000\u0000\u028a\u028b\u0006"+
+    "K\n\u0000\u028b\u009b\u0001\u0000\u0000\u0000\u028c\u028e\u0003\u009e"+
+    "M\u0000\u028d\u028c\u0001\u0000\u0000\u0000\u028e\u028f\u0001\u0000\u0000"+
+    "\u0000\u028f\u028d\u0001\u0000\u0000\u0000\u028f\u0290\u0001\u0000\u0000"+
+    "\u0000\u0290\u009d\u0001\u0000\u0000\u0000\u0291\u0293\b\u000b\u0000\u0000"+
+    "\u0292\u0291\u0001\u0000\u0000\u0000\u0293\u0294\u0001\u0000\u0000\u0000"+
+    "\u0294\u0292\u0001\u0000\u0000\u0000\u0294\u0295\u0001\u0000\u0000\u0000"+
+    "\u0295\u0299\u0001\u0000\u0000\u0000\u0296\u0297\u0005/\u0000\u0000\u0297"+
+    "\u0299\b\f\u0000\u0000\u0298\u0292\u0001\u0000\u0000\u0000\u0298\u0296"+
+    "\u0001\u0000\u0000\u0000\u0299\u009f\u0001\u0000\u0000\u0000\u029a\u029b"+
+    "\u0003\u008cD\u0000\u029b\u00a1\u0001\u0000\u0000\u0000\u029c\u029d\u0003"+
+    "$\u0010\u0000\u029d\u029e\u0001\u0000\u0000\u0000\u029e\u029f\u0006O\u0003"+
+    "\u0000\u029f\u00a3\u0001\u0000\u0000\u0000\u02a0\u02a1\u0003&\u0011\u0000"+
+    "\u02a1\u02a2\u0001\u0000\u0000\u0000\u02a2\u02a3\u0006P\u0003\u0000\u02a3"+
+    "\u00a5\u0001\u0000\u0000\u0000\u02a4\u02a5\u0003(\u0012\u0000\u02a5\u02a6"+
+    "\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006Q\u0003\u0000\u02a7\u00a7\u0001"+
+    "\u0000\u0000\u0000&\u0000\u0001\u0002\u0003\u0128\u0132\u0136\u0139\u0142"+
+    "\u0144\u014f\u0178\u017d\u0182\u0184\u018f\u0197\u019a\u019c\u01a1\u01a6"+
+    "\u01ac\u01b3\u01b8\u01be\u01c1\u01c9\u01cd\u0253\u0255\u025c\u025e\u0260"+
+    "\u0266\u0268\u028f\u0294\u0298\u000b\u0005\u0002\u0000\u0005\u0001\u0000"+
+    "\u0005\u0003\u0000\u0000\u0001\u0000\u0007;\u0000\u0005\u0000\u0000\u0007"+
+    "\u0017\u0000\u0004\u0000\u0000\u0007<\u0000\u0007\u001f\u0000\u0007\u001e"+
     "\u0000";
   public static final ATN _ATN =
     new ATNDeserializer().deserialize(_serializedATN.toCharArray());

File diff suppressed because it is too large
+ 13 - 4
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp


File diff suppressed because it is too large
+ 243 - 153
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java


+ 48 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java

@@ -456,6 +456,42 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener {
    * <p>The default implementation does nothing.</p>
    */
   @Override public void exitStringLiteral(EsqlBaseParser.StringLiteralContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void enterNumericArrayLiteral(EsqlBaseParser.NumericArrayLiteralContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void exitNumericArrayLiteral(EsqlBaseParser.NumericArrayLiteralContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void enterBooleanArrayLiteral(EsqlBaseParser.BooleanArrayLiteralContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void exitBooleanArrayLiteral(EsqlBaseParser.BooleanArrayLiteralContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void enterStringArrayLiteral(EsqlBaseParser.StringArrayLiteralContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void exitStringArrayLiteral(EsqlBaseParser.StringArrayLiteralContext ctx) { }
   /**
    * {@inheritDoc}
    *
@@ -600,6 +636,18 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener {
    * <p>The default implementation does nothing.</p>
    */
   @Override public void exitBooleanValue(EsqlBaseParser.BooleanValueContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void enterNumericValue(EsqlBaseParser.NumericValueContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void exitNumericValue(EsqlBaseParser.NumericValueContext ctx) { }
   /**
    * {@inheritDoc}
    *

+ 28 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java

@@ -271,6 +271,27 @@ public class EsqlBaseParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> im
    * {@link #visitChildren} on {@code ctx}.</p>
    */
   @Override public T visitStringLiteral(EsqlBaseParser.StringLiteralContext ctx) { return visitChildren(ctx); }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation returns the result of calling
+   * {@link #visitChildren} on {@code ctx}.</p>
+   */
+  @Override public T visitNumericArrayLiteral(EsqlBaseParser.NumericArrayLiteralContext ctx) { return visitChildren(ctx); }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation returns the result of calling
+   * {@link #visitChildren} on {@code ctx}.</p>
+   */
+  @Override public T visitBooleanArrayLiteral(EsqlBaseParser.BooleanArrayLiteralContext ctx) { return visitChildren(ctx); }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation returns the result of calling
+   * {@link #visitChildren} on {@code ctx}.</p>
+   */
+  @Override public T visitStringArrayLiteral(EsqlBaseParser.StringArrayLiteralContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
@@ -355,6 +376,13 @@ public class EsqlBaseParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> im
    * {@link #visitChildren} on {@code ctx}.</p>
    */
   @Override public T visitBooleanValue(EsqlBaseParser.BooleanValueContext ctx) { return visitChildren(ctx); }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation returns the result of calling
+   * {@link #visitChildren} on {@code ctx}.</p>
+   */
+  @Override public T visitNumericValue(EsqlBaseParser.NumericValueContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *

+ 46 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java

@@ -419,6 +419,42 @@ public interface EsqlBaseParserListener extends ParseTreeListener {
    * @param ctx the parse tree
    */
   void exitStringLiteral(EsqlBaseParser.StringLiteralContext ctx);
+  /**
+   * Enter a parse tree produced by the {@code numericArrayLiteral}
+   * labeled alternative in {@link EsqlBaseParser#constant}.
+   * @param ctx the parse tree
+   */
+  void enterNumericArrayLiteral(EsqlBaseParser.NumericArrayLiteralContext ctx);
+  /**
+   * Exit a parse tree produced by the {@code numericArrayLiteral}
+   * labeled alternative in {@link EsqlBaseParser#constant}.
+   * @param ctx the parse tree
+   */
+  void exitNumericArrayLiteral(EsqlBaseParser.NumericArrayLiteralContext ctx);
+  /**
+   * Enter a parse tree produced by the {@code booleanArrayLiteral}
+   * labeled alternative in {@link EsqlBaseParser#constant}.
+   * @param ctx the parse tree
+   */
+  void enterBooleanArrayLiteral(EsqlBaseParser.BooleanArrayLiteralContext ctx);
+  /**
+   * Exit a parse tree produced by the {@code booleanArrayLiteral}
+   * labeled alternative in {@link EsqlBaseParser#constant}.
+   * @param ctx the parse tree
+   */
+  void exitBooleanArrayLiteral(EsqlBaseParser.BooleanArrayLiteralContext ctx);
+  /**
+   * Enter a parse tree produced by the {@code stringArrayLiteral}
+   * labeled alternative in {@link EsqlBaseParser#constant}.
+   * @param ctx the parse tree
+   */
+  void enterStringArrayLiteral(EsqlBaseParser.StringArrayLiteralContext ctx);
+  /**
+   * Exit a parse tree produced by the {@code stringArrayLiteral}
+   * labeled alternative in {@link EsqlBaseParser#constant}.
+   * @param ctx the parse tree
+   */
+  void exitStringArrayLiteral(EsqlBaseParser.StringArrayLiteralContext ctx);
   /**
    * Enter a parse tree produced by {@link EsqlBaseParser#limitCommand}.
    * @param ctx the parse tree
@@ -539,6 +575,16 @@ public interface EsqlBaseParserListener extends ParseTreeListener {
    * @param ctx the parse tree
    */
   void exitBooleanValue(EsqlBaseParser.BooleanValueContext ctx);
+  /**
+   * Enter a parse tree produced by {@link EsqlBaseParser#numericValue}.
+   * @param ctx the parse tree
+   */
+  void enterNumericValue(EsqlBaseParser.NumericValueContext ctx);
+  /**
+   * Exit a parse tree produced by {@link EsqlBaseParser#numericValue}.
+   * @param ctx the parse tree
+   */
+  void exitNumericValue(EsqlBaseParser.NumericValueContext ctx);
   /**
    * Enter a parse tree produced by {@link EsqlBaseParser#decimalValue}.
    * @param ctx the parse tree

+ 27 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java

@@ -253,6 +253,27 @@ public interface EsqlBaseParserVisitor<T> extends ParseTreeVisitor<T> {
    * @return the visitor result
    */
   T visitStringLiteral(EsqlBaseParser.StringLiteralContext ctx);
+  /**
+   * Visit a parse tree produced by the {@code numericArrayLiteral}
+   * labeled alternative in {@link EsqlBaseParser#constant}.
+   * @param ctx the parse tree
+   * @return the visitor result
+   */
+  T visitNumericArrayLiteral(EsqlBaseParser.NumericArrayLiteralContext ctx);
+  /**
+   * Visit a parse tree produced by the {@code booleanArrayLiteral}
+   * labeled alternative in {@link EsqlBaseParser#constant}.
+   * @param ctx the parse tree
+   * @return the visitor result
+   */
+  T visitBooleanArrayLiteral(EsqlBaseParser.BooleanArrayLiteralContext ctx);
+  /**
+   * Visit a parse tree produced by the {@code stringArrayLiteral}
+   * labeled alternative in {@link EsqlBaseParser#constant}.
+   * @param ctx the parse tree
+   * @return the visitor result
+   */
+  T visitStringArrayLiteral(EsqlBaseParser.StringArrayLiteralContext ctx);
   /**
    * Visit a parse tree produced by {@link EsqlBaseParser#limitCommand}.
    * @param ctx the parse tree
@@ -325,6 +346,12 @@ public interface EsqlBaseParserVisitor<T> extends ParseTreeVisitor<T> {
    * @return the visitor result
    */
   T visitBooleanValue(EsqlBaseParser.BooleanValueContext ctx);
+  /**
+   * Visit a parse tree produced by {@link EsqlBaseParser#numericValue}.
+   * @param ctx the parse tree
+   * @return the visitor result
+   */
+  T visitNumericValue(EsqlBaseParser.NumericValueContext ctx);
   /**
    * Visit a parse tree produced by {@link EsqlBaseParser#decimalValue}.
    * @param ctx the parse tree

+ 34 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java

@@ -51,6 +51,7 @@ import java.time.Period;
 import java.time.ZoneId;
 import java.util.List;
 import java.util.Locale;
+import java.util.function.Function;
 
 import static java.util.Collections.emptyList;
 import static org.elasticsearch.xpack.esql.type.EsqlDataTypes.DATE_PERIOD;
@@ -115,6 +116,39 @@ abstract class ExpressionBuilder extends IdentifierBuilder {
         return new Literal(source, val, type);
     }
 
+    @Override
+    public Object visitNumericArrayLiteral(EsqlBaseParser.NumericArrayLiteralContext ctx) {
+        Source source = source(ctx);
+        List<Literal> numbers = visitList(this, ctx.numericValue(), Literal.class);
+        if (numbers.stream().anyMatch(l -> l.dataType() == DataTypes.DOUBLE)) {
+            return new Literal(source, mapNumbers(numbers, Number::doubleValue), DataTypes.DOUBLE);
+        }
+        if (numbers.stream().anyMatch(l -> l.dataType() == DataTypes.LONG)) {
+            return new Literal(source, mapNumbers(numbers, Number::longValue), DataTypes.LONG);
+        }
+        return new Literal(source, mapNumbers(numbers, Number::intValue), DataTypes.INTEGER);
+    }
+
+    private List<Object> mapNumbers(List<Literal> numbers, Function<Number, Object> map) {
+        return numbers.stream().map(l -> map.apply((Number) l.value())).toList();
+    }
+
+    @Override
+    public Object visitBooleanArrayLiteral(EsqlBaseParser.BooleanArrayLiteralContext ctx) {
+        return visitArrayLiteral(ctx, ctx.booleanValue(), DataTypes.BOOLEAN);
+    }
+
+    @Override
+    public Object visitStringArrayLiteral(EsqlBaseParser.StringArrayLiteralContext ctx) {
+        return visitArrayLiteral(ctx, ctx.string(), DataTypes.KEYWORD);
+    }
+
+    private Object visitArrayLiteral(ParserRuleContext ctx, List<? extends ParserRuleContext> contexts, DataType dataType) {
+        Source source = source(ctx);
+        List<Literal> literals = visitList(this, contexts, Literal.class);
+        return new Literal(source, literals.stream().map(Literal::value).toList(), dataType);
+    }
+
     @Override
     public Literal visitNullLiteral(EsqlBaseParser.NullLiteralContext ctx) {
         Source source = source(ctx);

+ 108 - 2
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java

@@ -38,14 +38,16 @@ import org.elasticsearch.xpack.ql.plan.logical.LogicalPlan;
 import org.elasticsearch.xpack.ql.plan.logical.OrderBy;
 import org.elasticsearch.xpack.ql.plan.logical.UnresolvedRelation;
 import org.elasticsearch.xpack.ql.type.DataType;
+import org.elasticsearch.xpack.ql.type.DataTypes;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import static org.elasticsearch.xpack.ql.expression.Literal.FALSE;
 import static org.elasticsearch.xpack.ql.expression.Literal.TRUE;
 import static org.elasticsearch.xpack.ql.expression.function.FunctionResolutionStrategy.DEFAULT;
 import static org.elasticsearch.xpack.ql.tree.Source.EMPTY;
-import static org.elasticsearch.xpack.ql.type.DataTypes.INTEGER;
 import static org.elasticsearch.xpack.ql.type.DataTypes.KEYWORD;
 import static org.hamcrest.Matchers.allOf;
 import static org.hamcrest.Matchers.containsString;
@@ -75,6 +77,70 @@ public class StatementParserTests extends ESTestCase {
         );
     }
 
+    public void testRowCommandLong() {
+        assertEquals(new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalLong(2147483648L)))), statement("row c = 2147483648"));
+    }
+
+    public void testRowCommandHugeInt() {
+        assertEquals(
+            new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalDouble(9223372036854775808.0)))),
+            statement("row c = 9223372036854775808")
+        );
+    }
+
+    public void testRowCommandDouble() {
+        assertEquals(new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalDouble(1.0)))), statement("row c = 1.0"));
+    }
+
+    public void testRowCommandMultivalueInt() {
+        assertEquals(new Row(EMPTY, List.of(new Alias(EMPTY, "c", integers(1, 2)))), statement("row c = [1, 2]"));
+    }
+
+    public void testRowCommandMultivalueLong() {
+        assertEquals(
+            new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalLongs(2147483648L, 2147483649L)))),
+            statement("row c = [2147483648, 2147483649]")
+        );
+    }
+
+    public void testRowCommandMultivalueLongAndInt() {
+        assertEquals(new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalLongs(2147483648L, 1L)))), statement("row c = [2147483648, 1]"));
+    }
+
+    public void testRowCommandMultivalueHugeInts() {
+        assertEquals(
+            new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalDoubles(9223372036854775808.0, 9223372036854775809.0)))),
+            statement("row c = [9223372036854775808, 9223372036854775809]")
+        );
+    }
+
+    public void testRowCommandMultivalueHugeIntAndNormalInt() {
+        assertEquals(
+            new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalDoubles(9223372036854775808.0, 1.0)))),
+            statement("row c = [9223372036854775808, 1]")
+        );
+    }
+
+    public void testRowCommandMultivalueDouble() {
+        assertEquals(new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalDoubles(1.0, 2.0)))), statement("row c = [1.0, 2.0]"));
+    }
+
+    public void testRowCommandBoolean() {
+        assertEquals(new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalBoolean(false)))), statement("row c = false"));
+    }
+
+    public void testRowCommandMultivalueBoolean() {
+        assertEquals(new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalBooleans(false, true)))), statement("row c = [false, true]"));
+    }
+
+    public void testRowCommandString() {
+        assertEquals(new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalString("chicken")))), statement("row c = \"chicken\""));
+    }
+
+    public void testRowCommandMultivalueString() {
+        assertEquals(new Row(EMPTY, List.of(new Alias(EMPTY, "c", literalStrings("cat", "dog")))), statement("row c = [\"cat\", \"dog\"]"));
+    }
+
     public void testRowCommandWithEscapedFieldName() {
         assertEquals(
             new Row(
@@ -554,7 +620,47 @@ public class StatementParserTests extends ESTestCase {
     }
 
     private static Literal integer(int i) {
-        return new Literal(EMPTY, i, INTEGER);
+        return new Literal(EMPTY, i, DataTypes.INTEGER);
+    }
+
+    private static Literal integers(int... ints) {
+        return new Literal(EMPTY, Arrays.stream(ints).boxed().toList(), DataTypes.INTEGER);
+    }
+
+    private static Literal literalLong(long i) {
+        return new Literal(EMPTY, i, DataTypes.LONG);
+    }
+
+    private static Literal literalLongs(long... longs) {
+        return new Literal(EMPTY, Arrays.stream(longs).boxed().toList(), DataTypes.LONG);
+    }
+
+    private static Literal literalDouble(double d) {
+        return new Literal(EMPTY, d, DataTypes.DOUBLE);
+    }
+
+    private static Literal literalDoubles(double... doubles) {
+        return new Literal(EMPTY, Arrays.stream(doubles).boxed().toList(), DataTypes.DOUBLE);
+    }
+
+    private static Literal literalBoolean(boolean b) {
+        return new Literal(EMPTY, b, DataTypes.BOOLEAN);
+    }
+
+    private static Literal literalBooleans(boolean... booleans) {
+        List<Boolean> v = new ArrayList<>(booleans.length);
+        for (boolean b : booleans) {
+            v.add(b);
+        }
+        return new Literal(EMPTY, v, DataTypes.BOOLEAN);
+    }
+
+    private static Literal literalString(String s) {
+        return new Literal(EMPTY, s, DataTypes.KEYWORD);
+    }
+
+    private static Literal literalStrings(String... strings) {
+        return new Literal(EMPTY, Arrays.asList(strings), DataTypes.KEYWORD);
     }
 
     private void expectError(String query, String errorMessage) {

Some files were not shown because too many files changed in this diff