SQL: Allow whitespaces in escape patterns (#47577)

Previously, we supported only the format `{fn <FUNCTION_NAME>()}`
but other DBs like MSSQL, DB2, MariaDB/MySQL alos allow whitespaces
between `{` and `fn`. Furhermore, also some applications - like PowerBI -
generate escape sequences with spaces: `select { fn name(params) } etc.`

Add support for white spaces between `{` and the escape pattern definition
like `fn`, `ts`, `d`, `guid` etc.

Closes: #47401

(cherry picked from commit 08a22d0b393f4a76c52dabc5e7b9cafcc19c30ca)
This commit is contained in:
Marios Trivyzas 2019-10-07 14:37:20 +02:00
parent b6d1d2e6ec
commit e698e68f06
6 changed files with 638 additions and 618 deletions

View File

@ -217,7 +217,7 @@ pattern
patternEscape
: ESCAPE escape=string
| ESCAPE_ESC escape=string '}'
| ESCAPE_ESC escape=string ESC_END
;
valueExpression
@ -274,7 +274,7 @@ extractTemplate
functionExpression
: functionTemplate
| FUNCTION_ESC functionTemplate '}'
| FUNCTION_ESC functionTemplate ESC_END
;
functionTemplate
@ -480,15 +480,16 @@ YEAR: 'YEAR';
YEARS: 'YEARS';
// Escaped Sequence
ESCAPE_ESC: '{ESCAPE';
FUNCTION_ESC: '{FN';
LIMIT_ESC:'{LIMIT';
DATE_ESC: '{D';
TIME_ESC: '{T';
TIMESTAMP_ESC: '{TS';
ESCAPE_ESC: ESC_START 'ESCAPE';
FUNCTION_ESC: ESC_START 'FN';
LIMIT_ESC: ESC_START 'LIMIT';
DATE_ESC: ESC_START 'D';
TIME_ESC: ESC_START 'T';
TIMESTAMP_ESC: ESC_START 'TS';
// mapped to string literal
GUID_ESC: '{GUID';
GUID_ESC: ESC_START 'GUID';
ESC_START: '{' (WS)*;
ESC_END: '}';
// Operators

View File

@ -106,36 +106,37 @@ DATE_ESC=105
TIME_ESC=106
TIMESTAMP_ESC=107
GUID_ESC=108
ESC_END=109
EQ=110
NULLEQ=111
NEQ=112
LT=113
LTE=114
GT=115
GTE=116
PLUS=117
MINUS=118
ASTERISK=119
SLASH=120
PERCENT=121
CAST_OP=122
CONCAT=123
DOT=124
PARAM=125
STRING=126
INTEGER_VALUE=127
DECIMAL_VALUE=128
IDENTIFIER=129
DIGIT_IDENTIFIER=130
TABLE_IDENTIFIER=131
QUOTED_IDENTIFIER=132
BACKQUOTED_IDENTIFIER=133
SIMPLE_COMMENT=134
BRACKETED_COMMENT=135
WS=136
UNRECOGNIZED=137
DELIMITER=138
ESC_START=109
ESC_END=110
EQ=111
NULLEQ=112
NEQ=113
LT=114
LTE=115
GT=116
GTE=117
PLUS=118
MINUS=119
ASTERISK=120
SLASH=121
PERCENT=122
CAST_OP=123
CONCAT=124
DOT=125
PARAM=126
STRING=127
INTEGER_VALUE=128
DECIMAL_VALUE=129
IDENTIFIER=130
DIGIT_IDENTIFIER=131
TABLE_IDENTIFIER=132
QUOTED_IDENTIFIER=133
BACKQUOTED_IDENTIFIER=134
SIMPLE_COMMENT=135
BRACKETED_COMMENT=136
WS=137
UNRECOGNIZED=138
DELIMITER=139
'('=1
')'=2
','=3
@ -237,26 +238,19 @@ DELIMITER=138
'WITH'=99
'YEAR'=100
'YEARS'=101
'{ESCAPE'=102
'{FN'=103
'{LIMIT'=104
'{D'=105
'{T'=106
'{TS'=107
'{GUID'=108
'}'=109
'='=110
'<=>'=111
'<'=113
'<='=114
'>'=115
'>='=116
'+'=117
'-'=118
'*'=119
'/'=120
'%'=121
'::'=122
'||'=123
'.'=124
'?'=125
'}'=110
'='=111
'<=>'=112
'<'=114
'<='=115
'>'=116
'>='=117
'+'=118
'-'=119
'*'=120
'/'=121
'%'=122
'::'=123
'||'=124
'.'=125
'?'=126

View File

@ -106,35 +106,36 @@ DATE_ESC=105
TIME_ESC=106
TIMESTAMP_ESC=107
GUID_ESC=108
ESC_END=109
EQ=110
NULLEQ=111
NEQ=112
LT=113
LTE=114
GT=115
GTE=116
PLUS=117
MINUS=118
ASTERISK=119
SLASH=120
PERCENT=121
CAST_OP=122
CONCAT=123
DOT=124
PARAM=125
STRING=126
INTEGER_VALUE=127
DECIMAL_VALUE=128
IDENTIFIER=129
DIGIT_IDENTIFIER=130
TABLE_IDENTIFIER=131
QUOTED_IDENTIFIER=132
BACKQUOTED_IDENTIFIER=133
SIMPLE_COMMENT=134
BRACKETED_COMMENT=135
WS=136
UNRECOGNIZED=137
ESC_START=109
ESC_END=110
EQ=111
NULLEQ=112
NEQ=113
LT=114
LTE=115
GT=116
GTE=117
PLUS=118
MINUS=119
ASTERISK=120
SLASH=121
PERCENT=122
CAST_OP=123
CONCAT=124
DOT=125
PARAM=126
STRING=127
INTEGER_VALUE=128
DECIMAL_VALUE=129
IDENTIFIER=130
DIGIT_IDENTIFIER=131
TABLE_IDENTIFIER=132
QUOTED_IDENTIFIER=133
BACKQUOTED_IDENTIFIER=134
SIMPLE_COMMENT=135
BRACKETED_COMMENT=136
WS=137
UNRECOGNIZED=138
'('=1
')'=2
','=3
@ -236,26 +237,19 @@ UNRECOGNIZED=137
'WITH'=99
'YEAR'=100
'YEARS'=101
'{ESCAPE'=102
'{FN'=103
'{LIMIT'=104
'{D'=105
'{T'=106
'{TS'=107
'{GUID'=108
'}'=109
'='=110
'<=>'=111
'<'=113
'<='=114
'>'=115
'>='=116
'+'=117
'-'=118
'*'=119
'/'=120
'%'=121
'::'=122
'||'=123
'.'=124
'?'=125
'}'=110
'='=111
'<=>'=112
'<'=114
'<='=115
'>'=116
'>='=117
'+'=118
'-'=119
'*'=120
'/'=121
'%'=122
'::'=123
'||'=124
'.'=125
'?'=126

View File

@ -32,12 +32,12 @@ class SqlBaseLexer extends Lexer {
TABLES=88, TEXT=89, THEN=90, TRUE=91, TO=92, TYPE=93, TYPES=94, USING=95,
VERIFY=96, WHEN=97, WHERE=98, WITH=99, YEAR=100, YEARS=101, ESCAPE_ESC=102,
FUNCTION_ESC=103, LIMIT_ESC=104, DATE_ESC=105, TIME_ESC=106, TIMESTAMP_ESC=107,
GUID_ESC=108, ESC_END=109, EQ=110, NULLEQ=111, NEQ=112, LT=113, LTE=114,
GT=115, GTE=116, PLUS=117, MINUS=118, ASTERISK=119, SLASH=120, PERCENT=121,
CAST_OP=122, CONCAT=123, DOT=124, PARAM=125, STRING=126, INTEGER_VALUE=127,
DECIMAL_VALUE=128, IDENTIFIER=129, DIGIT_IDENTIFIER=130, TABLE_IDENTIFIER=131,
QUOTED_IDENTIFIER=132, BACKQUOTED_IDENTIFIER=133, SIMPLE_COMMENT=134,
BRACKETED_COMMENT=135, WS=136, UNRECOGNIZED=137;
GUID_ESC=108, ESC_START=109, ESC_END=110, EQ=111, NULLEQ=112, NEQ=113,
LT=114, LTE=115, GT=116, GTE=117, PLUS=118, MINUS=119, ASTERISK=120, SLASH=121,
PERCENT=122, CAST_OP=123, CONCAT=124, DOT=125, PARAM=126, STRING=127,
INTEGER_VALUE=128, DECIMAL_VALUE=129, IDENTIFIER=130, DIGIT_IDENTIFIER=131,
TABLE_IDENTIFIER=132, QUOTED_IDENTIFIER=133, BACKQUOTED_IDENTIFIER=134,
SIMPLE_COMMENT=135, BRACKETED_COMMENT=136, WS=137, UNRECOGNIZED=138;
public static String[] modeNames = {
"DEFAULT_MODE"
};
@ -57,12 +57,12 @@ class SqlBaseLexer extends Lexer {
"SYS", "TABLE", "TABLES", "TEXT", "THEN", "TRUE", "TO", "TYPE", "TYPES",
"USING", "VERIFY", "WHEN", "WHERE", "WITH", "YEAR", "YEARS", "ESCAPE_ESC",
"FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC",
"GUID_ESC", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE", "GT", "GTE",
"PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP", "CONCAT",
"DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER",
"DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER",
"EXPONENT", "DIGIT", "LETTER", "SIMPLE_COMMENT", "BRACKETED_COMMENT",
"WS", "UNRECOGNIZED"
"GUID_ESC", "ESC_START", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE",
"GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP",
"CONCAT", "DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE",
"IDENTIFIER", "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER",
"BACKQUOTED_IDENTIFIER", "EXPONENT", "DIGIT", "LETTER", "SIMPLE_COMMENT",
"BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
};
private static final String[] _LITERAL_NAMES = {
@ -81,9 +81,9 @@ class SqlBaseLexer extends Lexer {
"'QUERY'", "'SCHEMAS'", "'SECOND'", "'SECONDS'", "'SELECT'", "'SHOW'",
"'SYS'", "'TABLE'", "'TABLES'", "'TEXT'", "'THEN'", "'TRUE'", "'TO'",
"'TYPE'", "'TYPES'", "'USING'", "'VERIFY'", "'WHEN'", "'WHERE'", "'WITH'",
"'YEAR'", "'YEARS'", "'{ESCAPE'", "'{FN'", "'{LIMIT'", "'{D'", "'{T'",
"'{TS'", "'{GUID'", "'}'", "'='", "'<=>'", null, "'<'", "'<='", "'>'",
"'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'::'", "'||'", "'.'", "'?'"
"'YEAR'", "'YEARS'", null, null, null, null, null, null, null, null, "'}'",
"'='", "'<=>'", null, "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'",
"'/'", "'%'", "'::'", "'||'", "'.'", "'?'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
@ -100,11 +100,12 @@ class SqlBaseLexer extends Lexer {
"SYS", "TABLE", "TABLES", "TEXT", "THEN", "TRUE", "TO", "TYPE", "TYPES",
"USING", "VERIFY", "WHEN", "WHERE", "WITH", "YEAR", "YEARS", "ESCAPE_ESC",
"FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC",
"GUID_ESC", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE", "GT", "GTE",
"PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP", "CONCAT",
"DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER",
"DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER",
"SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
"GUID_ESC", "ESC_START", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE",
"GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP",
"CONCAT", "DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE",
"IDENTIFIER", "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER",
"BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS",
"UNRECOGNIZED"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -161,7 +162,7 @@ class SqlBaseLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\u008b\u047f\b\1\4"+
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\u008c\u0488\b\1\4"+
"\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+
"\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
@ -178,390 +179,395 @@ class SqlBaseLexer extends Lexer {
"\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084"+
"\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089"+
"\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+
"\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3"+
"\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n"+
"\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+
"\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3"+
"\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3"+
"\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3"+
"\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3"+
"\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+
"\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3"+
"\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+
"\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3"+
"\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3"+
"\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 \3 \3"+
" \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3"+
"\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3"+
"&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3"+
"*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3"+
"-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60"+
"\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\63\3\63"+
"\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65"+
"\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\67\3\67\3\67\3\67"+
"\3\67\38\38\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3"+
"<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3"+
"?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3"+
"B\3B\3B\3C\3C\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F\3F\3F\3G\3G\3"+
"G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3"+
"K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3N\3"+
"N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3T\3T\3U\3"+
"U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3"+
"Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3]\3]"+
"\3]\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a"+
"\3a\3a\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e"+
"\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3i\3i\3i\3i\3i"+
"\3i\3i\3j\3j\3j\3k\3k\3k\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3n\3n\3o\3o\3p"+
"\3p\3p\3p\3q\3q\3q\3q\5q\u03bd\nq\3r\3r\3s\3s\3s\3t\3t\3u\3u\3u\3v\3v"+
"\3w\3w\3x\3x\3y\3y\3z\3z\3{\3{\3{\3|\3|\3|\3}\3}\3~\3~\3\177\3\177\3\177"+
"\3\177\7\177\u03e1\n\177\f\177\16\177\u03e4\13\177\3\177\3\177\3\u0080"+
"\6\u0080\u03e9\n\u0080\r\u0080\16\u0080\u03ea\3\u0081\6\u0081\u03ee\n"+
"\u0081\r\u0081\16\u0081\u03ef\3\u0081\3\u0081\7\u0081\u03f4\n\u0081\f"+
"\u0081\16\u0081\u03f7\13\u0081\3\u0081\3\u0081\6\u0081\u03fb\n\u0081\r"+
"\u0081\16\u0081\u03fc\3\u0081\6\u0081\u0400\n\u0081\r\u0081\16\u0081\u0401"+
"\3\u0081\3\u0081\7\u0081\u0406\n\u0081\f\u0081\16\u0081\u0409\13\u0081"+
"\5\u0081\u040b\n\u0081\3\u0081\3\u0081\3\u0081\3\u0081\6\u0081\u0411\n"+
"\u0081\r\u0081\16\u0081\u0412\3\u0081\3\u0081\5\u0081\u0417\n\u0081\3"+
"\u0082\3\u0082\5\u0082\u041b\n\u0082\3\u0082\3\u0082\3\u0082\7\u0082\u0420"+
"\n\u0082\f\u0082\16\u0082\u0423\13\u0082\3\u0083\3\u0083\3\u0083\3\u0083"+
"\6\u0083\u0429\n\u0083\r\u0083\16\u0083\u042a\3\u0084\3\u0084\3\u0084"+
"\6\u0084\u0430\n\u0084\r\u0084\16\u0084\u0431\3\u0085\3\u0085\3\u0085"+
"\3\u0085\7\u0085\u0438\n\u0085\f\u0085\16\u0085\u043b\13\u0085\3\u0085"+
"\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086\7\u0086\u0443\n\u0086\f\u0086"+
"\16\u0086\u0446\13\u0086\3\u0086\3\u0086\3\u0087\3\u0087\5\u0087\u044c"+
"\n\u0087\3\u0087\6\u0087\u044f\n\u0087\r\u0087\16\u0087\u0450\3\u0088"+
"\3\u0088\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008a\7\u008a\u045b"+
"\n\u008a\f\u008a\16\u008a\u045e\13\u008a\3\u008a\5\u008a\u0461\n\u008a"+
"\3\u008a\5\u008a\u0464\n\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b"+
"\3\u008b\3\u008b\7\u008b\u046d\n\u008b\f\u008b\16\u008b\u0470\13\u008b"+
"\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008c\6\u008c\u0478\n\u008c"+
"\r\u008c\16\u008c\u0479\3\u008c\3\u008c\3\u008d\3\u008d\3\u046e\2\u008e"+
"\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20"+
"\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+
"= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o"+
"9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH"+
"\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+
"R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5"+
"\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9"+
"f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00dd"+
"p\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1"+
"z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff\u0081\u0101"+
"\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\u0086\u010b\u0087\u010d"+
"\2\u010f\2\u0111\2\u0113\u0088\u0115\u0089\u0117\u008a\u0119\u008b\3\2"+
"\13\3\2))\4\2BBaa\3\2$$\3\2bb\4\2--//\3\2\62;\3\2C\\\4\2\f\f\17\17\5\2"+
"\13\f\17\17\"\"\u049f\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2"+
"\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25"+
"\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2"+
"\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2"+
"\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3"+
"\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2"+
"\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2"+
"Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3"+
"\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2"+
"\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2"+
"w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2"+
"\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+
"\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2"+
"\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d"+
"\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2"+
"\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af"+
"\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2"+
"\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1"+
"\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2"+
"\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3"+
"\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2"+
"\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5"+
"\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2"+
"\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7"+
"\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2"+
"\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109"+
"\3\2\2\2\2\u010b\3\2\2\2\2\u0113\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2"+
"\2\2\u0119\3\2\2\2\3\u011b\3\2\2\2\5\u011d\3\2\2\2\7\u011f\3\2\2\2\t\u0121"+
"\3\2\2\2\13\u0123\3\2\2\2\r\u0127\3\2\2\2\17\u012f\3\2\2\2\21\u0138\3"+
"\2\2\2\23\u013c\3\2\2\2\25\u0140\3\2\2\2\27\u0143\3\2\2\2\31\u0147\3\2"+
"\2\2\33\u014f\3\2\2\2\35\u0152\3\2\2\2\37\u0157\3\2\2\2!\u015c\3\2\2\2"+
"#\u0164\3\2\2\2%\u016d\3\2\2\2\'\u0175\3\2\2\2)\u017d\3\2\2\2+\u018a\3"+
"\2\2\2-\u0197\3\2\2\2/\u01a9\3\2\2\2\61\u01ad\3\2\2\2\63\u01b2\3\2\2\2"+
"\65\u01b8\3\2\2\2\67\u01bd\3\2\2\29\u01c6\3\2\2\2;\u01cf\3\2\2\2=\u01d4"+
"\3\2\2\2?\u01d8\3\2\2\2A\u01df\3\2\2\2C\u01ea\3\2\2\2E\u01f1\3\2\2\2G"+
"\u01f9\3\2\2\2I\u0201\3\2\2\2K\u0207\3\2\2\2M\u020d\3\2\2\2O\u0211\3\2"+
"\2\2Q\u0218\3\2\2\2S\u021d\3\2\2\2U\u0224\3\2\2\2W\u0229\3\2\2\2Y\u0233"+
"\3\2\2\2[\u023c\3\2\2\2]\u0242\3\2\2\2_\u0249\3\2\2\2a\u024e\3\2\2\2c"+
"\u0254\3\2\2\2e\u0257\3\2\2\2g\u025f\3\2\2\2i\u0265\3\2\2\2k\u026e\3\2"+
"\2\2m\u0271\3\2\2\2o\u0276\3\2\2\2q\u027b\3\2\2\2s\u0280\3\2\2\2u\u0285"+
"\3\2\2\2w\u028b\3\2\2\2y\u0292\3\2\2\2{\u0298\3\2\2\2}\u029f\3\2\2\2\177"+
"\u02a7\3\2\2\2\u0081\u02ad\3\2\2\2\u0083\u02b4\3\2\2\2\u0085\u02bc\3\2"+
"\2\2\u0087\u02c0\3\2\2\2\u0089\u02c5\3\2\2\2\u008b\u02cb\3\2\2\2\u008d"+
"\u02ce\3\2\2\2\u008f\u02d8\3\2\2\2\u0091\u02db\3\2\2\2\u0093\u02e1\3\2"+
"\2\2\u0095\u02e7\3\2\2\2\u0097\u02ee\3\2\2\2\u0099\u02f7\3\2\2\2\u009b"+
"\u02fd\3\2\2\2\u009d\u0302\3\2\2\2\u009f\u0308\3\2\2\2\u00a1\u030e\3\2"+
"\2\2\u00a3\u0314\3\2\2\2\u00a5\u031c\3\2\2\2\u00a7\u0323\3\2\2\2\u00a9"+
"\u032b\3\2\2\2\u00ab\u0332\3\2\2\2\u00ad\u0337\3\2\2\2\u00af\u033b\3\2"+
"\2\2\u00b1\u0341\3\2\2\2\u00b3\u0348\3\2\2\2\u00b5\u034d\3\2\2\2\u00b7"+
"\u0352\3\2\2\2\u00b9\u0357\3\2\2\2\u00bb\u035a\3\2\2\2\u00bd\u035f\3\2"+
"\2\2\u00bf\u0365\3\2\2\2\u00c1\u036b\3\2\2\2\u00c3\u0372\3\2\2\2\u00c5"+
"\u0377\3\2\2\2\u00c7\u037d\3\2\2\2\u00c9\u0382\3\2\2\2\u00cb\u0387\3\2"+
"\2\2\u00cd\u038d\3\2\2\2\u00cf\u0395\3\2\2\2\u00d1\u0399\3\2\2\2\u00d3"+
"\u03a0\3\2\2\2\u00d5\u03a3\3\2\2\2\u00d7\u03a6\3\2\2\2\u00d9\u03aa\3\2"+
"\2\2\u00db\u03b0\3\2\2\2\u00dd\u03b2\3\2\2\2\u00df\u03b4\3\2\2\2\u00e1"+
"\u03bc\3\2\2\2\u00e3\u03be\3\2\2\2\u00e5\u03c0\3\2\2\2\u00e7\u03c3\3\2"+
"\2\2\u00e9\u03c5\3\2\2\2\u00eb\u03c8\3\2\2\2\u00ed\u03ca\3\2\2\2\u00ef"+
"\u03cc\3\2\2\2\u00f1\u03ce\3\2\2\2\u00f3\u03d0\3\2\2\2\u00f5\u03d2\3\2"+
"\2\2\u00f7\u03d5\3\2\2\2\u00f9\u03d8\3\2\2\2\u00fb\u03da\3\2\2\2\u00fd"+
"\u03dc\3\2\2\2\u00ff\u03e8\3\2\2\2\u0101\u0416\3\2\2\2\u0103\u041a\3\2"+
"\2\2\u0105\u0424\3\2\2\2\u0107\u042f\3\2\2\2\u0109\u0433\3\2\2\2\u010b"+
"\u043e\3\2\2\2\u010d\u0449\3\2\2\2\u010f\u0452\3\2\2\2\u0111\u0454\3\2"+
"\2\2\u0113\u0456\3\2\2\2\u0115\u0467\3\2\2\2\u0117\u0477\3\2\2\2\u0119"+
"\u047d\3\2\2\2\u011b\u011c\7*\2\2\u011c\4\3\2\2\2\u011d\u011e\7+\2\2\u011e"+
"\6\3\2\2\2\u011f\u0120\7.\2\2\u0120\b\3\2\2\2\u0121\u0122\7<\2\2\u0122"+
"\n\3\2\2\2\u0123\u0124\7C\2\2\u0124\u0125\7N\2\2\u0125\u0126\7N\2\2\u0126"+
"\f\3\2\2\2\u0127\u0128\7C\2\2\u0128\u0129\7P\2\2\u0129\u012a\7C\2\2\u012a"+
"\u012b\7N\2\2\u012b\u012c\7[\2\2\u012c\u012d\7\\\2\2\u012d\u012e\7G\2"+
"\2\u012e\16\3\2\2\2\u012f\u0130\7C\2\2\u0130\u0131\7P\2\2\u0131\u0132"+
"\7C\2\2\u0132\u0133\7N\2\2\u0133\u0134\7[\2\2\u0134\u0135\7\\\2\2\u0135"+
"\u0136\7G\2\2\u0136\u0137\7F\2\2\u0137\20\3\2\2\2\u0138\u0139\7C\2\2\u0139"+
"\u013a\7P\2\2\u013a\u013b\7F\2\2\u013b\22\3\2\2\2\u013c\u013d\7C\2\2\u013d"+
"\u013e\7P\2\2\u013e\u013f\7[\2\2\u013f\24\3\2\2\2\u0140\u0141\7C\2\2\u0141"+
"\u0142\7U\2\2\u0142\26\3\2\2\2\u0143\u0144\7C\2\2\u0144\u0145\7U\2\2\u0145"+
"\u0146\7E\2\2\u0146\30\3\2\2\2\u0147\u0148\7D\2\2\u0148\u0149\7G\2\2\u0149"+
"\u014a\7V\2\2\u014a\u014b\7Y\2\2\u014b\u014c\7G\2\2\u014c\u014d\7G\2\2"+
"\u014d\u014e\7P\2\2\u014e\32\3\2\2\2\u014f\u0150\7D\2\2\u0150\u0151\7"+
"[\2\2\u0151\34\3\2\2\2\u0152\u0153\7E\2\2\u0153\u0154\7C\2\2\u0154\u0155"+
"\7U\2\2\u0155\u0156\7G\2\2\u0156\36\3\2\2\2\u0157\u0158\7E\2\2\u0158\u0159"+
"\7C\2\2\u0159\u015a\7U\2\2\u015a\u015b\7V\2\2\u015b \3\2\2\2\u015c\u015d"+
"\7E\2\2\u015d\u015e\7C\2\2\u015e\u015f\7V\2\2\u015f\u0160\7C\2\2\u0160"+
"\u0161\7N\2\2\u0161\u0162\7Q\2\2\u0162\u0163\7I\2\2\u0163\"\3\2\2\2\u0164"+
"\u0165\7E\2\2\u0165\u0166\7C\2\2\u0166\u0167\7V\2\2\u0167\u0168\7C\2\2"+
"\u0168\u0169\7N\2\2\u0169\u016a\7Q\2\2\u016a\u016b\7I\2\2\u016b\u016c"+
"\7U\2\2\u016c$\3\2\2\2\u016d\u016e\7E\2\2\u016e\u016f\7Q\2\2\u016f\u0170"+
"\7N\2\2\u0170\u0171\7W\2\2\u0171\u0172\7O\2\2\u0172\u0173\7P\2\2\u0173"+
"\u0174\7U\2\2\u0174&\3\2\2\2\u0175\u0176\7E\2\2\u0176\u0177\7Q\2\2\u0177"+
"\u0178\7P\2\2\u0178\u0179\7X\2\2\u0179\u017a\7G\2\2\u017a\u017b\7T\2\2"+
"\u017b\u017c\7V\2\2\u017c(\3\2\2\2\u017d\u017e\7E\2\2\u017e\u017f\7W\2"+
"\2\u017f\u0180\7T\2\2\u0180\u0181\7T\2\2\u0181\u0182\7G\2\2\u0182\u0183"+
"\7P\2\2\u0183\u0184\7V\2\2\u0184\u0185\7a\2\2\u0185\u0186\7F\2\2\u0186"+
"\u0187\7C\2\2\u0187\u0188\7V\2\2\u0188\u0189\7G\2\2\u0189*\3\2\2\2\u018a"+
"\u018b\7E\2\2\u018b\u018c\7W\2\2\u018c\u018d\7T\2\2\u018d\u018e\7T\2\2"+
"\u018e\u018f\7G\2\2\u018f\u0190\7P\2\2\u0190\u0191\7V\2\2\u0191\u0192"+
"\7a\2\2\u0192\u0193\7V\2\2\u0193\u0194\7K\2\2\u0194\u0195\7O\2\2\u0195"+
"\u0196\7G\2\2\u0196,\3\2\2\2\u0197\u0198\7E\2\2\u0198\u0199\7W\2\2\u0199"+
"\u019a\7T\2\2\u019a\u019b\7T\2\2\u019b\u019c\7G\2\2\u019c\u019d\7P\2\2"+
"\u019d\u019e\7V\2\2\u019e\u019f\7a\2\2\u019f\u01a0\7V\2\2\u01a0\u01a1"+
"\7K\2\2\u01a1\u01a2\7O\2\2\u01a2\u01a3\7G\2\2\u01a3\u01a4\7U\2\2\u01a4"+
"\u01a5\7V\2\2\u01a5\u01a6\7C\2\2\u01a6\u01a7\7O\2\2\u01a7\u01a8\7R\2\2"+
"\u01a8.\3\2\2\2\u01a9\u01aa\7F\2\2\u01aa\u01ab\7C\2\2\u01ab\u01ac\7[\2"+
"\2\u01ac\60\3\2\2\2\u01ad\u01ae\7F\2\2\u01ae\u01af\7C\2\2\u01af\u01b0"+
"\7[\2\2\u01b0\u01b1\7U\2\2\u01b1\62\3\2\2\2\u01b2\u01b3\7F\2\2\u01b3\u01b4"+
"\7G\2\2\u01b4\u01b5\7D\2\2\u01b5\u01b6\7W\2\2\u01b6\u01b7\7I\2\2\u01b7"+
"\64\3\2\2\2\u01b8\u01b9\7F\2\2\u01b9\u01ba\7G\2\2\u01ba\u01bb\7U\2\2\u01bb"+
"\u01bc\7E\2\2\u01bc\66\3\2\2\2\u01bd\u01be\7F\2\2\u01be\u01bf\7G\2\2\u01bf"+
"\u01c0\7U\2\2\u01c0\u01c1\7E\2\2\u01c1\u01c2\7T\2\2\u01c2\u01c3\7K\2\2"+
"\u01c3\u01c4\7D\2\2\u01c4\u01c5\7G\2\2\u01c58\3\2\2\2\u01c6\u01c7\7F\2"+
"\2\u01c7\u01c8\7K\2\2\u01c8\u01c9\7U\2\2\u01c9\u01ca\7V\2\2\u01ca\u01cb"+
"\7K\2\2\u01cb\u01cc\7P\2\2\u01cc\u01cd\7E\2\2\u01cd\u01ce\7V\2\2\u01ce"+
":\3\2\2\2\u01cf\u01d0\7G\2\2\u01d0\u01d1\7N\2\2\u01d1\u01d2\7U\2\2\u01d2"+
"\u01d3\7G\2\2\u01d3<\3\2\2\2\u01d4\u01d5\7G\2\2\u01d5\u01d6\7P\2\2\u01d6"+
"\u01d7\7F\2\2\u01d7>\3\2\2\2\u01d8\u01d9\7G\2\2\u01d9\u01da\7U\2\2\u01da"+
"\u01db\7E\2\2\u01db\u01dc\7C\2\2\u01dc\u01dd\7R\2\2\u01dd\u01de\7G\2\2"+
"\u01de@\3\2\2\2\u01df\u01e0\7G\2\2\u01e0\u01e1\7Z\2\2\u01e1\u01e2\7G\2"+
"\2\u01e2\u01e3\7E\2\2\u01e3\u01e4\7W\2\2\u01e4\u01e5\7V\2\2\u01e5\u01e6"+
"\7C\2\2\u01e6\u01e7\7D\2\2\u01e7\u01e8\7N\2\2\u01e8\u01e9\7G\2\2\u01e9"+
"B\3\2\2\2\u01ea\u01eb\7G\2\2\u01eb\u01ec\7Z\2\2\u01ec\u01ed\7K\2\2\u01ed"+
"\u01ee\7U\2\2\u01ee\u01ef\7V\2\2\u01ef\u01f0\7U\2\2\u01f0D\3\2\2\2\u01f1"+
"\u01f2\7G\2\2\u01f2\u01f3\7Z\2\2\u01f3\u01f4\7R\2\2\u01f4\u01f5\7N\2\2"+
"\u01f5\u01f6\7C\2\2\u01f6\u01f7\7K\2\2\u01f7\u01f8\7P\2\2\u01f8F\3\2\2"+
"\2\u01f9\u01fa\7G\2\2\u01fa\u01fb\7Z\2\2\u01fb\u01fc\7V\2\2\u01fc\u01fd"+
"\7T\2\2\u01fd\u01fe\7C\2\2\u01fe\u01ff\7E\2\2\u01ff\u0200\7V\2\2\u0200"+
"H\3\2\2\2\u0201\u0202\7H\2\2\u0202\u0203\7C\2\2\u0203\u0204\7N\2\2\u0204"+
"\u0205\7U\2\2\u0205\u0206\7G\2\2\u0206J\3\2\2\2\u0207\u0208\7H\2\2\u0208"+
"\u0209\7K\2\2\u0209\u020a\7T\2\2\u020a\u020b\7U\2\2\u020b\u020c\7V\2\2"+
"\u020cL\3\2\2\2\u020d\u020e\7H\2\2\u020e\u020f\7Q\2\2\u020f\u0210\7T\2"+
"\2\u0210N\3\2\2\2\u0211\u0212\7H\2\2\u0212\u0213\7Q\2\2\u0213\u0214\7"+
"T\2\2\u0214\u0215\7O\2\2\u0215\u0216\7C\2\2\u0216\u0217\7V\2\2\u0217P"+
"\3\2\2\2\u0218\u0219\7H\2\2\u0219\u021a\7T\2\2\u021a\u021b\7Q\2\2\u021b"+
"\u021c\7O\2\2\u021cR\3\2\2\2\u021d\u021e\7H\2\2\u021e\u021f\7T\2\2\u021f"+
"\u0220\7Q\2\2\u0220\u0221\7\\\2\2\u0221\u0222\7G\2\2\u0222\u0223\7P\2"+
"\2\u0223T\3\2\2\2\u0224\u0225\7H\2\2\u0225\u0226\7W\2\2\u0226\u0227\7"+
"N\2\2\u0227\u0228\7N\2\2\u0228V\3\2\2\2\u0229\u022a\7H\2\2\u022a\u022b"+
"\7W\2\2\u022b\u022c\7P\2\2\u022c\u022d\7E\2\2\u022d\u022e\7V\2\2\u022e"+
"\u022f\7K\2\2\u022f\u0230\7Q\2\2\u0230\u0231\7P\2\2\u0231\u0232\7U\2\2"+
"\u0232X\3\2\2\2\u0233\u0234\7I\2\2\u0234\u0235\7T\2\2\u0235\u0236\7C\2"+
"\2\u0236\u0237\7R\2\2\u0237\u0238\7J\2\2\u0238\u0239\7X\2\2\u0239\u023a"+
"\7K\2\2\u023a\u023b\7\\\2\2\u023bZ\3\2\2\2\u023c\u023d\7I\2\2\u023d\u023e"+
"\7T\2\2\u023e\u023f\7Q\2\2\u023f\u0240\7W\2\2\u0240\u0241\7R\2\2\u0241"+
"\\\3\2\2\2\u0242\u0243\7J\2\2\u0243\u0244\7C\2\2\u0244\u0245\7X\2\2\u0245"+
"\u0246\7K\2\2\u0246\u0247\7P\2\2\u0247\u0248\7I\2\2\u0248^\3\2\2\2\u0249"+
"\u024a\7J\2\2\u024a\u024b\7Q\2\2\u024b\u024c\7W\2\2\u024c\u024d\7T\2\2"+
"\u024d`\3\2\2\2\u024e\u024f\7J\2\2\u024f\u0250\7Q\2\2\u0250\u0251\7W\2"+
"\2\u0251\u0252\7T\2\2\u0252\u0253\7U\2\2\u0253b\3\2\2\2\u0254\u0255\7"+
"K\2\2\u0255\u0256\7P\2\2\u0256d\3\2\2\2\u0257\u0258\7K\2\2\u0258\u0259"+
"\7P\2\2\u0259\u025a\7E\2\2\u025a\u025b\7N\2\2\u025b\u025c\7W\2\2\u025c"+
"\u025d\7F\2\2\u025d\u025e\7G\2\2\u025ef\3\2\2\2\u025f\u0260\7K\2\2\u0260"+
"\u0261\7P\2\2\u0261\u0262\7P\2\2\u0262\u0263\7G\2\2\u0263\u0264\7T\2\2"+
"\u0264h\3\2\2\2\u0265\u0266\7K\2\2\u0266\u0267\7P\2\2\u0267\u0268\7V\2"+
"\2\u0268\u0269\7G\2\2\u0269\u026a\7T\2\2\u026a\u026b\7X\2\2\u026b\u026c"+
"\7C\2\2\u026c\u026d\7N\2\2\u026dj\3\2\2\2\u026e\u026f\7K\2\2\u026f\u0270"+
"\7U\2\2\u0270l\3\2\2\2\u0271\u0272\7L\2\2\u0272\u0273\7Q\2\2\u0273\u0274"+
"\7K\2\2\u0274\u0275\7P\2\2\u0275n\3\2\2\2\u0276\u0277\7N\2\2\u0277\u0278"+
"\7C\2\2\u0278\u0279\7U\2\2\u0279\u027a\7V\2\2\u027ap\3\2\2\2\u027b\u027c"+
"\7N\2\2\u027c\u027d\7G\2\2\u027d\u027e\7H\2\2\u027e\u027f\7V\2\2\u027f"+
"r\3\2\2\2\u0280\u0281\7N\2\2\u0281\u0282\7K\2\2\u0282\u0283\7M\2\2\u0283"+
"\u0284\7G\2\2\u0284t\3\2\2\2\u0285\u0286\7N\2\2\u0286\u0287\7K\2\2\u0287"+
"\u0288\7O\2\2\u0288\u0289\7K\2\2\u0289\u028a\7V\2\2\u028av\3\2\2\2\u028b"+
"\u028c\7O\2\2\u028c\u028d\7C\2\2\u028d\u028e\7R\2\2\u028e\u028f\7R\2\2"+
"\u028f\u0290\7G\2\2\u0290\u0291\7F\2\2\u0291x\3\2\2\2\u0292\u0293\7O\2"+
"\2\u0293\u0294\7C\2\2\u0294\u0295\7V\2\2\u0295\u0296\7E\2\2\u0296\u0297"+
"\7J\2\2\u0297z\3\2\2\2\u0298\u0299\7O\2\2\u0299\u029a\7K\2\2\u029a\u029b"+
"\7P\2\2\u029b\u029c\7W\2\2\u029c\u029d\7V\2\2\u029d\u029e\7G\2\2\u029e"+
"|\3\2\2\2\u029f\u02a0\7O\2\2\u02a0\u02a1\7K\2\2\u02a1\u02a2\7P\2\2\u02a2"+
"\u02a3\7W\2\2\u02a3\u02a4\7V\2\2\u02a4\u02a5\7G\2\2\u02a5\u02a6\7U\2\2"+
"\u02a6~\3\2\2\2\u02a7\u02a8\7O\2\2\u02a8\u02a9\7Q\2\2\u02a9\u02aa\7P\2"+
"\2\u02aa\u02ab\7V\2\2\u02ab\u02ac\7J\2\2\u02ac\u0080\3\2\2\2\u02ad\u02ae"+
"\7O\2\2\u02ae\u02af\7Q\2\2\u02af\u02b0\7P\2\2\u02b0\u02b1\7V\2\2\u02b1"+
"\u02b2\7J\2\2\u02b2\u02b3\7U\2\2\u02b3\u0082\3\2\2\2\u02b4\u02b5\7P\2"+
"\2\u02b5\u02b6\7C\2\2\u02b6\u02b7\7V\2\2\u02b7\u02b8\7W\2\2\u02b8\u02b9"+
"\7T\2\2\u02b9\u02ba\7C\2\2\u02ba\u02bb\7N\2\2\u02bb\u0084\3\2\2\2\u02bc"+
"\u02bd\7P\2\2\u02bd\u02be\7Q\2\2\u02be\u02bf\7V\2\2\u02bf\u0086\3\2\2"+
"\2\u02c0\u02c1\7P\2\2\u02c1\u02c2\7W\2\2\u02c2\u02c3\7N\2\2\u02c3\u02c4"+
"\7N\2\2\u02c4\u0088\3\2\2\2\u02c5\u02c6\7P\2\2\u02c6\u02c7\7W\2\2\u02c7"+
"\u02c8\7N\2\2\u02c8\u02c9\7N\2\2\u02c9\u02ca\7U\2\2\u02ca\u008a\3\2\2"+
"\2\u02cb\u02cc\7Q\2\2\u02cc\u02cd\7P\2\2\u02cd\u008c\3\2\2\2\u02ce\u02cf"+
"\7Q\2\2\u02cf\u02d0\7R\2\2\u02d0\u02d1\7V\2\2\u02d1\u02d2\7K\2\2\u02d2"+
"\u02d3\7O\2\2\u02d3\u02d4\7K\2\2\u02d4\u02d5\7\\\2\2\u02d5\u02d6\7G\2"+
"\2\u02d6\u02d7\7F\2\2\u02d7\u008e\3\2\2\2\u02d8\u02d9\7Q\2\2\u02d9\u02da"+
"\7T\2\2\u02da\u0090\3\2\2\2\u02db\u02dc\7Q\2\2\u02dc\u02dd\7T\2\2\u02dd"+
"\u02de\7F\2\2\u02de\u02df\7G\2\2\u02df\u02e0\7T\2\2\u02e0\u0092\3\2\2"+
"\2\u02e1\u02e2\7Q\2\2\u02e2\u02e3\7W\2\2\u02e3\u02e4\7V\2\2\u02e4\u02e5"+
"\7G\2\2\u02e5\u02e6\7T\2\2\u02e6\u0094\3\2\2\2\u02e7\u02e8\7R\2\2\u02e8"+
"\u02e9\7C\2\2\u02e9\u02ea\7T\2\2\u02ea\u02eb\7U\2\2\u02eb\u02ec\7G\2\2"+
"\u02ec\u02ed\7F\2\2\u02ed\u0096\3\2\2\2\u02ee\u02ef\7R\2\2\u02ef\u02f0"+
"\7J\2\2\u02f0\u02f1\7[\2\2\u02f1\u02f2\7U\2\2\u02f2\u02f3\7K\2\2\u02f3"+
"\u02f4\7E\2\2\u02f4\u02f5\7C\2\2\u02f5\u02f6\7N\2\2\u02f6\u0098\3\2\2"+
"\2\u02f7\u02f8\7R\2\2\u02f8\u02f9\7K\2\2\u02f9\u02fa\7X\2\2\u02fa\u02fb"+
"\7Q\2\2\u02fb\u02fc\7V\2\2\u02fc\u009a\3\2\2\2\u02fd\u02fe\7R\2\2\u02fe"+
"\u02ff\7N\2\2\u02ff\u0300\7C\2\2\u0300\u0301\7P\2\2\u0301\u009c\3\2\2"+
"\2\u0302\u0303\7T\2\2\u0303\u0304\7K\2\2\u0304\u0305\7I\2\2\u0305\u0306"+
"\7J\2\2\u0306\u0307\7V\2\2\u0307\u009e\3\2\2\2\u0308\u0309\7T\2\2\u0309"+
"\u030a\7N\2\2\u030a\u030b\7K\2\2\u030b\u030c\7M\2\2\u030c\u030d\7G\2\2"+
"\u030d\u00a0\3\2\2\2\u030e\u030f\7S\2\2\u030f\u0310\7W\2\2\u0310\u0311"+
"\7G\2\2\u0311\u0312\7T\2\2\u0312\u0313\7[\2\2\u0313\u00a2\3\2\2\2\u0314"+
"\u0315\7U\2\2\u0315\u0316\7E\2\2\u0316\u0317\7J\2\2\u0317\u0318\7G\2\2"+
"\u0318\u0319\7O\2\2\u0319\u031a\7C\2\2\u031a\u031b\7U\2\2\u031b\u00a4"+
"\3\2\2\2\u031c\u031d\7U\2\2\u031d\u031e\7G\2\2\u031e\u031f\7E\2\2\u031f"+
"\u0320\7Q\2\2\u0320\u0321\7P\2\2\u0321\u0322\7F\2\2\u0322\u00a6\3\2\2"+
"\2\u0323\u0324\7U\2\2\u0324\u0325\7G\2\2\u0325\u0326\7E\2\2\u0326\u0327"+
"\7Q\2\2\u0327\u0328\7P\2\2\u0328\u0329\7F\2\2\u0329\u032a\7U\2\2\u032a"+
"\u00a8\3\2\2\2\u032b\u032c\7U\2\2\u032c\u032d\7G\2\2\u032d\u032e\7N\2"+
"\2\u032e\u032f\7G\2\2\u032f\u0330\7E\2\2\u0330\u0331\7V\2\2\u0331\u00aa"+
"\3\2\2\2\u0332\u0333\7U\2\2\u0333\u0334\7J\2\2\u0334\u0335\7Q\2\2\u0335"+
"\u0336\7Y\2\2\u0336\u00ac\3\2\2\2\u0337\u0338\7U\2\2\u0338\u0339\7[\2"+
"\2\u0339\u033a\7U\2\2\u033a\u00ae\3\2\2\2\u033b\u033c\7V\2\2\u033c\u033d"+
"\7C\2\2\u033d\u033e\7D\2\2\u033e\u033f\7N\2\2\u033f\u0340\7G\2\2\u0340"+
"\u00b0\3\2\2\2\u0341\u0342\7V\2\2\u0342\u0343\7C\2\2\u0343\u0344\7D\2"+
"\2\u0344\u0345\7N\2\2\u0345\u0346\7G\2\2\u0346\u0347\7U\2\2\u0347\u00b2"+
"\3\2\2\2\u0348\u0349\7V\2\2\u0349\u034a\7G\2\2\u034a\u034b\7Z\2\2\u034b"+
"\u034c\7V\2\2\u034c\u00b4\3\2\2\2\u034d\u034e\7V\2\2\u034e\u034f\7J\2"+
"\2\u034f\u0350\7G\2\2\u0350\u0351\7P\2\2\u0351\u00b6\3\2\2\2\u0352\u0353"+
"\7V\2\2\u0353\u0354\7T\2\2\u0354\u0355\7W\2\2\u0355\u0356\7G\2\2\u0356"+
"\u00b8\3\2\2\2\u0357\u0358\7V\2\2\u0358\u0359\7Q\2\2\u0359\u00ba\3\2\2"+
"\2\u035a\u035b\7V\2\2\u035b\u035c\7[\2\2\u035c\u035d\7R\2\2\u035d\u035e"+
"\7G\2\2\u035e\u00bc\3\2\2\2\u035f\u0360\7V\2\2\u0360\u0361\7[\2\2\u0361"+
"\u0362\7R\2\2\u0362\u0363\7G\2\2\u0363\u0364\7U\2\2\u0364\u00be\3\2\2"+
"\2\u0365\u0366\7W\2\2\u0366\u0367\7U\2\2\u0367\u0368\7K\2\2\u0368\u0369"+
"\7P\2\2\u0369\u036a\7I\2\2\u036a\u00c0\3\2\2\2\u036b\u036c\7X\2\2\u036c"+
"\u036d\7G\2\2\u036d\u036e\7T\2\2\u036e\u036f\7K\2\2\u036f\u0370\7H\2\2"+
"\u0370\u0371\7[\2\2\u0371\u00c2\3\2\2\2\u0372\u0373\7Y\2\2\u0373\u0374"+
"\7J\2\2\u0374\u0375\7G\2\2\u0375\u0376\7P\2\2\u0376\u00c4\3\2\2\2\u0377"+
"\u0378\7Y\2\2\u0378\u0379\7J\2\2\u0379\u037a\7G\2\2\u037a\u037b\7T\2\2"+
"\u037b\u037c\7G\2\2\u037c\u00c6\3\2\2\2\u037d\u037e\7Y\2\2\u037e\u037f"+
"\7K\2\2\u037f\u0380\7V\2\2\u0380\u0381\7J\2\2\u0381\u00c8\3\2\2\2\u0382"+
"\u0383\7[\2\2\u0383\u0384\7G\2\2\u0384\u0385\7C\2\2\u0385\u0386\7T\2\2"+
"\u0386\u00ca\3\2\2\2\u0387\u0388\7[\2\2\u0388\u0389\7G\2\2\u0389\u038a"+
"\7C\2\2\u038a\u038b\7T\2\2\u038b\u038c\7U\2\2\u038c\u00cc\3\2\2\2\u038d"+
"\u038e\7}\2\2\u038e\u038f\7G\2\2\u038f\u0390\7U\2\2\u0390\u0391\7E\2\2"+
"\u0391\u0392\7C\2\2\u0392\u0393\7R\2\2\u0393\u0394\7G\2\2\u0394\u00ce"+
"\3\2\2\2\u0395\u0396\7}\2\2\u0396\u0397\7H\2\2\u0397\u0398\7P\2\2\u0398"+
"\u00d0\3\2\2\2\u0399\u039a\7}\2\2\u039a\u039b\7N\2\2\u039b\u039c\7K\2"+
"\2\u039c\u039d\7O\2\2\u039d\u039e\7K\2\2\u039e\u039f\7V\2\2\u039f\u00d2"+
"\3\2\2\2\u03a0\u03a1\7}\2\2\u03a1\u03a2\7F\2\2\u03a2\u00d4\3\2\2\2\u03a3"+
"\u03a4\7}\2\2\u03a4\u03a5\7V\2\2\u03a5\u00d6\3\2\2\2\u03a6\u03a7\7}\2"+
"\2\u03a7\u03a8\7V\2\2\u03a8\u03a9\7U\2\2\u03a9\u00d8\3\2\2\2\u03aa\u03ab"+
"\7}\2\2\u03ab\u03ac\7I\2\2\u03ac\u03ad\7W\2\2\u03ad\u03ae\7K\2\2\u03ae"+
"\u03af\7F\2\2\u03af\u00da\3\2\2\2\u03b0\u03b1\7\177\2\2\u03b1\u00dc\3"+
"\2\2\2\u03b2\u03b3\7?\2\2\u03b3\u00de\3\2\2\2\u03b4\u03b5\7>\2\2\u03b5"+
"\u03b6\7?\2\2\u03b6\u03b7\7@\2\2\u03b7\u00e0\3\2\2\2\u03b8\u03b9\7>\2"+
"\2\u03b9\u03bd\7@\2\2\u03ba\u03bb\7#\2\2\u03bb\u03bd\7?\2\2\u03bc\u03b8"+
"\3\2\2\2\u03bc\u03ba\3\2\2\2\u03bd\u00e2\3\2\2\2\u03be\u03bf\7>\2\2\u03bf"+
"\u00e4\3\2\2\2\u03c0\u03c1\7>\2\2\u03c1\u03c2\7?\2\2\u03c2\u00e6\3\2\2"+
"\2\u03c3\u03c4\7@\2\2\u03c4\u00e8\3\2\2\2\u03c5\u03c6\7@\2\2\u03c6\u03c7"+
"\7?\2\2\u03c7\u00ea\3\2\2\2\u03c8\u03c9\7-\2\2\u03c9\u00ec\3\2\2\2\u03ca"+
"\u03cb\7/\2\2\u03cb\u00ee\3\2\2\2\u03cc\u03cd\7,\2\2\u03cd\u00f0\3\2\2"+
"\2\u03ce\u03cf\7\61\2\2\u03cf\u00f2\3\2\2\2\u03d0\u03d1\7\'\2\2\u03d1"+
"\u00f4\3\2\2\2\u03d2\u03d3\7<\2\2\u03d3\u03d4\7<\2\2\u03d4\u00f6\3\2\2"+
"\2\u03d5\u03d6\7~\2\2\u03d6\u03d7\7~\2\2\u03d7\u00f8\3\2\2\2\u03d8\u03d9"+
"\7\60\2\2\u03d9\u00fa\3\2\2\2\u03da\u03db\7A\2\2\u03db\u00fc\3\2\2\2\u03dc"+
"\u03e2\7)\2\2\u03dd\u03e1\n\2\2\2\u03de\u03df\7)\2\2\u03df\u03e1\7)\2"+
"\2\u03e0\u03dd\3\2\2\2\u03e0\u03de\3\2\2\2\u03e1\u03e4\3\2\2\2\u03e2\u03e0"+
"\3\2\2\2\u03e2\u03e3\3\2\2\2\u03e3\u03e5\3\2\2\2\u03e4\u03e2\3\2\2\2\u03e5"+
"\u03e6\7)\2\2\u03e6\u00fe\3\2\2\2\u03e7\u03e9\5\u010f\u0088\2\u03e8\u03e7"+
"\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea\u03e8\3\2\2\2\u03ea\u03eb\3\2\2\2\u03eb"+
"\u0100\3\2\2\2\u03ec\u03ee\5\u010f\u0088\2\u03ed\u03ec\3\2\2\2\u03ee\u03ef"+
"\3\2\2\2\u03ef\u03ed\3\2\2\2\u03ef\u03f0\3\2\2\2\u03f0\u03f1\3\2\2\2\u03f1"+
"\u03f5\5\u00f9}\2\u03f2\u03f4\5\u010f\u0088\2\u03f3\u03f2\3\2\2\2\u03f4"+
"\u03f7\3\2\2\2\u03f5\u03f3\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6\u0417\3\2"+
"\2\2\u03f7\u03f5\3\2\2\2\u03f8\u03fa\5\u00f9}\2\u03f9\u03fb\5\u010f\u0088"+
"\2\u03fa\u03f9\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc\u03fa\3\2\2\2\u03fc\u03fd"+
"\3\2\2\2\u03fd\u0417\3\2\2\2\u03fe\u0400\5\u010f\u0088\2\u03ff\u03fe\3"+
"\2\2\2\u0400\u0401\3\2\2\2\u0401\u03ff\3\2\2\2\u0401\u0402\3\2\2\2\u0402"+
"\u040a\3\2\2\2\u0403\u0407\5\u00f9}\2\u0404\u0406\5\u010f\u0088\2\u0405"+
"\u0404\3\2\2\2\u0406\u0409\3\2\2\2\u0407\u0405\3\2\2\2\u0407\u0408\3\2"+
"\2\2\u0408\u040b\3\2\2\2\u0409\u0407\3\2\2\2\u040a\u0403\3\2\2\2\u040a"+
"\u040b\3\2\2\2\u040b\u040c\3\2\2\2\u040c\u040d\5\u010d\u0087\2\u040d\u0417"+
"\3\2\2\2\u040e\u0410\5\u00f9}\2\u040f\u0411\5\u010f\u0088\2\u0410\u040f"+
"\3\2\2\2\u0411\u0412\3\2\2\2\u0412\u0410\3\2\2\2\u0412\u0413\3\2\2\2\u0413"+
"\u0414\3\2\2\2\u0414\u0415\5\u010d\u0087\2\u0415\u0417\3\2\2\2\u0416\u03ed"+
"\3\2\2\2\u0416\u03f8\3\2\2\2\u0416\u03ff\3\2\2\2\u0416\u040e\3\2\2\2\u0417"+
"\u0102\3\2\2\2\u0418\u041b\5\u0111\u0089\2\u0419\u041b\7a\2\2\u041a\u0418"+
"\3\2\2\2\u041a\u0419\3\2\2\2\u041b\u0421\3\2\2\2\u041c\u0420\5\u0111\u0089"+
"\2\u041d\u0420\5\u010f\u0088\2\u041e\u0420\t\3\2\2\u041f\u041c\3\2\2\2"+
"\u041f\u041d\3\2\2\2\u041f\u041e\3\2\2\2\u0420\u0423\3\2\2\2\u0421\u041f"+
"\3\2\2\2\u0421\u0422\3\2\2\2\u0422\u0104\3\2\2\2\u0423\u0421\3\2\2\2\u0424"+
"\u0428\5\u010f\u0088\2\u0425\u0429\5\u0111\u0089\2\u0426\u0429\5\u010f"+
"\u0088\2\u0427\u0429\t\3\2\2\u0428\u0425\3\2\2\2\u0428\u0426\3\2\2\2\u0428"+
"\u0427\3\2\2\2\u0429\u042a\3\2\2\2\u042a\u0428\3\2\2\2\u042a\u042b\3\2"+
"\2\2\u042b\u0106\3\2\2\2\u042c\u0430\5\u0111\u0089\2\u042d\u0430\5\u010f"+
"\u0088\2\u042e\u0430\7a\2\2\u042f\u042c\3\2\2\2\u042f\u042d\3\2\2\2\u042f"+
"\u042e\3\2\2\2\u0430\u0431\3\2\2\2\u0431\u042f\3\2\2\2\u0431\u0432\3\2"+
"\2\2\u0432\u0108\3\2\2\2\u0433\u0439\7$\2\2\u0434\u0438\n\4\2\2\u0435"+
"\u0436\7$\2\2\u0436\u0438\7$\2\2\u0437\u0434\3\2\2\2\u0437\u0435\3\2\2"+
"\2\u0438\u043b\3\2\2\2\u0439\u0437\3\2\2\2\u0439\u043a\3\2\2\2\u043a\u043c"+
"\3\2\2\2\u043b\u0439\3\2\2\2\u043c\u043d\7$\2\2\u043d\u010a\3\2\2\2\u043e"+
"\u0444\7b\2\2\u043f\u0443\n\5\2\2\u0440\u0441\7b\2\2\u0441\u0443\7b\2"+
"\2\u0442\u043f\3\2\2\2\u0442\u0440\3\2\2\2\u0443\u0446\3\2\2\2\u0444\u0442"+
"\3\2\2\2\u0444\u0445\3\2\2\2\u0445\u0447\3\2\2\2\u0446\u0444\3\2\2\2\u0447"+
"\u0448\7b\2\2\u0448\u010c\3\2\2\2\u0449\u044b\7G\2\2\u044a\u044c\t\6\2"+
"\2\u044b\u044a\3\2\2\2\u044b\u044c\3\2\2\2\u044c\u044e\3\2\2\2\u044d\u044f"+
"\5\u010f\u0088\2\u044e\u044d\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u044e\3"+
"\2\2\2\u0450\u0451\3\2\2\2\u0451\u010e\3\2\2\2\u0452\u0453\t\7\2\2\u0453"+
"\u0110\3\2\2\2\u0454\u0455\t\b\2\2\u0455\u0112\3\2\2\2\u0456\u0457\7/"+
"\2\2\u0457\u0458\7/\2\2\u0458\u045c\3\2\2\2\u0459\u045b\n\t\2\2\u045a"+
"\u0459\3\2\2\2\u045b\u045e\3\2\2\2\u045c\u045a\3\2\2\2\u045c\u045d\3\2"+
"\2\2\u045d\u0460\3\2\2\2\u045e\u045c\3\2\2\2\u045f\u0461\7\17\2\2\u0460"+
"\u045f\3\2\2\2\u0460\u0461\3\2\2\2\u0461\u0463\3\2\2\2\u0462\u0464\7\f"+
"\2\2\u0463\u0462\3\2\2\2\u0463\u0464\3\2\2\2\u0464\u0465\3\2\2\2\u0465"+
"\u0466\b\u008a\2\2\u0466\u0114\3\2\2\2\u0467\u0468\7\61\2\2\u0468\u0469"+
"\7,\2\2\u0469\u046e\3\2\2\2\u046a\u046d\5\u0115\u008b\2\u046b\u046d\13"+
"\2\2\2\u046c\u046a\3\2\2\2\u046c\u046b\3\2\2\2\u046d\u0470\3\2\2\2\u046e"+
"\u046f\3\2\2\2\u046e\u046c\3\2\2\2\u046f\u0471\3\2\2\2\u0470\u046e\3\2"+
"\2\2\u0471\u0472\7,\2\2\u0472\u0473\7\61\2\2\u0473\u0474\3\2\2\2\u0474"+
"\u0475\b\u008b\2\2\u0475\u0116\3\2\2\2\u0476\u0478\t\n\2\2\u0477\u0476"+
"\3\2\2\2\u0478\u0479\3\2\2\2\u0479\u0477\3\2\2\2\u0479\u047a\3\2\2\2\u047a"+
"\u047b\3\2\2\2\u047b\u047c\b\u008c\2\2\u047c\u0118\3\2\2\2\u047d\u047e"+
"\13\2\2\2\u047e\u011a\3\2\2\2\"\2\u03bc\u03e0\u03e2\u03ea\u03ef\u03f5"+
"\u03fc\u0401\u0407\u040a\u0412\u0416\u041a\u041f\u0421\u0428\u042a\u042f"+
"\u0431\u0437\u0439\u0442\u0444\u044b\u0450\u045c\u0460\u0463\u046c\u046e"+
"\u0479\3\2\3\2";
"\4\u008e\t\u008e\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\7\3"+
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t"+
"\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3"+
"\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3"+
"\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3"+
"\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+
"\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3"+
"\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+
"\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3"+
"\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3"+
"\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3"+
"\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3"+
"\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3"+
"\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\""+
"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3%\3"+
"%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3"+
")\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3"+
",\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3"+
"/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3"+
"\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3"+
"\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3"+
"\67\3\67\3\67\3\67\3\67\38\38\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3:\3"+
";\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3"+
">\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3"+
"A\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3"+
"E\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3I\3I\3I\3I\3I\3I\3"+
"J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3"+
"M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3"+
"Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3"+
"T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3X\3X\3"+
"X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3\\"+
"\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`"+
"\3`\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d"+
"\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h"+
"\3h\3i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3k\3k\3k\3l\3l\3l\3l\3m\3m\3m\3m\3m"+
"\3m\3n\3n\7n\u03b5\nn\fn\16n\u03b8\13n\3o\3o\3p\3p\3q\3q\3q\3q\3r\3r\3"+
"r\3r\5r\u03c6\nr\3s\3s\3t\3t\3t\3u\3u\3v\3v\3v\3w\3w\3x\3x\3y\3y\3z\3"+
"z\3{\3{\3|\3|\3|\3}\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0080\3"+
"\u0080\7\u0080\u03ea\n\u0080\f\u0080\16\u0080\u03ed\13\u0080\3\u0080\3"+
"\u0080\3\u0081\6\u0081\u03f2\n\u0081\r\u0081\16\u0081\u03f3\3\u0082\6"+
"\u0082\u03f7\n\u0082\r\u0082\16\u0082\u03f8\3\u0082\3\u0082\7\u0082\u03fd"+
"\n\u0082\f\u0082\16\u0082\u0400\13\u0082\3\u0082\3\u0082\6\u0082\u0404"+
"\n\u0082\r\u0082\16\u0082\u0405\3\u0082\6\u0082\u0409\n\u0082\r\u0082"+
"\16\u0082\u040a\3\u0082\3\u0082\7\u0082\u040f\n\u0082\f\u0082\16\u0082"+
"\u0412\13\u0082\5\u0082\u0414\n\u0082\3\u0082\3\u0082\3\u0082\3\u0082"+
"\6\u0082\u041a\n\u0082\r\u0082\16\u0082\u041b\3\u0082\3\u0082\5\u0082"+
"\u0420\n\u0082\3\u0083\3\u0083\5\u0083\u0424\n\u0083\3\u0083\3\u0083\3"+
"\u0083\7\u0083\u0429\n\u0083\f\u0083\16\u0083\u042c\13\u0083\3\u0084\3"+
"\u0084\3\u0084\3\u0084\6\u0084\u0432\n\u0084\r\u0084\16\u0084\u0433\3"+
"\u0085\3\u0085\3\u0085\6\u0085\u0439\n\u0085\r\u0085\16\u0085\u043a\3"+
"\u0086\3\u0086\3\u0086\3\u0086\7\u0086\u0441\n\u0086\f\u0086\16\u0086"+
"\u0444\13\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\7\u0087"+
"\u044c\n\u0087\f\u0087\16\u0087\u044f\13\u0087\3\u0087\3\u0087\3\u0088"+
"\3\u0088\5\u0088\u0455\n\u0088\3\u0088\6\u0088\u0458\n\u0088\r\u0088\16"+
"\u0088\u0459\3\u0089\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3"+
"\u008b\7\u008b\u0464\n\u008b\f\u008b\16\u008b\u0467\13\u008b\3\u008b\5"+
"\u008b\u046a\n\u008b\3\u008b\5\u008b\u046d\n\u008b\3\u008b\3\u008b\3\u008c"+
"\3\u008c\3\u008c\3\u008c\3\u008c\7\u008c\u0476\n\u008c\f\u008c\16\u008c"+
"\u0479\13\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d\6\u008d"+
"\u0481\n\u008d\r\u008d\16\u008d\u0482\3\u008d\3\u008d\3\u008e\3\u008e"+
"\3\u0477\2\u008f\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31"+
"\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65"+
"\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64"+
"g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089"+
"F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d"+
"P\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1"+
"Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5"+
"d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9"+
"n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00ed"+
"x\u00efy\u00f1z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff"+
"\u0081\u0101\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\u0086\u010b"+
"\u0087\u010d\u0088\u010f\2\u0111\2\u0113\2\u0115\u0089\u0117\u008a\u0119"+
"\u008b\u011b\u008c\3\2\13\3\2))\4\2BBaa\3\2$$\3\2bb\4\2--//\3\2\62;\3"+
"\2C\\\4\2\f\f\17\17\5\2\13\f\17\17\"\"\u04a9\2\3\3\2\2\2\2\5\3\2\2\2\2"+
"\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2"+
"\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2"+
"\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+
"\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+
"\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+
"\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+
"M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3"+
"\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2"+
"\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2"+
"s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177"+
"\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2"+
"\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091"+
"\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2"+
"\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3"+
"\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2"+
"\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5"+
"\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2"+
"\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7"+
"\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2"+
"\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9"+
"\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2"+
"\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb"+
"\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2"+
"\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd"+
"\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2"+
"\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b\3\2\2\2\2\u010d\3\2\2\2\2\u0115"+
"\3\2\2\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\3\u011d\3\2\2"+
"\2\5\u011f\3\2\2\2\7\u0121\3\2\2\2\t\u0123\3\2\2\2\13\u0125\3\2\2\2\r"+
"\u0129\3\2\2\2\17\u0131\3\2\2\2\21\u013a\3\2\2\2\23\u013e\3\2\2\2\25\u0142"+
"\3\2\2\2\27\u0145\3\2\2\2\31\u0149\3\2\2\2\33\u0151\3\2\2\2\35\u0154\3"+
"\2\2\2\37\u0159\3\2\2\2!\u015e\3\2\2\2#\u0166\3\2\2\2%\u016f\3\2\2\2\'"+
"\u0177\3\2\2\2)\u017f\3\2\2\2+\u018c\3\2\2\2-\u0199\3\2\2\2/\u01ab\3\2"+
"\2\2\61\u01af\3\2\2\2\63\u01b4\3\2\2\2\65\u01ba\3\2\2\2\67\u01bf\3\2\2"+
"\29\u01c8\3\2\2\2;\u01d1\3\2\2\2=\u01d6\3\2\2\2?\u01da\3\2\2\2A\u01e1"+
"\3\2\2\2C\u01ec\3\2\2\2E\u01f3\3\2\2\2G\u01fb\3\2\2\2I\u0203\3\2\2\2K"+
"\u0209\3\2\2\2M\u020f\3\2\2\2O\u0213\3\2\2\2Q\u021a\3\2\2\2S\u021f\3\2"+
"\2\2U\u0226\3\2\2\2W\u022b\3\2\2\2Y\u0235\3\2\2\2[\u023e\3\2\2\2]\u0244"+
"\3\2\2\2_\u024b\3\2\2\2a\u0250\3\2\2\2c\u0256\3\2\2\2e\u0259\3\2\2\2g"+
"\u0261\3\2\2\2i\u0267\3\2\2\2k\u0270\3\2\2\2m\u0273\3\2\2\2o\u0278\3\2"+
"\2\2q\u027d\3\2\2\2s\u0282\3\2\2\2u\u0287\3\2\2\2w\u028d\3\2\2\2y\u0294"+
"\3\2\2\2{\u029a\3\2\2\2}\u02a1\3\2\2\2\177\u02a9\3\2\2\2\u0081\u02af\3"+
"\2\2\2\u0083\u02b6\3\2\2\2\u0085\u02be\3\2\2\2\u0087\u02c2\3\2\2\2\u0089"+
"\u02c7\3\2\2\2\u008b\u02cd\3\2\2\2\u008d\u02d0\3\2\2\2\u008f\u02da\3\2"+
"\2\2\u0091\u02dd\3\2\2\2\u0093\u02e3\3\2\2\2\u0095\u02e9\3\2\2\2\u0097"+
"\u02f0\3\2\2\2\u0099\u02f9\3\2\2\2\u009b\u02ff\3\2\2\2\u009d\u0304\3\2"+
"\2\2\u009f\u030a\3\2\2\2\u00a1\u0310\3\2\2\2\u00a3\u0316\3\2\2\2\u00a5"+
"\u031e\3\2\2\2\u00a7\u0325\3\2\2\2\u00a9\u032d\3\2\2\2\u00ab\u0334\3\2"+
"\2\2\u00ad\u0339\3\2\2\2\u00af\u033d\3\2\2\2\u00b1\u0343\3\2\2\2\u00b3"+
"\u034a\3\2\2\2\u00b5\u034f\3\2\2\2\u00b7\u0354\3\2\2\2\u00b9\u0359\3\2"+
"\2\2\u00bb\u035c\3\2\2\2\u00bd\u0361\3\2\2\2\u00bf\u0367\3\2\2\2\u00c1"+
"\u036d\3\2\2\2\u00c3\u0374\3\2\2\2\u00c5\u0379\3\2\2\2\u00c7\u037f\3\2"+
"\2\2\u00c9\u0384\3\2\2\2\u00cb\u0389\3\2\2\2\u00cd\u038f\3\2\2\2\u00cf"+
"\u0397\3\2\2\2\u00d1\u039b\3\2\2\2\u00d3\u03a2\3\2\2\2\u00d5\u03a5\3\2"+
"\2\2\u00d7\u03a8\3\2\2\2\u00d9\u03ac\3\2\2\2\u00db\u03b2\3\2\2\2\u00dd"+
"\u03b9\3\2\2\2\u00df\u03bb\3\2\2\2\u00e1\u03bd\3\2\2\2\u00e3\u03c5\3\2"+
"\2\2\u00e5\u03c7\3\2\2\2\u00e7\u03c9\3\2\2\2\u00e9\u03cc\3\2\2\2\u00eb"+
"\u03ce\3\2\2\2\u00ed\u03d1\3\2\2\2\u00ef\u03d3\3\2\2\2\u00f1\u03d5\3\2"+
"\2\2\u00f3\u03d7\3\2\2\2\u00f5\u03d9\3\2\2\2\u00f7\u03db\3\2\2\2\u00f9"+
"\u03de\3\2\2\2\u00fb\u03e1\3\2\2\2\u00fd\u03e3\3\2\2\2\u00ff\u03e5\3\2"+
"\2\2\u0101\u03f1\3\2\2\2\u0103\u041f\3\2\2\2\u0105\u0423\3\2\2\2\u0107"+
"\u042d\3\2\2\2\u0109\u0438\3\2\2\2\u010b\u043c\3\2\2\2\u010d\u0447\3\2"+
"\2\2\u010f\u0452\3\2\2\2\u0111\u045b\3\2\2\2\u0113\u045d\3\2\2\2\u0115"+
"\u045f\3\2\2\2\u0117\u0470\3\2\2\2\u0119\u0480\3\2\2\2\u011b\u0486\3\2"+
"\2\2\u011d\u011e\7*\2\2\u011e\4\3\2\2\2\u011f\u0120\7+\2\2\u0120\6\3\2"+
"\2\2\u0121\u0122\7.\2\2\u0122\b\3\2\2\2\u0123\u0124\7<\2\2\u0124\n\3\2"+
"\2\2\u0125\u0126\7C\2\2\u0126\u0127\7N\2\2\u0127\u0128\7N\2\2\u0128\f"+
"\3\2\2\2\u0129\u012a\7C\2\2\u012a\u012b\7P\2\2\u012b\u012c\7C\2\2\u012c"+
"\u012d\7N\2\2\u012d\u012e\7[\2\2\u012e\u012f\7\\\2\2\u012f\u0130\7G\2"+
"\2\u0130\16\3\2\2\2\u0131\u0132\7C\2\2\u0132\u0133\7P\2\2\u0133\u0134"+
"\7C\2\2\u0134\u0135\7N\2\2\u0135\u0136\7[\2\2\u0136\u0137\7\\\2\2\u0137"+
"\u0138\7G\2\2\u0138\u0139\7F\2\2\u0139\20\3\2\2\2\u013a\u013b\7C\2\2\u013b"+
"\u013c\7P\2\2\u013c\u013d\7F\2\2\u013d\22\3\2\2\2\u013e\u013f\7C\2\2\u013f"+
"\u0140\7P\2\2\u0140\u0141\7[\2\2\u0141\24\3\2\2\2\u0142\u0143\7C\2\2\u0143"+
"\u0144\7U\2\2\u0144\26\3\2\2\2\u0145\u0146\7C\2\2\u0146\u0147\7U\2\2\u0147"+
"\u0148\7E\2\2\u0148\30\3\2\2\2\u0149\u014a\7D\2\2\u014a\u014b\7G\2\2\u014b"+
"\u014c\7V\2\2\u014c\u014d\7Y\2\2\u014d\u014e\7G\2\2\u014e\u014f\7G\2\2"+
"\u014f\u0150\7P\2\2\u0150\32\3\2\2\2\u0151\u0152\7D\2\2\u0152\u0153\7"+
"[\2\2\u0153\34\3\2\2\2\u0154\u0155\7E\2\2\u0155\u0156\7C\2\2\u0156\u0157"+
"\7U\2\2\u0157\u0158\7G\2\2\u0158\36\3\2\2\2\u0159\u015a\7E\2\2\u015a\u015b"+
"\7C\2\2\u015b\u015c\7U\2\2\u015c\u015d\7V\2\2\u015d \3\2\2\2\u015e\u015f"+
"\7E\2\2\u015f\u0160\7C\2\2\u0160\u0161\7V\2\2\u0161\u0162\7C\2\2\u0162"+
"\u0163\7N\2\2\u0163\u0164\7Q\2\2\u0164\u0165\7I\2\2\u0165\"\3\2\2\2\u0166"+
"\u0167\7E\2\2\u0167\u0168\7C\2\2\u0168\u0169\7V\2\2\u0169\u016a\7C\2\2"+
"\u016a\u016b\7N\2\2\u016b\u016c\7Q\2\2\u016c\u016d\7I\2\2\u016d\u016e"+
"\7U\2\2\u016e$\3\2\2\2\u016f\u0170\7E\2\2\u0170\u0171\7Q\2\2\u0171\u0172"+
"\7N\2\2\u0172\u0173\7W\2\2\u0173\u0174\7O\2\2\u0174\u0175\7P\2\2\u0175"+
"\u0176\7U\2\2\u0176&\3\2\2\2\u0177\u0178\7E\2\2\u0178\u0179\7Q\2\2\u0179"+
"\u017a\7P\2\2\u017a\u017b\7X\2\2\u017b\u017c\7G\2\2\u017c\u017d\7T\2\2"+
"\u017d\u017e\7V\2\2\u017e(\3\2\2\2\u017f\u0180\7E\2\2\u0180\u0181\7W\2"+
"\2\u0181\u0182\7T\2\2\u0182\u0183\7T\2\2\u0183\u0184\7G\2\2\u0184\u0185"+
"\7P\2\2\u0185\u0186\7V\2\2\u0186\u0187\7a\2\2\u0187\u0188\7F\2\2\u0188"+
"\u0189\7C\2\2\u0189\u018a\7V\2\2\u018a\u018b\7G\2\2\u018b*\3\2\2\2\u018c"+
"\u018d\7E\2\2\u018d\u018e\7W\2\2\u018e\u018f\7T\2\2\u018f\u0190\7T\2\2"+
"\u0190\u0191\7G\2\2\u0191\u0192\7P\2\2\u0192\u0193\7V\2\2\u0193\u0194"+
"\7a\2\2\u0194\u0195\7V\2\2\u0195\u0196\7K\2\2\u0196\u0197\7O\2\2\u0197"+
"\u0198\7G\2\2\u0198,\3\2\2\2\u0199\u019a\7E\2\2\u019a\u019b\7W\2\2\u019b"+
"\u019c\7T\2\2\u019c\u019d\7T\2\2\u019d\u019e\7G\2\2\u019e\u019f\7P\2\2"+
"\u019f\u01a0\7V\2\2\u01a0\u01a1\7a\2\2\u01a1\u01a2\7V\2\2\u01a2\u01a3"+
"\7K\2\2\u01a3\u01a4\7O\2\2\u01a4\u01a5\7G\2\2\u01a5\u01a6\7U\2\2\u01a6"+
"\u01a7\7V\2\2\u01a7\u01a8\7C\2\2\u01a8\u01a9\7O\2\2\u01a9\u01aa\7R\2\2"+
"\u01aa.\3\2\2\2\u01ab\u01ac\7F\2\2\u01ac\u01ad\7C\2\2\u01ad\u01ae\7[\2"+
"\2\u01ae\60\3\2\2\2\u01af\u01b0\7F\2\2\u01b0\u01b1\7C\2\2\u01b1\u01b2"+
"\7[\2\2\u01b2\u01b3\7U\2\2\u01b3\62\3\2\2\2\u01b4\u01b5\7F\2\2\u01b5\u01b6"+
"\7G\2\2\u01b6\u01b7\7D\2\2\u01b7\u01b8\7W\2\2\u01b8\u01b9\7I\2\2\u01b9"+
"\64\3\2\2\2\u01ba\u01bb\7F\2\2\u01bb\u01bc\7G\2\2\u01bc\u01bd\7U\2\2\u01bd"+
"\u01be\7E\2\2\u01be\66\3\2\2\2\u01bf\u01c0\7F\2\2\u01c0\u01c1\7G\2\2\u01c1"+
"\u01c2\7U\2\2\u01c2\u01c3\7E\2\2\u01c3\u01c4\7T\2\2\u01c4\u01c5\7K\2\2"+
"\u01c5\u01c6\7D\2\2\u01c6\u01c7\7G\2\2\u01c78\3\2\2\2\u01c8\u01c9\7F\2"+
"\2\u01c9\u01ca\7K\2\2\u01ca\u01cb\7U\2\2\u01cb\u01cc\7V\2\2\u01cc\u01cd"+
"\7K\2\2\u01cd\u01ce\7P\2\2\u01ce\u01cf\7E\2\2\u01cf\u01d0\7V\2\2\u01d0"+
":\3\2\2\2\u01d1\u01d2\7G\2\2\u01d2\u01d3\7N\2\2\u01d3\u01d4\7U\2\2\u01d4"+
"\u01d5\7G\2\2\u01d5<\3\2\2\2\u01d6\u01d7\7G\2\2\u01d7\u01d8\7P\2\2\u01d8"+
"\u01d9\7F\2\2\u01d9>\3\2\2\2\u01da\u01db\7G\2\2\u01db\u01dc\7U\2\2\u01dc"+
"\u01dd\7E\2\2\u01dd\u01de\7C\2\2\u01de\u01df\7R\2\2\u01df\u01e0\7G\2\2"+
"\u01e0@\3\2\2\2\u01e1\u01e2\7G\2\2\u01e2\u01e3\7Z\2\2\u01e3\u01e4\7G\2"+
"\2\u01e4\u01e5\7E\2\2\u01e5\u01e6\7W\2\2\u01e6\u01e7\7V\2\2\u01e7\u01e8"+
"\7C\2\2\u01e8\u01e9\7D\2\2\u01e9\u01ea\7N\2\2\u01ea\u01eb\7G\2\2\u01eb"+
"B\3\2\2\2\u01ec\u01ed\7G\2\2\u01ed\u01ee\7Z\2\2\u01ee\u01ef\7K\2\2\u01ef"+
"\u01f0\7U\2\2\u01f0\u01f1\7V\2\2\u01f1\u01f2\7U\2\2\u01f2D\3\2\2\2\u01f3"+
"\u01f4\7G\2\2\u01f4\u01f5\7Z\2\2\u01f5\u01f6\7R\2\2\u01f6\u01f7\7N\2\2"+
"\u01f7\u01f8\7C\2\2\u01f8\u01f9\7K\2\2\u01f9\u01fa\7P\2\2\u01faF\3\2\2"+
"\2\u01fb\u01fc\7G\2\2\u01fc\u01fd\7Z\2\2\u01fd\u01fe\7V\2\2\u01fe\u01ff"+
"\7T\2\2\u01ff\u0200\7C\2\2\u0200\u0201\7E\2\2\u0201\u0202\7V\2\2\u0202"+
"H\3\2\2\2\u0203\u0204\7H\2\2\u0204\u0205\7C\2\2\u0205\u0206\7N\2\2\u0206"+
"\u0207\7U\2\2\u0207\u0208\7G\2\2\u0208J\3\2\2\2\u0209\u020a\7H\2\2\u020a"+
"\u020b\7K\2\2\u020b\u020c\7T\2\2\u020c\u020d\7U\2\2\u020d\u020e\7V\2\2"+
"\u020eL\3\2\2\2\u020f\u0210\7H\2\2\u0210\u0211\7Q\2\2\u0211\u0212\7T\2"+
"\2\u0212N\3\2\2\2\u0213\u0214\7H\2\2\u0214\u0215\7Q\2\2\u0215\u0216\7"+
"T\2\2\u0216\u0217\7O\2\2\u0217\u0218\7C\2\2\u0218\u0219\7V\2\2\u0219P"+
"\3\2\2\2\u021a\u021b\7H\2\2\u021b\u021c\7T\2\2\u021c\u021d\7Q\2\2\u021d"+
"\u021e\7O\2\2\u021eR\3\2\2\2\u021f\u0220\7H\2\2\u0220\u0221\7T\2\2\u0221"+
"\u0222\7Q\2\2\u0222\u0223\7\\\2\2\u0223\u0224\7G\2\2\u0224\u0225\7P\2"+
"\2\u0225T\3\2\2\2\u0226\u0227\7H\2\2\u0227\u0228\7W\2\2\u0228\u0229\7"+
"N\2\2\u0229\u022a\7N\2\2\u022aV\3\2\2\2\u022b\u022c\7H\2\2\u022c\u022d"+
"\7W\2\2\u022d\u022e\7P\2\2\u022e\u022f\7E\2\2\u022f\u0230\7V\2\2\u0230"+
"\u0231\7K\2\2\u0231\u0232\7Q\2\2\u0232\u0233\7P\2\2\u0233\u0234\7U\2\2"+
"\u0234X\3\2\2\2\u0235\u0236\7I\2\2\u0236\u0237\7T\2\2\u0237\u0238\7C\2"+
"\2\u0238\u0239\7R\2\2\u0239\u023a\7J\2\2\u023a\u023b\7X\2\2\u023b\u023c"+
"\7K\2\2\u023c\u023d\7\\\2\2\u023dZ\3\2\2\2\u023e\u023f\7I\2\2\u023f\u0240"+
"\7T\2\2\u0240\u0241\7Q\2\2\u0241\u0242\7W\2\2\u0242\u0243\7R\2\2\u0243"+
"\\\3\2\2\2\u0244\u0245\7J\2\2\u0245\u0246\7C\2\2\u0246\u0247\7X\2\2\u0247"+
"\u0248\7K\2\2\u0248\u0249\7P\2\2\u0249\u024a\7I\2\2\u024a^\3\2\2\2\u024b"+
"\u024c\7J\2\2\u024c\u024d\7Q\2\2\u024d\u024e\7W\2\2\u024e\u024f\7T\2\2"+
"\u024f`\3\2\2\2\u0250\u0251\7J\2\2\u0251\u0252\7Q\2\2\u0252\u0253\7W\2"+
"\2\u0253\u0254\7T\2\2\u0254\u0255\7U\2\2\u0255b\3\2\2\2\u0256\u0257\7"+
"K\2\2\u0257\u0258\7P\2\2\u0258d\3\2\2\2\u0259\u025a\7K\2\2\u025a\u025b"+
"\7P\2\2\u025b\u025c\7E\2\2\u025c\u025d\7N\2\2\u025d\u025e\7W\2\2\u025e"+
"\u025f\7F\2\2\u025f\u0260\7G\2\2\u0260f\3\2\2\2\u0261\u0262\7K\2\2\u0262"+
"\u0263\7P\2\2\u0263\u0264\7P\2\2\u0264\u0265\7G\2\2\u0265\u0266\7T\2\2"+
"\u0266h\3\2\2\2\u0267\u0268\7K\2\2\u0268\u0269\7P\2\2\u0269\u026a\7V\2"+
"\2\u026a\u026b\7G\2\2\u026b\u026c\7T\2\2\u026c\u026d\7X\2\2\u026d\u026e"+
"\7C\2\2\u026e\u026f\7N\2\2\u026fj\3\2\2\2\u0270\u0271\7K\2\2\u0271\u0272"+
"\7U\2\2\u0272l\3\2\2\2\u0273\u0274\7L\2\2\u0274\u0275\7Q\2\2\u0275\u0276"+
"\7K\2\2\u0276\u0277\7P\2\2\u0277n\3\2\2\2\u0278\u0279\7N\2\2\u0279\u027a"+
"\7C\2\2\u027a\u027b\7U\2\2\u027b\u027c\7V\2\2\u027cp\3\2\2\2\u027d\u027e"+
"\7N\2\2\u027e\u027f\7G\2\2\u027f\u0280\7H\2\2\u0280\u0281\7V\2\2\u0281"+
"r\3\2\2\2\u0282\u0283\7N\2\2\u0283\u0284\7K\2\2\u0284\u0285\7M\2\2\u0285"+
"\u0286\7G\2\2\u0286t\3\2\2\2\u0287\u0288\7N\2\2\u0288\u0289\7K\2\2\u0289"+
"\u028a\7O\2\2\u028a\u028b\7K\2\2\u028b\u028c\7V\2\2\u028cv\3\2\2\2\u028d"+
"\u028e\7O\2\2\u028e\u028f\7C\2\2\u028f\u0290\7R\2\2\u0290\u0291\7R\2\2"+
"\u0291\u0292\7G\2\2\u0292\u0293\7F\2\2\u0293x\3\2\2\2\u0294\u0295\7O\2"+
"\2\u0295\u0296\7C\2\2\u0296\u0297\7V\2\2\u0297\u0298\7E\2\2\u0298\u0299"+
"\7J\2\2\u0299z\3\2\2\2\u029a\u029b\7O\2\2\u029b\u029c\7K\2\2\u029c\u029d"+
"\7P\2\2\u029d\u029e\7W\2\2\u029e\u029f\7V\2\2\u029f\u02a0\7G\2\2\u02a0"+
"|\3\2\2\2\u02a1\u02a2\7O\2\2\u02a2\u02a3\7K\2\2\u02a3\u02a4\7P\2\2\u02a4"+
"\u02a5\7W\2\2\u02a5\u02a6\7V\2\2\u02a6\u02a7\7G\2\2\u02a7\u02a8\7U\2\2"+
"\u02a8~\3\2\2\2\u02a9\u02aa\7O\2\2\u02aa\u02ab\7Q\2\2\u02ab\u02ac\7P\2"+
"\2\u02ac\u02ad\7V\2\2\u02ad\u02ae\7J\2\2\u02ae\u0080\3\2\2\2\u02af\u02b0"+
"\7O\2\2\u02b0\u02b1\7Q\2\2\u02b1\u02b2\7P\2\2\u02b2\u02b3\7V\2\2\u02b3"+
"\u02b4\7J\2\2\u02b4\u02b5\7U\2\2\u02b5\u0082\3\2\2\2\u02b6\u02b7\7P\2"+
"\2\u02b7\u02b8\7C\2\2\u02b8\u02b9\7V\2\2\u02b9\u02ba\7W\2\2\u02ba\u02bb"+
"\7T\2\2\u02bb\u02bc\7C\2\2\u02bc\u02bd\7N\2\2\u02bd\u0084\3\2\2\2\u02be"+
"\u02bf\7P\2\2\u02bf\u02c0\7Q\2\2\u02c0\u02c1\7V\2\2\u02c1\u0086\3\2\2"+
"\2\u02c2\u02c3\7P\2\2\u02c3\u02c4\7W\2\2\u02c4\u02c5\7N\2\2\u02c5\u02c6"+
"\7N\2\2\u02c6\u0088\3\2\2\2\u02c7\u02c8\7P\2\2\u02c8\u02c9\7W\2\2\u02c9"+
"\u02ca\7N\2\2\u02ca\u02cb\7N\2\2\u02cb\u02cc\7U\2\2\u02cc\u008a\3\2\2"+
"\2\u02cd\u02ce\7Q\2\2\u02ce\u02cf\7P\2\2\u02cf\u008c\3\2\2\2\u02d0\u02d1"+
"\7Q\2\2\u02d1\u02d2\7R\2\2\u02d2\u02d3\7V\2\2\u02d3\u02d4\7K\2\2\u02d4"+
"\u02d5\7O\2\2\u02d5\u02d6\7K\2\2\u02d6\u02d7\7\\\2\2\u02d7\u02d8\7G\2"+
"\2\u02d8\u02d9\7F\2\2\u02d9\u008e\3\2\2\2\u02da\u02db\7Q\2\2\u02db\u02dc"+
"\7T\2\2\u02dc\u0090\3\2\2\2\u02dd\u02de\7Q\2\2\u02de\u02df\7T\2\2\u02df"+
"\u02e0\7F\2\2\u02e0\u02e1\7G\2\2\u02e1\u02e2\7T\2\2\u02e2\u0092\3\2\2"+
"\2\u02e3\u02e4\7Q\2\2\u02e4\u02e5\7W\2\2\u02e5\u02e6\7V\2\2\u02e6\u02e7"+
"\7G\2\2\u02e7\u02e8\7T\2\2\u02e8\u0094\3\2\2\2\u02e9\u02ea\7R\2\2\u02ea"+
"\u02eb\7C\2\2\u02eb\u02ec\7T\2\2\u02ec\u02ed\7U\2\2\u02ed\u02ee\7G\2\2"+
"\u02ee\u02ef\7F\2\2\u02ef\u0096\3\2\2\2\u02f0\u02f1\7R\2\2\u02f1\u02f2"+
"\7J\2\2\u02f2\u02f3\7[\2\2\u02f3\u02f4\7U\2\2\u02f4\u02f5\7K\2\2\u02f5"+
"\u02f6\7E\2\2\u02f6\u02f7\7C\2\2\u02f7\u02f8\7N\2\2\u02f8\u0098\3\2\2"+
"\2\u02f9\u02fa\7R\2\2\u02fa\u02fb\7K\2\2\u02fb\u02fc\7X\2\2\u02fc\u02fd"+
"\7Q\2\2\u02fd\u02fe\7V\2\2\u02fe\u009a\3\2\2\2\u02ff\u0300\7R\2\2\u0300"+
"\u0301\7N\2\2\u0301\u0302\7C\2\2\u0302\u0303\7P\2\2\u0303\u009c\3\2\2"+
"\2\u0304\u0305\7T\2\2\u0305\u0306\7K\2\2\u0306\u0307\7I\2\2\u0307\u0308"+
"\7J\2\2\u0308\u0309\7V\2\2\u0309\u009e\3\2\2\2\u030a\u030b\7T\2\2\u030b"+
"\u030c\7N\2\2\u030c\u030d\7K\2\2\u030d\u030e\7M\2\2\u030e\u030f\7G\2\2"+
"\u030f\u00a0\3\2\2\2\u0310\u0311\7S\2\2\u0311\u0312\7W\2\2\u0312\u0313"+
"\7G\2\2\u0313\u0314\7T\2\2\u0314\u0315\7[\2\2\u0315\u00a2\3\2\2\2\u0316"+
"\u0317\7U\2\2\u0317\u0318\7E\2\2\u0318\u0319\7J\2\2\u0319\u031a\7G\2\2"+
"\u031a\u031b\7O\2\2\u031b\u031c\7C\2\2\u031c\u031d\7U\2\2\u031d\u00a4"+
"\3\2\2\2\u031e\u031f\7U\2\2\u031f\u0320\7G\2\2\u0320\u0321\7E\2\2\u0321"+
"\u0322\7Q\2\2\u0322\u0323\7P\2\2\u0323\u0324\7F\2\2\u0324\u00a6\3\2\2"+
"\2\u0325\u0326\7U\2\2\u0326\u0327\7G\2\2\u0327\u0328\7E\2\2\u0328\u0329"+
"\7Q\2\2\u0329\u032a\7P\2\2\u032a\u032b\7F\2\2\u032b\u032c\7U\2\2\u032c"+
"\u00a8\3\2\2\2\u032d\u032e\7U\2\2\u032e\u032f\7G\2\2\u032f\u0330\7N\2"+
"\2\u0330\u0331\7G\2\2\u0331\u0332\7E\2\2\u0332\u0333\7V\2\2\u0333\u00aa"+
"\3\2\2\2\u0334\u0335\7U\2\2\u0335\u0336\7J\2\2\u0336\u0337\7Q\2\2\u0337"+
"\u0338\7Y\2\2\u0338\u00ac\3\2\2\2\u0339\u033a\7U\2\2\u033a\u033b\7[\2"+
"\2\u033b\u033c\7U\2\2\u033c\u00ae\3\2\2\2\u033d\u033e\7V\2\2\u033e\u033f"+
"\7C\2\2\u033f\u0340\7D\2\2\u0340\u0341\7N\2\2\u0341\u0342\7G\2\2\u0342"+
"\u00b0\3\2\2\2\u0343\u0344\7V\2\2\u0344\u0345\7C\2\2\u0345\u0346\7D\2"+
"\2\u0346\u0347\7N\2\2\u0347\u0348\7G\2\2\u0348\u0349\7U\2\2\u0349\u00b2"+
"\3\2\2\2\u034a\u034b\7V\2\2\u034b\u034c\7G\2\2\u034c\u034d\7Z\2\2\u034d"+
"\u034e\7V\2\2\u034e\u00b4\3\2\2\2\u034f\u0350\7V\2\2\u0350\u0351\7J\2"+
"\2\u0351\u0352\7G\2\2\u0352\u0353\7P\2\2\u0353\u00b6\3\2\2\2\u0354\u0355"+
"\7V\2\2\u0355\u0356\7T\2\2\u0356\u0357\7W\2\2\u0357\u0358\7G\2\2\u0358"+
"\u00b8\3\2\2\2\u0359\u035a\7V\2\2\u035a\u035b\7Q\2\2\u035b\u00ba\3\2\2"+
"\2\u035c\u035d\7V\2\2\u035d\u035e\7[\2\2\u035e\u035f\7R\2\2\u035f\u0360"+
"\7G\2\2\u0360\u00bc\3\2\2\2\u0361\u0362\7V\2\2\u0362\u0363\7[\2\2\u0363"+
"\u0364\7R\2\2\u0364\u0365\7G\2\2\u0365\u0366\7U\2\2\u0366\u00be\3\2\2"+
"\2\u0367\u0368\7W\2\2\u0368\u0369\7U\2\2\u0369\u036a\7K\2\2\u036a\u036b"+
"\7P\2\2\u036b\u036c\7I\2\2\u036c\u00c0\3\2\2\2\u036d\u036e\7X\2\2\u036e"+
"\u036f\7G\2\2\u036f\u0370\7T\2\2\u0370\u0371\7K\2\2\u0371\u0372\7H\2\2"+
"\u0372\u0373\7[\2\2\u0373\u00c2\3\2\2\2\u0374\u0375\7Y\2\2\u0375\u0376"+
"\7J\2\2\u0376\u0377\7G\2\2\u0377\u0378\7P\2\2\u0378\u00c4\3\2\2\2\u0379"+
"\u037a\7Y\2\2\u037a\u037b\7J\2\2\u037b\u037c\7G\2\2\u037c\u037d\7T\2\2"+
"\u037d\u037e\7G\2\2\u037e\u00c6\3\2\2\2\u037f\u0380\7Y\2\2\u0380\u0381"+
"\7K\2\2\u0381\u0382\7V\2\2\u0382\u0383\7J\2\2\u0383\u00c8\3\2\2\2\u0384"+
"\u0385\7[\2\2\u0385\u0386\7G\2\2\u0386\u0387\7C\2\2\u0387\u0388\7T\2\2"+
"\u0388\u00ca\3\2\2\2\u0389\u038a\7[\2\2\u038a\u038b\7G\2\2\u038b\u038c"+
"\7C\2\2\u038c\u038d\7T\2\2\u038d\u038e\7U\2\2\u038e\u00cc\3\2\2\2\u038f"+
"\u0390\5\u00dbn\2\u0390\u0391\7G\2\2\u0391\u0392\7U\2\2\u0392\u0393\7"+
"E\2\2\u0393\u0394\7C\2\2\u0394\u0395\7R\2\2\u0395\u0396\7G\2\2\u0396\u00ce"+
"\3\2\2\2\u0397\u0398\5\u00dbn\2\u0398\u0399\7H\2\2\u0399\u039a\7P\2\2"+
"\u039a\u00d0\3\2\2\2\u039b\u039c\5\u00dbn\2\u039c\u039d\7N\2\2\u039d\u039e"+
"\7K\2\2\u039e\u039f\7O\2\2\u039f\u03a0\7K\2\2\u03a0\u03a1\7V\2\2\u03a1"+
"\u00d2\3\2\2\2\u03a2\u03a3\5\u00dbn\2\u03a3\u03a4\7F\2\2\u03a4\u00d4\3"+
"\2\2\2\u03a5\u03a6\5\u00dbn\2\u03a6\u03a7\7V\2\2\u03a7\u00d6\3\2\2\2\u03a8"+
"\u03a9\5\u00dbn\2\u03a9\u03aa\7V\2\2\u03aa\u03ab\7U\2\2\u03ab\u00d8\3"+
"\2\2\2\u03ac\u03ad\5\u00dbn\2\u03ad\u03ae\7I\2\2\u03ae\u03af\7W\2\2\u03af"+
"\u03b0\7K\2\2\u03b0\u03b1\7F\2\2\u03b1\u00da\3\2\2\2\u03b2\u03b6\7}\2"+
"\2\u03b3\u03b5\5\u0119\u008d\2\u03b4\u03b3\3\2\2\2\u03b5\u03b8\3\2\2\2"+
"\u03b6\u03b4\3\2\2\2\u03b6\u03b7\3\2\2\2\u03b7\u00dc\3\2\2\2\u03b8\u03b6"+
"\3\2\2\2\u03b9\u03ba\7\177\2\2\u03ba\u00de\3\2\2\2\u03bb\u03bc\7?\2\2"+
"\u03bc\u00e0\3\2\2\2\u03bd\u03be\7>\2\2\u03be\u03bf\7?\2\2\u03bf\u03c0"+
"\7@\2\2\u03c0\u00e2\3\2\2\2\u03c1\u03c2\7>\2\2\u03c2\u03c6\7@\2\2\u03c3"+
"\u03c4\7#\2\2\u03c4\u03c6\7?\2\2\u03c5\u03c1\3\2\2\2\u03c5\u03c3\3\2\2"+
"\2\u03c6\u00e4\3\2\2\2\u03c7\u03c8\7>\2\2\u03c8\u00e6\3\2\2\2\u03c9\u03ca"+
"\7>\2\2\u03ca\u03cb\7?\2\2\u03cb\u00e8\3\2\2\2\u03cc\u03cd\7@\2\2\u03cd"+
"\u00ea\3\2\2\2\u03ce\u03cf\7@\2\2\u03cf\u03d0\7?\2\2\u03d0\u00ec\3\2\2"+
"\2\u03d1\u03d2\7-\2\2\u03d2\u00ee\3\2\2\2\u03d3\u03d4\7/\2\2\u03d4\u00f0"+
"\3\2\2\2\u03d5\u03d6\7,\2\2\u03d6\u00f2\3\2\2\2\u03d7\u03d8\7\61\2\2\u03d8"+
"\u00f4\3\2\2\2\u03d9\u03da\7\'\2\2\u03da\u00f6\3\2\2\2\u03db\u03dc\7<"+
"\2\2\u03dc\u03dd\7<\2\2\u03dd\u00f8\3\2\2\2\u03de\u03df\7~\2\2\u03df\u03e0"+
"\7~\2\2\u03e0\u00fa\3\2\2\2\u03e1\u03e2\7\60\2\2\u03e2\u00fc\3\2\2\2\u03e3"+
"\u03e4\7A\2\2\u03e4\u00fe\3\2\2\2\u03e5\u03eb\7)\2\2\u03e6\u03ea\n\2\2"+
"\2\u03e7\u03e8\7)\2\2\u03e8\u03ea\7)\2\2\u03e9\u03e6\3\2\2\2\u03e9\u03e7"+
"\3\2\2\2\u03ea\u03ed\3\2\2\2\u03eb\u03e9\3\2\2\2\u03eb\u03ec\3\2\2\2\u03ec"+
"\u03ee\3\2\2\2\u03ed\u03eb\3\2\2\2\u03ee\u03ef\7)\2\2\u03ef\u0100\3\2"+
"\2\2\u03f0\u03f2\5\u0111\u0089\2\u03f1\u03f0\3\2\2\2\u03f2\u03f3\3\2\2"+
"\2\u03f3\u03f1\3\2\2\2\u03f3\u03f4\3\2\2\2\u03f4\u0102\3\2\2\2\u03f5\u03f7"+
"\5\u0111\u0089\2\u03f6\u03f5\3\2\2\2\u03f7\u03f8\3\2\2\2\u03f8\u03f6\3"+
"\2\2\2\u03f8\u03f9\3\2\2\2\u03f9\u03fa\3\2\2\2\u03fa\u03fe\5\u00fb~\2"+
"\u03fb\u03fd\5\u0111\u0089\2\u03fc\u03fb\3\2\2\2\u03fd\u0400\3\2\2\2\u03fe"+
"\u03fc\3\2\2\2\u03fe\u03ff\3\2\2\2\u03ff\u0420\3\2\2\2\u0400\u03fe\3\2"+
"\2\2\u0401\u0403\5\u00fb~\2\u0402\u0404\5\u0111\u0089\2\u0403\u0402\3"+
"\2\2\2\u0404\u0405\3\2\2\2\u0405\u0403\3\2\2\2\u0405\u0406\3\2\2\2\u0406"+
"\u0420\3\2\2\2\u0407\u0409\5\u0111\u0089\2\u0408\u0407\3\2\2\2\u0409\u040a"+
"\3\2\2\2\u040a\u0408\3\2\2\2\u040a\u040b\3\2\2\2\u040b\u0413\3\2\2\2\u040c"+
"\u0410\5\u00fb~\2\u040d\u040f\5\u0111\u0089\2\u040e\u040d\3\2\2\2\u040f"+
"\u0412\3\2\2\2\u0410\u040e\3\2\2\2\u0410\u0411\3\2\2\2\u0411\u0414\3\2"+
"\2\2\u0412\u0410\3\2\2\2\u0413\u040c\3\2\2\2\u0413\u0414\3\2\2\2\u0414"+
"\u0415\3\2\2\2\u0415\u0416\5\u010f\u0088\2\u0416\u0420\3\2\2\2\u0417\u0419"+
"\5\u00fb~\2\u0418\u041a\5\u0111\u0089\2\u0419\u0418\3\2\2\2\u041a\u041b"+
"\3\2\2\2\u041b\u0419\3\2\2\2\u041b\u041c\3\2\2\2\u041c\u041d\3\2\2\2\u041d"+
"\u041e\5\u010f\u0088\2\u041e\u0420\3\2\2\2\u041f\u03f6\3\2\2\2\u041f\u0401"+
"\3\2\2\2\u041f\u0408\3\2\2\2\u041f\u0417\3\2\2\2\u0420\u0104\3\2\2\2\u0421"+
"\u0424\5\u0113\u008a\2\u0422\u0424\7a\2\2\u0423\u0421\3\2\2\2\u0423\u0422"+
"\3\2\2\2\u0424\u042a\3\2\2\2\u0425\u0429\5\u0113\u008a\2\u0426\u0429\5"+
"\u0111\u0089\2\u0427\u0429\t\3\2\2\u0428\u0425\3\2\2\2\u0428\u0426\3\2"+
"\2\2\u0428\u0427\3\2\2\2\u0429\u042c\3\2\2\2\u042a\u0428\3\2\2\2\u042a"+
"\u042b\3\2\2\2\u042b\u0106\3\2\2\2\u042c\u042a\3\2\2\2\u042d\u0431\5\u0111"+
"\u0089\2\u042e\u0432\5\u0113\u008a\2\u042f\u0432\5\u0111\u0089\2\u0430"+
"\u0432\t\3\2\2\u0431\u042e\3\2\2\2\u0431\u042f\3\2\2\2\u0431\u0430\3\2"+
"\2\2\u0432\u0433\3\2\2\2\u0433\u0431\3\2\2\2\u0433\u0434\3\2\2\2\u0434"+
"\u0108\3\2\2\2\u0435\u0439\5\u0113\u008a\2\u0436\u0439\5\u0111\u0089\2"+
"\u0437\u0439\7a\2\2\u0438\u0435\3\2\2\2\u0438\u0436\3\2\2\2\u0438\u0437"+
"\3\2\2\2\u0439\u043a\3\2\2\2\u043a\u0438\3\2\2\2\u043a\u043b\3\2\2\2\u043b"+
"\u010a\3\2\2\2\u043c\u0442\7$\2\2\u043d\u0441\n\4\2\2\u043e\u043f\7$\2"+
"\2\u043f\u0441\7$\2\2\u0440\u043d\3\2\2\2\u0440\u043e\3\2\2\2\u0441\u0444"+
"\3\2\2\2\u0442\u0440\3\2\2\2\u0442\u0443\3\2\2\2\u0443\u0445\3\2\2\2\u0444"+
"\u0442\3\2\2\2\u0445\u0446\7$\2\2\u0446\u010c\3\2\2\2\u0447\u044d\7b\2"+
"\2\u0448\u044c\n\5\2\2\u0449\u044a\7b\2\2\u044a\u044c\7b\2\2\u044b\u0448"+
"\3\2\2\2\u044b\u0449\3\2\2\2\u044c\u044f\3\2\2\2\u044d\u044b\3\2\2\2\u044d"+
"\u044e\3\2\2\2\u044e\u0450\3\2\2\2\u044f\u044d\3\2\2\2\u0450\u0451\7b"+
"\2\2\u0451\u010e\3\2\2\2\u0452\u0454\7G\2\2\u0453\u0455\t\6\2\2\u0454"+
"\u0453\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u0457\3\2\2\2\u0456\u0458\5\u0111"+
"\u0089\2\u0457\u0456\3\2\2\2\u0458\u0459\3\2\2\2\u0459\u0457\3\2\2\2\u0459"+
"\u045a\3\2\2\2\u045a\u0110\3\2\2\2\u045b\u045c\t\7\2\2\u045c\u0112\3\2"+
"\2\2\u045d\u045e\t\b\2\2\u045e\u0114\3\2\2\2\u045f\u0460\7/\2\2\u0460"+
"\u0461\7/\2\2\u0461\u0465\3\2\2\2\u0462\u0464\n\t\2\2\u0463\u0462\3\2"+
"\2\2\u0464\u0467\3\2\2\2\u0465\u0463\3\2\2\2\u0465\u0466\3\2\2\2\u0466"+
"\u0469\3\2\2\2\u0467\u0465\3\2\2\2\u0468\u046a\7\17\2\2\u0469\u0468\3"+
"\2\2\2\u0469\u046a\3\2\2\2\u046a\u046c\3\2\2\2\u046b\u046d\7\f\2\2\u046c"+
"\u046b\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u046e\3\2\2\2\u046e\u046f\b\u008b"+
"\2\2\u046f\u0116\3\2\2\2\u0470\u0471\7\61\2\2\u0471\u0472\7,\2\2\u0472"+
"\u0477\3\2\2\2\u0473\u0476\5\u0117\u008c\2\u0474\u0476\13\2\2\2\u0475"+
"\u0473\3\2\2\2\u0475\u0474\3\2\2\2\u0476\u0479\3\2\2\2\u0477\u0478\3\2"+
"\2\2\u0477\u0475\3\2\2\2\u0478\u047a\3\2\2\2\u0479\u0477\3\2\2\2\u047a"+
"\u047b\7,\2\2\u047b\u047c\7\61\2\2\u047c\u047d\3\2\2\2\u047d\u047e\b\u008c"+
"\2\2\u047e\u0118\3\2\2\2\u047f\u0481\t\n\2\2\u0480\u047f\3\2\2\2\u0481"+
"\u0482\3\2\2\2\u0482\u0480\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u0484\3\2"+
"\2\2\u0484\u0485\b\u008d\2\2\u0485\u011a\3\2\2\2\u0486\u0487\13\2\2\2"+
"\u0487\u011c\3\2\2\2#\2\u03b6\u03c5\u03e9\u03eb\u03f3\u03f8\u03fe\u0405"+
"\u040a\u0410\u0413\u041b\u041f\u0423\u0428\u042a\u0431\u0433\u0438\u043a"+
"\u0440\u0442\u044b\u044d\u0454\u0459\u0465\u0469\u046c\u0475\u0477\u0482"+
"\3\2\3\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -32,12 +32,12 @@ class SqlBaseParser extends Parser {
TABLES=88, TEXT=89, THEN=90, TRUE=91, TO=92, TYPE=93, TYPES=94, USING=95,
VERIFY=96, WHEN=97, WHERE=98, WITH=99, YEAR=100, YEARS=101, ESCAPE_ESC=102,
FUNCTION_ESC=103, LIMIT_ESC=104, DATE_ESC=105, TIME_ESC=106, TIMESTAMP_ESC=107,
GUID_ESC=108, ESC_END=109, EQ=110, NULLEQ=111, NEQ=112, LT=113, LTE=114,
GT=115, GTE=116, PLUS=117, MINUS=118, ASTERISK=119, SLASH=120, PERCENT=121,
CAST_OP=122, CONCAT=123, DOT=124, PARAM=125, STRING=126, INTEGER_VALUE=127,
DECIMAL_VALUE=128, IDENTIFIER=129, DIGIT_IDENTIFIER=130, TABLE_IDENTIFIER=131,
QUOTED_IDENTIFIER=132, BACKQUOTED_IDENTIFIER=133, SIMPLE_COMMENT=134,
BRACKETED_COMMENT=135, WS=136, UNRECOGNIZED=137, DELIMITER=138;
GUID_ESC=108, ESC_START=109, ESC_END=110, EQ=111, NULLEQ=112, NEQ=113,
LT=114, LTE=115, GT=116, GTE=117, PLUS=118, MINUS=119, ASTERISK=120, SLASH=121,
PERCENT=122, CAST_OP=123, CONCAT=124, DOT=125, PARAM=126, STRING=127,
INTEGER_VALUE=128, DECIMAL_VALUE=129, IDENTIFIER=130, DIGIT_IDENTIFIER=131,
TABLE_IDENTIFIER=132, QUOTED_IDENTIFIER=133, BACKQUOTED_IDENTIFIER=134,
SIMPLE_COMMENT=135, BRACKETED_COMMENT=136, WS=137, UNRECOGNIZED=138, DELIMITER=139;
public static final int
RULE_singleStatement = 0, RULE_singleExpression = 1, RULE_statement = 2,
RULE_query = 3, RULE_queryNoWith = 4, RULE_limitClause = 5, RULE_queryTerm = 6,
@ -89,9 +89,9 @@ class SqlBaseParser extends Parser {
"'QUERY'", "'SCHEMAS'", "'SECOND'", "'SECONDS'", "'SELECT'", "'SHOW'",
"'SYS'", "'TABLE'", "'TABLES'", "'TEXT'", "'THEN'", "'TRUE'", "'TO'",
"'TYPE'", "'TYPES'", "'USING'", "'VERIFY'", "'WHEN'", "'WHERE'", "'WITH'",
"'YEAR'", "'YEARS'", "'{ESCAPE'", "'{FN'", "'{LIMIT'", "'{D'", "'{T'",
"'{TS'", "'{GUID'", "'}'", "'='", "'<=>'", null, "'<'", "'<='", "'>'",
"'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'::'", "'||'", "'.'", "'?'"
"'YEAR'", "'YEARS'", null, null, null, null, null, null, null, null, "'}'",
"'='", "'<=>'", null, "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'",
"'/'", "'%'", "'::'", "'||'", "'.'", "'?'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
@ -108,11 +108,12 @@ class SqlBaseParser extends Parser {
"SYS", "TABLE", "TABLES", "TEXT", "THEN", "TRUE", "TO", "TYPE", "TYPES",
"USING", "VERIFY", "WHEN", "WHERE", "WITH", "YEAR", "YEARS", "ESCAPE_ESC",
"FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC",
"GUID_ESC", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE", "GT", "GTE",
"PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP", "CONCAT",
"DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER",
"DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER",
"SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED", "DELIMITER"
"GUID_ESC", "ESC_START", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE",
"GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP",
"CONCAT", "DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE",
"IDENTIFIER", "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER",
"BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS",
"UNRECOGNIZED", "DELIMITER"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -1215,7 +1216,7 @@ class SqlBaseParser extends Parser {
match(TYPES);
setState(235);
_la = _input.LA(1);
if (((((_la - 117)) & ~0x3f) == 0 && ((1L << (_la - 117)) & ((1L << (PLUS - 117)) | (1L << (MINUS - 117)) | (1L << (INTEGER_VALUE - 117)) | (1L << (DECIMAL_VALUE - 117)))) != 0)) {
if (((((_la - 118)) & ~0x3f) == 0 && ((1L << (_la - 118)) & ((1L << (PLUS - 118)) | (1L << (MINUS - 118)) | (1L << (INTEGER_VALUE - 118)) | (1L << (DECIMAL_VALUE - 118)))) != 0)) {
{
setState(232);
_la = _input.LA(1);
@ -2050,7 +2051,7 @@ class SqlBaseParser extends Parser {
match(T__0);
setState(345);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CASE) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CONVERT) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LEFT) | (1L << LIMIT) | (1L << MAPPED) | (1L << MATCH) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (NOT - 66)) | (1L << (NULL - 66)) | (1L << (OPTIMIZED - 66)) | (1L << (PARSED - 66)) | (1L << (PHYSICAL - 66)) | (1L << (PIVOT - 66)) | (1L << (PLAN - 66)) | (1L << (RIGHT - 66)) | (1L << (RLIKE - 66)) | (1L << (QUERY - 66)) | (1L << (SCHEMAS - 66)) | (1L << (SECOND - 66)) | (1L << (SHOW - 66)) | (1L << (SYS - 66)) | (1L << (TABLES - 66)) | (1L << (TEXT - 66)) | (1L << (TRUE - 66)) | (1L << (TYPE - 66)) | (1L << (TYPES - 66)) | (1L << (VERIFY - 66)) | (1L << (YEAR - 66)) | (1L << (FUNCTION_ESC - 66)) | (1L << (DATE_ESC - 66)) | (1L << (TIME_ESC - 66)) | (1L << (TIMESTAMP_ESC - 66)) | (1L << (GUID_ESC - 66)) | (1L << (PLUS - 66)) | (1L << (MINUS - 66)) | (1L << (ASTERISK - 66)) | (1L << (PARAM - 66)) | (1L << (STRING - 66)) | (1L << (INTEGER_VALUE - 66)) | (1L << (DECIMAL_VALUE - 66)) | (1L << (IDENTIFIER - 66)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (DIGIT_IDENTIFIER - 130)) | (1L << (QUOTED_IDENTIFIER - 130)) | (1L << (BACKQUOTED_IDENTIFIER - 130)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CASE) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CONVERT) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LEFT) | (1L << LIMIT) | (1L << MAPPED) | (1L << MATCH) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (NOT - 66)) | (1L << (NULL - 66)) | (1L << (OPTIMIZED - 66)) | (1L << (PARSED - 66)) | (1L << (PHYSICAL - 66)) | (1L << (PIVOT - 66)) | (1L << (PLAN - 66)) | (1L << (RIGHT - 66)) | (1L << (RLIKE - 66)) | (1L << (QUERY - 66)) | (1L << (SCHEMAS - 66)) | (1L << (SECOND - 66)) | (1L << (SHOW - 66)) | (1L << (SYS - 66)) | (1L << (TABLES - 66)) | (1L << (TEXT - 66)) | (1L << (TRUE - 66)) | (1L << (TYPE - 66)) | (1L << (TYPES - 66)) | (1L << (VERIFY - 66)) | (1L << (YEAR - 66)) | (1L << (FUNCTION_ESC - 66)) | (1L << (DATE_ESC - 66)) | (1L << (TIME_ESC - 66)) | (1L << (TIMESTAMP_ESC - 66)) | (1L << (GUID_ESC - 66)) | (1L << (PLUS - 66)) | (1L << (MINUS - 66)) | (1L << (ASTERISK - 66)) | (1L << (PARAM - 66)) | (1L << (STRING - 66)) | (1L << (INTEGER_VALUE - 66)) | (1L << (DECIMAL_VALUE - 66)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (IDENTIFIER - 130)) | (1L << (DIGIT_IDENTIFIER - 130)) | (1L << (QUOTED_IDENTIFIER - 130)) | (1L << (BACKQUOTED_IDENTIFIER - 130)))) != 0)) {
{
setState(337);
expression();
@ -3080,7 +3081,7 @@ class SqlBaseParser extends Parser {
valueExpression(0);
setState(481);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LIMIT) | (1L << MAPPED) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (OPTIMIZED - 70)) | (1L << (PARSED - 70)) | (1L << (PHYSICAL - 70)) | (1L << (PIVOT - 70)) | (1L << (PLAN - 70)) | (1L << (RLIKE - 70)) | (1L << (QUERY - 70)) | (1L << (SCHEMAS - 70)) | (1L << (SECOND - 70)) | (1L << (SHOW - 70)) | (1L << (SYS - 70)) | (1L << (TABLES - 70)) | (1L << (TEXT - 70)) | (1L << (TYPE - 70)) | (1L << (TYPES - 70)) | (1L << (VERIFY - 70)) | (1L << (YEAR - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DIGIT_IDENTIFIER - 70)) | (1L << (QUOTED_IDENTIFIER - 70)) | (1L << (BACKQUOTED_IDENTIFIER - 70)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LIMIT) | (1L << MAPPED) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (OPTIMIZED - 70)) | (1L << (PARSED - 70)) | (1L << (PHYSICAL - 70)) | (1L << (PIVOT - 70)) | (1L << (PLAN - 70)) | (1L << (RLIKE - 70)) | (1L << (QUERY - 70)) | (1L << (SCHEMAS - 70)) | (1L << (SECOND - 70)) | (1L << (SHOW - 70)) | (1L << (SYS - 70)) | (1L << (TABLES - 70)) | (1L << (TEXT - 70)) | (1L << (TYPE - 70)) | (1L << (TYPES - 70)) | (1L << (VERIFY - 70)) | (1L << (YEAR - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DIGIT_IDENTIFIER - 70)) | (1L << (QUOTED_IDENTIFIER - 70)))) != 0) || _la==BACKQUOTED_IDENTIFIER) {
{
setState(478);
_la = _input.LA(1);
@ -3938,6 +3939,7 @@ class SqlBaseParser extends Parser {
return getRuleContext(StringContext.class,0);
}
public TerminalNode ESCAPE_ESC() { return getToken(SqlBaseParser.ESCAPE_ESC, 0); }
public TerminalNode ESC_END() { return getToken(SqlBaseParser.ESC_END, 0); }
public PatternEscapeContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@ -4242,7 +4244,7 @@ class SqlBaseParser extends Parser {
setState(610);
((ArithmeticBinaryContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !(((((_la - 119)) & ~0x3f) == 0 && ((1L << (_la - 119)) & ((1L << (ASTERISK - 119)) | (1L << (SLASH - 119)) | (1L << (PERCENT - 119)))) != 0)) ) {
if ( !(((((_la - 120)) & ~0x3f) == 0 && ((1L << (_la - 120)) & ((1L << (ASTERISK - 120)) | (1L << (SLASH - 120)) | (1L << (PERCENT - 120)))) != 0)) ) {
((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
} else {
consume();
@ -4607,7 +4609,7 @@ class SqlBaseParser extends Parser {
_prevctx = _localctx;
setState(632);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LIMIT) | (1L << MAPPED) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (OPTIMIZED - 70)) | (1L << (PARSED - 70)) | (1L << (PHYSICAL - 70)) | (1L << (PIVOT - 70)) | (1L << (PLAN - 70)) | (1L << (RLIKE - 70)) | (1L << (QUERY - 70)) | (1L << (SCHEMAS - 70)) | (1L << (SECOND - 70)) | (1L << (SHOW - 70)) | (1L << (SYS - 70)) | (1L << (TABLES - 70)) | (1L << (TEXT - 70)) | (1L << (TYPE - 70)) | (1L << (TYPES - 70)) | (1L << (VERIFY - 70)) | (1L << (YEAR - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DIGIT_IDENTIFIER - 70)) | (1L << (QUOTED_IDENTIFIER - 70)) | (1L << (BACKQUOTED_IDENTIFIER - 70)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LIMIT) | (1L << MAPPED) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (OPTIMIZED - 70)) | (1L << (PARSED - 70)) | (1L << (PHYSICAL - 70)) | (1L << (PIVOT - 70)) | (1L << (PLAN - 70)) | (1L << (RLIKE - 70)) | (1L << (QUERY - 70)) | (1L << (SCHEMAS - 70)) | (1L << (SECOND - 70)) | (1L << (SHOW - 70)) | (1L << (SYS - 70)) | (1L << (TABLES - 70)) | (1L << (TEXT - 70)) | (1L << (TYPE - 70)) | (1L << (TYPES - 70)) | (1L << (VERIFY - 70)) | (1L << (YEAR - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DIGIT_IDENTIFIER - 70)) | (1L << (QUOTED_IDENTIFIER - 70)))) != 0) || _la==BACKQUOTED_IDENTIFIER) {
{
setState(629);
qualifiedName();
@ -4673,7 +4675,7 @@ class SqlBaseParser extends Parser {
match(CASE);
setState(647);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CASE) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CONVERT) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LEFT) | (1L << LIMIT) | (1L << MAPPED) | (1L << MATCH) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (NOT - 66)) | (1L << (NULL - 66)) | (1L << (OPTIMIZED - 66)) | (1L << (PARSED - 66)) | (1L << (PHYSICAL - 66)) | (1L << (PIVOT - 66)) | (1L << (PLAN - 66)) | (1L << (RIGHT - 66)) | (1L << (RLIKE - 66)) | (1L << (QUERY - 66)) | (1L << (SCHEMAS - 66)) | (1L << (SECOND - 66)) | (1L << (SHOW - 66)) | (1L << (SYS - 66)) | (1L << (TABLES - 66)) | (1L << (TEXT - 66)) | (1L << (TRUE - 66)) | (1L << (TYPE - 66)) | (1L << (TYPES - 66)) | (1L << (VERIFY - 66)) | (1L << (YEAR - 66)) | (1L << (FUNCTION_ESC - 66)) | (1L << (DATE_ESC - 66)) | (1L << (TIME_ESC - 66)) | (1L << (TIMESTAMP_ESC - 66)) | (1L << (GUID_ESC - 66)) | (1L << (PLUS - 66)) | (1L << (MINUS - 66)) | (1L << (ASTERISK - 66)) | (1L << (PARAM - 66)) | (1L << (STRING - 66)) | (1L << (INTEGER_VALUE - 66)) | (1L << (DECIMAL_VALUE - 66)) | (1L << (IDENTIFIER - 66)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (DIGIT_IDENTIFIER - 130)) | (1L << (QUOTED_IDENTIFIER - 130)) | (1L << (BACKQUOTED_IDENTIFIER - 130)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CASE) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CONVERT) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LEFT) | (1L << LIMIT) | (1L << MAPPED) | (1L << MATCH) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (NOT - 66)) | (1L << (NULL - 66)) | (1L << (OPTIMIZED - 66)) | (1L << (PARSED - 66)) | (1L << (PHYSICAL - 66)) | (1L << (PIVOT - 66)) | (1L << (PLAN - 66)) | (1L << (RIGHT - 66)) | (1L << (RLIKE - 66)) | (1L << (QUERY - 66)) | (1L << (SCHEMAS - 66)) | (1L << (SECOND - 66)) | (1L << (SHOW - 66)) | (1L << (SYS - 66)) | (1L << (TABLES - 66)) | (1L << (TEXT - 66)) | (1L << (TRUE - 66)) | (1L << (TYPE - 66)) | (1L << (TYPES - 66)) | (1L << (VERIFY - 66)) | (1L << (YEAR - 66)) | (1L << (FUNCTION_ESC - 66)) | (1L << (DATE_ESC - 66)) | (1L << (TIME_ESC - 66)) | (1L << (TIMESTAMP_ESC - 66)) | (1L << (GUID_ESC - 66)) | (1L << (PLUS - 66)) | (1L << (MINUS - 66)) | (1L << (ASTERISK - 66)) | (1L << (PARAM - 66)) | (1L << (STRING - 66)) | (1L << (INTEGER_VALUE - 66)) | (1L << (DECIMAL_VALUE - 66)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (IDENTIFIER - 130)) | (1L << (DIGIT_IDENTIFIER - 130)) | (1L << (QUOTED_IDENTIFIER - 130)) | (1L << (BACKQUOTED_IDENTIFIER - 130)))) != 0)) {
{
setState(646);
((CaseContext)_localctx).operand = booleanExpression(0);
@ -5144,6 +5146,7 @@ class SqlBaseParser extends Parser {
return getRuleContext(FunctionTemplateContext.class,0);
}
public TerminalNode FUNCTION_ESC() { return getToken(SqlBaseParser.FUNCTION_ESC, 0); }
public TerminalNode ESC_END() { return getToken(SqlBaseParser.ESC_END, 0); }
public FunctionExpressionContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@ -5292,7 +5295,7 @@ class SqlBaseParser extends Parser {
match(T__0);
setState(735);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ALL) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CASE) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CONVERT) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << DISTINCT) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LEFT) | (1L << LIMIT) | (1L << MAPPED) | (1L << MATCH) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (NOT - 66)) | (1L << (NULL - 66)) | (1L << (OPTIMIZED - 66)) | (1L << (PARSED - 66)) | (1L << (PHYSICAL - 66)) | (1L << (PIVOT - 66)) | (1L << (PLAN - 66)) | (1L << (RIGHT - 66)) | (1L << (RLIKE - 66)) | (1L << (QUERY - 66)) | (1L << (SCHEMAS - 66)) | (1L << (SECOND - 66)) | (1L << (SHOW - 66)) | (1L << (SYS - 66)) | (1L << (TABLES - 66)) | (1L << (TEXT - 66)) | (1L << (TRUE - 66)) | (1L << (TYPE - 66)) | (1L << (TYPES - 66)) | (1L << (VERIFY - 66)) | (1L << (YEAR - 66)) | (1L << (FUNCTION_ESC - 66)) | (1L << (DATE_ESC - 66)) | (1L << (TIME_ESC - 66)) | (1L << (TIMESTAMP_ESC - 66)) | (1L << (GUID_ESC - 66)) | (1L << (PLUS - 66)) | (1L << (MINUS - 66)) | (1L << (ASTERISK - 66)) | (1L << (PARAM - 66)) | (1L << (STRING - 66)) | (1L << (INTEGER_VALUE - 66)) | (1L << (DECIMAL_VALUE - 66)) | (1L << (IDENTIFIER - 66)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (DIGIT_IDENTIFIER - 130)) | (1L << (QUOTED_IDENTIFIER - 130)) | (1L << (BACKQUOTED_IDENTIFIER - 130)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ALL) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CASE) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CONVERT) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << DISTINCT) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LEFT) | (1L << LIMIT) | (1L << MAPPED) | (1L << MATCH) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (NOT - 66)) | (1L << (NULL - 66)) | (1L << (OPTIMIZED - 66)) | (1L << (PARSED - 66)) | (1L << (PHYSICAL - 66)) | (1L << (PIVOT - 66)) | (1L << (PLAN - 66)) | (1L << (RIGHT - 66)) | (1L << (RLIKE - 66)) | (1L << (QUERY - 66)) | (1L << (SCHEMAS - 66)) | (1L << (SECOND - 66)) | (1L << (SHOW - 66)) | (1L << (SYS - 66)) | (1L << (TABLES - 66)) | (1L << (TEXT - 66)) | (1L << (TRUE - 66)) | (1L << (TYPE - 66)) | (1L << (TYPES - 66)) | (1L << (VERIFY - 66)) | (1L << (YEAR - 66)) | (1L << (FUNCTION_ESC - 66)) | (1L << (DATE_ESC - 66)) | (1L << (TIME_ESC - 66)) | (1L << (TIMESTAMP_ESC - 66)) | (1L << (GUID_ESC - 66)) | (1L << (PLUS - 66)) | (1L << (MINUS - 66)) | (1L << (ASTERISK - 66)) | (1L << (PARAM - 66)) | (1L << (STRING - 66)) | (1L << (INTEGER_VALUE - 66)) | (1L << (DECIMAL_VALUE - 66)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (IDENTIFIER - 130)) | (1L << (DIGIT_IDENTIFIER - 130)) | (1L << (QUOTED_IDENTIFIER - 130)) | (1L << (BACKQUOTED_IDENTIFIER - 130)))) != 0)) {
{
setState(725);
_la = _input.LA(1);
@ -5830,7 +5833,7 @@ class SqlBaseParser extends Parser {
{
setState(772);
_la = _input.LA(1);
if ( !(((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (EQ - 110)) | (1L << (NULLEQ - 110)) | (1L << (NEQ - 110)) | (1L << (LT - 110)) | (1L << (LTE - 110)) | (1L << (GT - 110)) | (1L << (GTE - 110)))) != 0)) ) {
if ( !(((((_la - 111)) & ~0x3f) == 0 && ((1L << (_la - 111)) & ((1L << (EQ - 111)) | (1L << (NULLEQ - 111)) | (1L << (NEQ - 111)) | (1L << (LT - 111)) | (1L << (LTE - 111)) | (1L << (GT - 111)) | (1L << (GTE - 111)))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
@ -6335,7 +6338,7 @@ class SqlBaseParser extends Parser {
{
setState(810);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LIMIT) | (1L << MAPPED) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (OPTIMIZED - 70)) | (1L << (PARSED - 70)) | (1L << (PHYSICAL - 70)) | (1L << (PIVOT - 70)) | (1L << (PLAN - 70)) | (1L << (RLIKE - 70)) | (1L << (QUERY - 70)) | (1L << (SCHEMAS - 70)) | (1L << (SECOND - 70)) | (1L << (SHOW - 70)) | (1L << (SYS - 70)) | (1L << (TABLES - 70)) | (1L << (TEXT - 70)) | (1L << (TYPE - 70)) | (1L << (TYPES - 70)) | (1L << (VERIFY - 70)) | (1L << (YEAR - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DIGIT_IDENTIFIER - 70)) | (1L << (QUOTED_IDENTIFIER - 70)) | (1L << (BACKQUOTED_IDENTIFIER - 70)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << DAY) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FIRST) | (1L << FORMAT) | (1L << FULL) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << HOUR) | (1L << INTERVAL) | (1L << LAST) | (1L << LIMIT) | (1L << MAPPED) | (1L << MINUTE) | (1L << MONTH))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (OPTIMIZED - 70)) | (1L << (PARSED - 70)) | (1L << (PHYSICAL - 70)) | (1L << (PIVOT - 70)) | (1L << (PLAN - 70)) | (1L << (RLIKE - 70)) | (1L << (QUERY - 70)) | (1L << (SCHEMAS - 70)) | (1L << (SECOND - 70)) | (1L << (SHOW - 70)) | (1L << (SYS - 70)) | (1L << (TABLES - 70)) | (1L << (TEXT - 70)) | (1L << (TYPE - 70)) | (1L << (TYPES - 70)) | (1L << (VERIFY - 70)) | (1L << (YEAR - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DIGIT_IDENTIFIER - 70)) | (1L << (QUOTED_IDENTIFIER - 70)))) != 0) || _la==BACKQUOTED_IDENTIFIER) {
{
setState(807);
((TableIdentifierContext)_localctx).catalog = identifier();
@ -6912,7 +6915,7 @@ class SqlBaseParser extends Parser {
}
public static final String _serializedATN =
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\u008c\u034e\4\2\t"+
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\u008d\u034e\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -6977,16 +6980,16 @@ class SqlBaseParser extends Parser {
"\39\59\u0343\n9\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\2\5\66DF=\2\4\6\b\n\f\16"+
"\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bd"+
"fhjlnprtv\2\22\b\2\7\7\t\t\"\"==HHLL\4\2..[[\4\2\t\tHH\4\2**\63\63\3\2"+
"\34\35\3\2wx\4\2\7\7\u0081\u0081\4\2\r\r\34\34\4\2\'\'99\4\2\7\7\36\36"+
"\3\2y{\3\2pv\4\2&&]]\7\2\31\32\61\62?BTUfg\3\2\177\u0080\31\2\b\t\23\24"+
"\26\31\33\33\"\"$$\'\')),.\61\61\66\6699<=??AAHHLOQTWXZ[_`bbff\u03b1\2"+
"x\3\2\2\2\4{\3\2\2\2\6\u00ef\3\2\2\2\b\u00fa\3\2\2\2\n\u00fe\3\2\2\2\f"+
"\u0113\3\2\2\2\16\u011a\3\2\2\2\20\u011c\3\2\2\2\22\u0124\3\2\2\2\24\u0139"+
"\3\2\2\2\26\u0146\3\2\2\2\30\u0150\3\2\2\2\32\u015f\3\2\2\2\34\u0161\3"+
"\2\2\2\36\u0167\3\2\2\2 \u0169\3\2\2\2\"\u0171\3\2\2\2$\u0178\3\2\2\2"+
"&\u018a\3\2\2\2(\u019b\3\2\2\2*\u01ab\3\2\2\2,\u01c9\3\2\2\2.\u01cb\3"+
"\2\2\2\60\u01d6\3\2\2\2\62\u01de\3\2\2\2\64\u01e5\3\2\2\2\66\u0206\3\2"+
"\2\28\u0217\3\2\2\2:\u021a\3\2\2\2<\u024c\3\2\2\2>\u024e\3\2\2\2@\u0251"+
"\34\35\3\2xy\4\2\7\7\u0082\u0082\4\2\r\r\34\34\4\2\'\'99\4\2\7\7\36\36"+
"\3\2z|\3\2qw\4\2&&]]\7\2\31\32\61\62?BTUfg\3\2\u0080\u0081\31\2\b\t\23"+
"\24\26\31\33\33\"\"$$\'\')),.\61\61\66\6699<=??AAHHLOQTWXZ[_`bbff\u03b1"+
"\2x\3\2\2\2\4{\3\2\2\2\6\u00ef\3\2\2\2\b\u00fa\3\2\2\2\n\u00fe\3\2\2\2"+
"\f\u0113\3\2\2\2\16\u011a\3\2\2\2\20\u011c\3\2\2\2\22\u0124\3\2\2\2\24"+
"\u0139\3\2\2\2\26\u0146\3\2\2\2\30\u0150\3\2\2\2\32\u015f\3\2\2\2\34\u0161"+
"\3\2\2\2\36\u0167\3\2\2\2 \u0169\3\2\2\2\"\u0171\3\2\2\2$\u0178\3\2\2"+
"\2&\u018a\3\2\2\2(\u019b\3\2\2\2*\u01ab\3\2\2\2,\u01c9\3\2\2\2.\u01cb"+
"\3\2\2\2\60\u01d6\3\2\2\2\62\u01de\3\2\2\2\64\u01e5\3\2\2\2\66\u0206\3"+
"\2\2\28\u0217\3\2\2\2:\u021a\3\2\2\2<\u024c\3\2\2\2>\u024e\3\2\2\2@\u0251"+
"\3\2\2\2B\u025b\3\2\2\2D\u0261\3\2\2\2F\u0296\3\2\2\2H\u02a3\3\2\2\2J"+
"\u02af\3\2\2\2L\u02b1\3\2\2\2N\u02b8\3\2\2\2P\u02c4\3\2\2\2R\u02c6\3\2"+
"\2\2T\u02d2\3\2\2\2V\u02d4\3\2\2\2X\u02e8\3\2\2\2Z\u0304\3\2\2\2\\\u0306"+
@ -7046,7 +7049,7 @@ class SqlBaseParser extends Parser {
"\u0106\3\2\2\2\u0109\u00ff\3\2\2\2\u0109\u010a\3\2\2\2\u010a\u010c\3\2"+
"\2\2\u010b\u010d\5\f\7\2\u010c\u010b\3\2\2\2\u010c\u010d\3\2\2\2\u010d"+
"\13\3\2\2\2\u010e\u010f\7<\2\2\u010f\u0114\t\b\2\2\u0110\u0111\7j\2\2"+
"\u0111\u0112\t\b\2\2\u0112\u0114\7o\2\2\u0113\u010e\3\2\2\2\u0113\u0110"+
"\u0111\u0112\t\b\2\2\u0112\u0114\7p\2\2\u0113\u010e\3\2\2\2\u0113\u0110"+
"\3\2\2\2\u0114\r\3\2\2\2\u0115\u011b\5\22\n\2\u0116\u0117\7\3\2\2\u0117"+
"\u0118\5\n\6\2\u0118\u0119\7\4\2\2\u0119\u011b\3\2\2\2\u011a\u0115\3\2"+
"\2\2\u011a\u0116\3\2\2\2\u011b\17\3\2\2\2\u011c\u011e\5\64\33\2\u011d"+
@ -7155,7 +7158,7 @@ class SqlBaseParser extends Parser {
"\2\2\u024d=\3\2\2\2\u024e\u024f\7;\2\2\u024f\u0250\5@!\2\u0250?\3\2\2"+
"\2\u0251\u0253\5r:\2\u0252\u0254\5B\"\2\u0253\u0252\3\2\2\2\u0253\u0254"+
"\3\2\2\2\u0254A\3\2\2\2\u0255\u0256\7!\2\2\u0256\u025c\5r:\2\u0257\u0258"+
"\7h\2\2\u0258\u0259\5r:\2\u0259\u025a\7o\2\2\u025a\u025c\3\2\2\2\u025b"+
"\7h\2\2\u0258\u0259\5r:\2\u0259\u025a\7p\2\2\u025a\u025c\3\2\2\2\u025b"+
"\u0255\3\2\2\2\u025b\u0257\3\2\2\2\u025cC\3\2\2\2\u025d\u025e\b#\1\2\u025e"+
"\u0262\5F$\2\u025f\u0260\t\7\2\2\u0260\u0262\5D#\6\u0261\u025d\3\2\2\2"+
"\u0261\u025f\3\2\2\2\u0262\u026f\3\2\2\2\u0263\u0264\f\5\2\2\u0264\u0265"+
@ -7165,37 +7168,37 @@ class SqlBaseParser extends Parser {
"\3\2\2\2\u026e\u0271\3\2\2\2\u026f\u026d\3\2\2\2\u026f\u0270\3\2\2\2\u0270"+
"E\3\2\2\2\u0271\u026f\3\2\2\2\u0272\u0273\b$\1\2\u0273\u0297\5J&\2\u0274"+
"\u0297\5P)\2\u0275\u0297\5H%\2\u0276\u0297\5Z.\2\u0277\u0278\5f\64\2\u0278"+
"\u0279\7~\2\2\u0279\u027b\3\2\2\2\u027a\u0277\3\2\2\2\u027a\u027b\3\2"+
"\2\2\u027b\u027c\3\2\2\2\u027c\u0297\7y\2\2\u027d\u0297\5T+\2\u027e\u027f"+
"\7\3\2\2\u027f\u0280\5\b\5\2\u0280\u0281\7\4\2\2\u0281\u0297\3\2\2\2\u0282"+
"\u0297\5f\64\2\u0283\u0284\7\3\2\2\u0284\u0285\5\64\33\2\u0285\u0286\7"+
"\4\2\2\u0286\u0297\3\2\2\2\u0287\u0289\7\20\2\2\u0288\u028a\5\66\34\2"+
"\u0289\u0288\3\2\2\2\u0289\u028a\3\2\2\2\u028a\u028c\3\2\2\2\u028b\u028d"+
"\5t;\2\u028c\u028b\3\2\2\2\u028d\u028e\3\2\2\2\u028e\u028c\3\2\2\2\u028e"+
"\u028f\3\2\2\2\u028f\u0292\3\2\2\2\u0290\u0291\7\37\2\2\u0291\u0293\5"+
"\66\34\2\u0292\u0290\3\2\2\2\u0292\u0293\3\2\2\2\u0293\u0294\3\2\2\2\u0294"+
"\u0295\7 \2\2\u0295\u0297\3\2\2\2\u0296\u0272\3\2\2\2\u0296\u0274\3\2"+
"\2\2\u0296\u0275\3\2\2\2\u0296\u0276\3\2\2\2\u0296\u027a\3\2\2\2\u0296"+
"\u027d\3\2\2\2\u0296\u027e\3\2\2\2\u0296\u0282\3\2\2\2\u0296\u0283\3\2"+
"\2\2\u0296\u0287\3\2\2\2\u0297\u029d\3\2\2\2\u0298\u0299\f\f\2\2\u0299"+
"\u029a\7|\2\2\u029a\u029c\5d\63\2\u029b\u0298\3\2\2\2\u029c\u029f\3\2"+
"\2\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2\2\2\u029eG\3\2\2\2\u029f\u029d"+
"\3\2\2\2\u02a0\u02a4\7\30\2\2\u02a1\u02a4\7\26\2\2\u02a2\u02a4\7\27\2"+
"\2\u02a3\u02a0\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a3\u02a2\3\2\2\2\u02a4I"+
"\3\2\2\2\u02a5\u02b0\5L\'\2\u02a6\u02a7\7i\2\2\u02a7\u02a8\5L\'\2\u02a8"+
"\u02a9\7o\2\2\u02a9\u02b0\3\2\2\2\u02aa\u02b0\5N(\2\u02ab\u02ac\7i\2\2"+
"\u02ac\u02ad\5N(\2\u02ad\u02ae\7o\2\2\u02ae\u02b0\3\2\2\2\u02af\u02a5"+
"\3\2\2\2\u02af\u02a6\3\2\2\2\u02af\u02aa\3\2\2\2\u02af\u02ab\3\2\2\2\u02b0"+
"K\3\2\2\2\u02b1\u02b2\7\21\2\2\u02b2\u02b3\7\3\2\2\u02b3\u02b4\5\64\33"+
"\2\u02b4\u02b5\7\f\2\2\u02b5\u02b6\5d\63\2\u02b6\u02b7\7\4\2\2\u02b7M"+
"\3\2\2\2\u02b8\u02b9\7\25\2\2\u02b9\u02ba\7\3\2\2\u02ba\u02bb\5\64\33"+
"\2\u02bb\u02bc\7\5\2\2\u02bc\u02bd\5d\63\2\u02bd\u02be\7\4\2\2\u02beO"+
"\3\2\2\2\u02bf\u02c5\5R*\2\u02c0\u02c1\7i\2\2\u02c1\u02c2\5R*\2\u02c2"+
"\u02c3\7o\2\2\u02c3\u02c5\3\2\2\2\u02c4\u02bf\3\2\2\2\u02c4\u02c0\3\2"+
"\u0279\7\177\2\2\u0279\u027b\3\2\2\2\u027a\u0277\3\2\2\2\u027a\u027b\3"+
"\2\2\2\u027b\u027c\3\2\2\2\u027c\u0297\7z\2\2\u027d\u0297\5T+\2\u027e"+
"\u027f\7\3\2\2\u027f\u0280\5\b\5\2\u0280\u0281\7\4\2\2\u0281\u0297\3\2"+
"\2\2\u0282\u0297\5f\64\2\u0283\u0284\7\3\2\2\u0284\u0285\5\64\33\2\u0285"+
"\u0286\7\4\2\2\u0286\u0297\3\2\2\2\u0287\u0289\7\20\2\2\u0288\u028a\5"+
"\66\34\2\u0289\u0288\3\2\2\2\u0289\u028a\3\2\2\2\u028a\u028c\3\2\2\2\u028b"+
"\u028d\5t;\2\u028c\u028b\3\2\2\2\u028d\u028e\3\2\2\2\u028e\u028c\3\2\2"+
"\2\u028e\u028f\3\2\2\2\u028f\u0292\3\2\2\2\u0290\u0291\7\37\2\2\u0291"+
"\u0293\5\66\34\2\u0292\u0290\3\2\2\2\u0292\u0293\3\2\2\2\u0293\u0294\3"+
"\2\2\2\u0294\u0295\7 \2\2\u0295\u0297\3\2\2\2\u0296\u0272\3\2\2\2\u0296"+
"\u0274\3\2\2\2\u0296\u0275\3\2\2\2\u0296\u0276\3\2\2\2\u0296\u027a\3\2"+
"\2\2\u0296\u027d\3\2\2\2\u0296\u027e\3\2\2\2\u0296\u0282\3\2\2\2\u0296"+
"\u0283\3\2\2\2\u0296\u0287\3\2\2\2\u0297\u029d\3\2\2\2\u0298\u0299\f\f"+
"\2\2\u0299\u029a\7}\2\2\u029a\u029c\5d\63\2\u029b\u0298\3\2\2\2\u029c"+
"\u029f\3\2\2\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2\2\2\u029eG\3\2\2\2"+
"\u029f\u029d\3\2\2\2\u02a0\u02a4\7\30\2\2\u02a1\u02a4\7\26\2\2\u02a2\u02a4"+
"\7\27\2\2\u02a3\u02a0\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a3\u02a2\3\2\2\2"+
"\u02a4I\3\2\2\2\u02a5\u02b0\5L\'\2\u02a6\u02a7\7i\2\2\u02a7\u02a8\5L\'"+
"\2\u02a8\u02a9\7p\2\2\u02a9\u02b0\3\2\2\2\u02aa\u02b0\5N(\2\u02ab\u02ac"+
"\7i\2\2\u02ac\u02ad\5N(\2\u02ad\u02ae\7p\2\2\u02ae\u02b0\3\2\2\2\u02af"+
"\u02a5\3\2\2\2\u02af\u02a6\3\2\2\2\u02af\u02aa\3\2\2\2\u02af\u02ab\3\2"+
"\2\2\u02b0K\3\2\2\2\u02b1\u02b2\7\21\2\2\u02b2\u02b3\7\3\2\2\u02b3\u02b4"+
"\5\64\33\2\u02b4\u02b5\7\f\2\2\u02b5\u02b6\5d\63\2\u02b6\u02b7\7\4\2\2"+
"\u02b7M\3\2\2\2\u02b8\u02b9\7\25\2\2\u02b9\u02ba\7\3\2\2\u02ba\u02bb\5"+
"\64\33\2\u02bb\u02bc\7\5\2\2\u02bc\u02bd\5d\63\2\u02bd\u02be\7\4\2\2\u02be"+
"O\3\2\2\2\u02bf\u02c5\5R*\2\u02c0\u02c1\7i\2\2\u02c1\u02c2\5R*\2\u02c2"+
"\u02c3\7p\2\2\u02c3\u02c5\3\2\2\2\u02c4\u02bf\3\2\2\2\u02c4\u02c0\3\2"+
"\2\2\u02c5Q\3\2\2\2\u02c6\u02c7\7%\2\2\u02c7\u02c8\7\3\2\2\u02c8\u02c9"+
"\5h\65\2\u02c9\u02ca\7*\2\2\u02ca\u02cb\5D#\2\u02cb\u02cc\7\4\2\2\u02cc"+
"S\3\2\2\2\u02cd\u02d3\5V,\2\u02ce\u02cf\7i\2\2\u02cf\u02d0\5V,\2\u02d0"+
"\u02d1\7o\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02cd\3\2\2\2\u02d2\u02ce\3\2"+
"\u02d1\7p\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02cd\3\2\2\2\u02d2\u02ce\3\2"+
"\2\2\u02d3U\3\2\2\2\u02d4\u02d5\5X-\2\u02d5\u02e1\7\3\2\2\u02d6\u02d8"+
"\5\36\20\2\u02d7\u02d6\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8\u02d9\3\2\2\2"+
"\u02d9\u02de\5\64\33\2\u02da\u02db\7\5\2\2\u02db\u02dd\5\64\33\2\u02dc"+
@ -7205,13 +7208,13 @@ class SqlBaseParser extends Parser {
"\u02e5\u02e9\7:\2\2\u02e6\u02e9\7P\2\2\u02e7\u02e9\5h\65\2\u02e8\u02e5"+
"\3\2\2\2\u02e8\u02e6\3\2\2\2\u02e8\u02e7\3\2\2\2\u02e9Y\3\2\2\2\u02ea"+
"\u0305\7E\2\2\u02eb\u0305\5`\61\2\u02ec\u0305\5p9\2\u02ed\u0305\5^\60"+
"\2\u02ee\u02f0\7\u0080\2\2\u02ef\u02ee\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1"+
"\u02ef\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2\u0305\3\2\2\2\u02f3\u0305\7\177"+
"\2\2\u02f4\u02f5\7k\2\2\u02f5\u02f6\5r:\2\u02f6\u02f7\7o\2\2\u02f7\u0305"+
"\3\2\2\2\u02f8\u02f9\7l\2\2\u02f9\u02fa\5r:\2\u02fa\u02fb\7o\2\2\u02fb"+
"\u0305\3\2\2\2\u02fc\u02fd\7m\2\2\u02fd\u02fe\5r:\2\u02fe\u02ff\7o\2\2"+
"\2\u02ee\u02f0\7\u0081\2\2\u02ef\u02ee\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1"+
"\u02ef\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2\u0305\3\2\2\2\u02f3\u0305\7\u0080"+
"\2\2\u02f4\u02f5\7k\2\2\u02f5\u02f6\5r:\2\u02f6\u02f7\7p\2\2\u02f7\u0305"+
"\3\2\2\2\u02f8\u02f9\7l\2\2\u02f9\u02fa\5r:\2\u02fa\u02fb\7p\2\2\u02fb"+
"\u0305\3\2\2\2\u02fc\u02fd\7m\2\2\u02fd\u02fe\5r:\2\u02fe\u02ff\7p\2\2"+
"\u02ff\u0305\3\2\2\2\u0300\u0301\7n\2\2\u0301\u0302\5r:\2\u0302\u0303"+
"\7o\2\2\u0303\u0305\3\2\2\2\u0304\u02ea\3\2\2\2\u0304\u02eb\3\2\2\2\u0304"+
"\7p\2\2\u0303\u0305\3\2\2\2\u0304\u02ea\3\2\2\2\u0304\u02eb\3\2\2\2\u0304"+
"\u02ec\3\2\2\2\u0304\u02ed\3\2\2\2\u0304\u02ef\3\2\2\2\u0304\u02f3\3\2"+
"\2\2\u0304\u02f4\3\2\2\2\u0304\u02f8\3\2\2\2\u0304\u02fc\3\2\2\2\u0304"+
"\u0300\3\2\2\2\u0305[\3\2\2\2\u0306\u0307\t\r\2\2\u0307]\3\2\2\2\u0308"+
@ -7221,20 +7224,20 @@ class SqlBaseParser extends Parser {
"\u0312\3\2\2\2\u0312\u0315\5b\62\2\u0313\u0314\7^\2\2\u0314\u0316\5b\62"+
"\2\u0315\u0313\3\2\2\2\u0315\u0316\3\2\2\2\u0316a\3\2\2\2\u0317\u0318"+
"\t\17\2\2\u0318c\3\2\2\2\u0319\u031a\5h\65\2\u031ae\3\2\2\2\u031b\u031c"+
"\5h\65\2\u031c\u031d\7~\2\2\u031d\u031f\3\2\2\2\u031e\u031b\3\2\2\2\u031f"+
"\u0322\3\2\2\2\u0320\u031e\3\2\2\2\u0320\u0321\3\2\2\2\u0321\u0323\3\2"+
"\2\2\u0322\u0320\3\2\2\2\u0323\u0324\5h\65\2\u0324g\3\2\2\2\u0325\u0328"+
"\5l\67\2\u0326\u0328\5n8\2\u0327\u0325\3\2\2\2\u0327\u0326\3\2\2\2\u0328"+
"i\3\2\2\2\u0329\u032a\5h\65\2\u032a\u032b\7\6\2\2\u032b\u032d\3\2\2\2"+
"\u032c\u0329\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u0336"+
"\7\u0085\2\2\u032f\u0330\5h\65\2\u0330\u0331\7\6\2\2\u0331\u0333\3\2\2"+
"\2\u0332\u032f\3\2\2\2\u0332\u0333\3\2\2\2\u0333\u0334\3\2\2\2\u0334\u0336"+
"\5h\65\2\u0335\u032c\3\2\2\2\u0335\u0332\3\2\2\2\u0336k\3\2\2\2\u0337"+
"\u033a\7\u0086\2\2\u0338\u033a\7\u0087\2\2\u0339\u0337\3\2\2\2\u0339\u0338"+
"\3\2\2\2\u033am\3\2\2\2\u033b\u033f\7\u0083\2\2\u033c\u033f\5v<\2\u033d"+
"\u033f\7\u0084\2\2\u033e\u033b\3\2\2\2\u033e\u033c\3\2\2\2\u033e\u033d"+
"\3\2\2\2\u033fo\3\2\2\2\u0340\u0343\7\u0082\2\2\u0341\u0343\7\u0081\2"+
"\2\u0342\u0340\3\2\2\2\u0342\u0341\3\2\2\2\u0343q\3\2\2\2\u0344\u0345"+
"\5h\65\2\u031c\u031d\7\177\2\2\u031d\u031f\3\2\2\2\u031e\u031b\3\2\2\2"+
"\u031f\u0322\3\2\2\2\u0320\u031e\3\2\2\2\u0320\u0321\3\2\2\2\u0321\u0323"+
"\3\2\2\2\u0322\u0320\3\2\2\2\u0323\u0324\5h\65\2\u0324g\3\2\2\2\u0325"+
"\u0328\5l\67\2\u0326\u0328\5n8\2\u0327\u0325\3\2\2\2\u0327\u0326\3\2\2"+
"\2\u0328i\3\2\2\2\u0329\u032a\5h\65\2\u032a\u032b\7\6\2\2\u032b\u032d"+
"\3\2\2\2\u032c\u0329\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032e\3\2\2\2\u032e"+
"\u0336\7\u0086\2\2\u032f\u0330\5h\65\2\u0330\u0331\7\6\2\2\u0331\u0333"+
"\3\2\2\2\u0332\u032f\3\2\2\2\u0332\u0333\3\2\2\2\u0333\u0334\3\2\2\2\u0334"+
"\u0336\5h\65\2\u0335\u032c\3\2\2\2\u0335\u0332\3\2\2\2\u0336k\3\2\2\2"+
"\u0337\u033a\7\u0087\2\2\u0338\u033a\7\u0088\2\2\u0339\u0337\3\2\2\2\u0339"+
"\u0338\3\2\2\2\u033am\3\2\2\2\u033b\u033f\7\u0084\2\2\u033c\u033f\5v<"+
"\2\u033d\u033f\7\u0085\2\2\u033e\u033b\3\2\2\2\u033e\u033c\3\2\2\2\u033e"+
"\u033d\3\2\2\2\u033fo\3\2\2\2\u0340\u0343\7\u0083\2\2\u0341\u0343\7\u0082"+
"\2\2\u0342\u0340\3\2\2\2\u0342\u0341\3\2\2\2\u0343q\3\2\2\2\u0344\u0345"+
"\t\20\2\2\u0345s\3\2\2\2\u0346\u0347\7c\2\2\u0347\u0348\5\64\33\2\u0348"+
"\u0349\7\\\2\2\u0349\u034a\5\64\33\2\u034au\3\2\2\2\u034b\u034c\t\21\2"+
"\2\u034cw\3\2\2\2s\u0087\u0089\u008d\u0096\u0098\u009c\u00a3\u00a7\u00ad"+

View File

@ -22,42 +22,58 @@ import org.junit.Assert;
import java.util.List;
import java.util.Locale;
import java.util.StringJoiner;
import static java.lang.String.format;
import static java.util.Arrays.asList;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.matchesPattern;
public class EscapedFunctionsTests extends ESTestCase {
private final SqlParser parser = new SqlParser();
private String randomWhitespaces() {
StringJoiner sj = new StringJoiner("");
for (int i = 0; i < randomInt(10); i++) {
sj.add(randomFrom(" ", "\t", "\r", "\n"));
}
return sj.toString();
}
private String buildExpression(String escape, String pattern, Object value) {
return format(Locale.ROOT, "{" + randomWhitespaces() + escape + " " + randomWhitespaces() +
pattern + randomWhitespaces() + "}", value);
}
private Literal dateLiteral(String date) {
Expression exp = parser.createExpression(format(Locale.ROOT, "{d '%s'}", date));
Expression exp = parser.createExpression(buildExpression("d", "'%s'", date));
assertThat(exp, instanceOf(Expression.class));
return (Literal) exp;
}
private Literal timeLiteral(String date) {
Expression exp = parser.createExpression(format(Locale.ROOT, "{t '%s'}", date));
Expression exp = parser.createExpression(buildExpression("t", "'%s'", date));
assertThat(exp, instanceOf(Expression.class));
return (Literal) exp;
}
private Literal timestampLiteral(String date) {
Expression exp = parser.createExpression(format(Locale.ROOT, "{ts '%s'}", date));
Expression exp = parser.createExpression(buildExpression("ts", "'%s'", date));
assertThat(exp, instanceOf(Expression.class));
return (Literal) exp;
}
private Literal guidLiteral(String date) {
Expression exp = parser.createExpression(format(Locale.ROOT, "{guid '%s'}", date));
private Literal guidLiteral(String guid) {
Expression exp = parser.createExpression(buildExpression("guid", "'%s'", guid));
assertThat(exp, instanceOf(Expression.class));
return (Literal) exp;
}
private Limit limit(int limit) {
LogicalPlan plan = parser.createStatement(format(Locale.ROOT, "SELECT * FROM emp {limit %d}", limit));
LogicalPlan plan = parser.createStatement("SELECT * FROM emp " + buildExpression("limit", "%d", limit));
assertThat(plan, instanceOf(With.class));
With with = (With) plan;
Limit limitPlan = (Limit) (with.child());
@ -66,25 +82,31 @@ public class EscapedFunctionsTests extends ESTestCase {
}
private LikePattern likeEscape(String like, String character) {
Expression exp = parser.createExpression(format(Locale.ROOT, "exp LIKE '%s' {escape '%s'}", like, character));
Expression exp = parser.createExpression(format(Locale.ROOT, "exp LIKE '%s' ", like) +
buildExpression("escape", "'%s'", character));
assertThat(exp, instanceOf(Like.class));
return ((Like) exp).pattern();
}
private Function function(String name) {
Expression exp = parser.createExpression(format(Locale.ROOT, "{fn %s}", name));
Expression exp = parser.createExpression(
format(Locale.ROOT, "{" + randomWhitespaces() + "fn" + randomWhitespaces() + "%s" + randomWhitespaces() + "}", name));
assertThat(exp, instanceOf(Function.class));
return (Function) exp;
}
private void assertFunction(String name, String result) {
String escapedName = name.replace("(", "\\(").replace(")", "\\)").replace("{", "\\{").replace("}", "\\}");
assertThat(result, matchesPattern("\\{\\s*fn\\s*" + escapedName + "\\s*}"));
}
public void testFunctionNoArg() {
Function f = function("SCORE()");
assertEquals("{fn SCORE()}", f.sourceText());
assertFunction("SCORE()", f.sourceText());
}
public void testFunctionOneArg() {
Function f = function("ABS(foo)");
assertEquals("{fn ABS(foo)}", f.sourceText());
assertFunction("ABS(foo)", f.sourceText());
assertEquals(1, f.arguments().size());
Expression arg = f.arguments().get(0);
assertThat(arg, instanceOf(UnresolvedAttribute.class));
@ -94,7 +116,7 @@ public class EscapedFunctionsTests extends ESTestCase {
public void testFunctionOneArgFunction() {
Function f = function("ABS({fn SCORE()})");
assertEquals("{fn ABS({fn SCORE()})}", f.sourceText());
assertFunction("ABS({fn SCORE()})", f.sourceText());
assertEquals(1, f.arguments().size());
Expression arg = f.arguments().get(0);
assertThat(arg, instanceOf(UnresolvedFunction.class));
@ -120,7 +142,7 @@ public class EscapedFunctionsTests extends ESTestCase {
public void testFunctionWithFunctionWithArg() {
Function f = function("POWER(foo, {fn POWER({fn SCORE()}, {fN SCORE()})})");
assertEquals("{fn POWER(foo, {fn POWER({fn SCORE()}, {fN SCORE()})})}", f.sourceText());
assertFunction("POWER(foo, {fn POWER({fn SCORE()}, {fN SCORE()})})", f.sourceText());
assertEquals(2, f.arguments().size());
Expression arg = f.arguments().get(1);
assertThat(arg, instanceOf(UnresolvedFunction.class));
@ -213,17 +235,17 @@ public class EscapedFunctionsTests extends ESTestCase {
public void testGUIDValidationHexa() {
ParsingException ex = expectThrows(ParsingException.class, () -> guidLiteral("12345678-90ab-cdef-0123-456789abcdeH"));
assertEquals("line 1:8: Invalid GUID, expected hexadecimal at offset[35], found [H]", ex.getMessage());
assertThat(ex.getMessage(), endsWith(": Invalid GUID, expected hexadecimal at offset[35], found [H]"));
}
public void testGUIDValidationGroups() {
ParsingException ex = expectThrows(ParsingException.class, () -> guidLiteral("12345678A90ab-cdef-0123-456789abcdeH"));
assertEquals("line 1:8: Invalid GUID, expected group separator at offset [8], found [A]", ex.getMessage());
assertThat(ex.getMessage(), endsWith(": Invalid GUID, expected group separator at offset [8], found [A]"));
}
public void testGUIDValidationLength() {
ParsingException ex = expectThrows(ParsingException.class, () -> guidLiteral("12345678A90"));
assertEquals("line 1:8: Invalid GUID, too short", ex.getMessage());
assertThat(ex.getMessage(), endsWith(": Invalid GUID, too short"));
}
public void testCurrentTimestampAsEscapedExpression() {