[HQL] expand identification variable definition function

This commit is contained in:
aboyko
2024-10-09 13:12:53 -04:00
parent 39fb0b4ecd
commit 899389ee33
2 changed files with 199 additions and 143 deletions

View File

@@ -598,18 +598,22 @@ trim_character
identification_variable
: IDENTIFICATION_VARIABLE
| f=(COUNT
| f=(AVG
| COUNT
| DATE
| FROM
| INNER
| KEY
| LEFT
| MAX
| MIN
| NEW
| ORDER
| OUTER
| POWER
| FLOOR
| SIGN
| SUM
| TIME
| TYPE
| VALUE)

View File

@@ -636,6 +636,7 @@ public class JpqlParser extends Parser {
setState(299);
_errHandler.sync(this);
switch (_input.LA(1)) {
case AVG:
case COUNT:
case DATE:
case FLOOR:
@@ -643,11 +644,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TYPE:
case VALUE:
@@ -1674,6 +1678,7 @@ public class JpqlParser extends Parser {
setState(436);
_errHandler.sync(this);
switch (_input.LA(1)) {
case AVG:
case COUNT:
case DATE:
case FLOOR:
@@ -1681,11 +1686,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TYPE:
case VALUE:
@@ -2111,7 +2119,7 @@ public class JpqlParser extends Parser {
setState(478);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447339937792L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 34965833473L) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447348326400L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 559461724181L) != 0)) {
{
setState(475);
_errHandler.sync(this);
@@ -2371,7 +2379,7 @@ public class JpqlParser extends Parser {
setState(521);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447339937792L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 34965833473L) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447348326400L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 559461724181L) != 0)) {
{
setState(518);
_errHandler.sync(this);
@@ -3674,6 +3682,7 @@ public class JpqlParser extends Parser {
setState(692);
_errHandler.sync(this);
switch (_input.LA(1)) {
case AVG:
case COUNT:
case DATE:
case FLOOR:
@@ -3681,11 +3690,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TYPE:
case VALUE:
@@ -4851,6 +4863,7 @@ public class JpqlParser extends Parser {
setState(844);
_errHandler.sync(this);
switch (_input.LA(1)) {
case AVG:
case COUNT:
case DATE:
case FALSE:
@@ -4859,11 +4872,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TRUE:
case TYPE:
@@ -5034,6 +5050,7 @@ public class JpqlParser extends Parser {
setState(864);
_errHandler.sync(this);
switch (_input.LA(1)) {
case AVG:
case COUNT:
case DATE:
case ENTRY:
@@ -5042,11 +5059,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TREAT:
case TYPE:
@@ -5632,6 +5652,7 @@ public class JpqlParser extends Parser {
case T__1:
case T__13:
case T__14:
case AVG:
case CASE:
case COALESCE:
case COUNT:
@@ -5643,12 +5664,15 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case NULLIF:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TREAT:
case TRUE:
@@ -5695,6 +5719,7 @@ public class JpqlParser extends Parser {
case T__1:
case T__13:
case T__14:
case AVG:
case CASE:
case COALESCE:
case COUNT:
@@ -5704,12 +5729,15 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case NULLIF:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TREAT:
case TYPE:
@@ -5816,6 +5844,7 @@ public class JpqlParser extends Parser {
switch (_input.LA(1)) {
case T__13:
case T__14:
case AVG:
case COUNT:
case DATE:
case FLOOR:
@@ -5823,11 +5852,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TREAT:
case TYPE:
@@ -6696,6 +6728,7 @@ public class JpqlParser extends Parser {
setState(1041);
_errHandler.sync(this);
switch (_input.LA(1)) {
case AVG:
case COUNT:
case DATE:
case FLOOR:
@@ -6703,11 +6736,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TREAT:
case TYPE:
@@ -6952,6 +6988,7 @@ public class JpqlParser extends Parser {
setState(1059);
_errHandler.sync(this);
switch (_input.LA(1)) {
case AVG:
case COUNT:
case DATE:
case FLOOR:
@@ -6959,11 +6996,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TYPE:
case VALUE:
@@ -8669,18 +8709,22 @@ public class JpqlParser extends Parser {
public static class Identification_variableContext extends ParserRuleContext {
public Token f;
public TerminalNode IDENTIFICATION_VARIABLE() { return getToken(JpqlParser.IDENTIFICATION_VARIABLE, 0); }
public TerminalNode AVG() { return getToken(JpqlParser.AVG, 0); }
public TerminalNode COUNT() { return getToken(JpqlParser.COUNT, 0); }
public TerminalNode DATE() { return getToken(JpqlParser.DATE, 0); }
public TerminalNode FROM() { return getToken(JpqlParser.FROM, 0); }
public TerminalNode INNER() { return getToken(JpqlParser.INNER, 0); }
public TerminalNode KEY() { return getToken(JpqlParser.KEY, 0); }
public TerminalNode LEFT() { return getToken(JpqlParser.LEFT, 0); }
public TerminalNode MAX() { return getToken(JpqlParser.MAX, 0); }
public TerminalNode MIN() { return getToken(JpqlParser.MIN, 0); }
public TerminalNode NEW() { return getToken(JpqlParser.NEW, 0); }
public TerminalNode ORDER() { return getToken(JpqlParser.ORDER, 0); }
public TerminalNode OUTER() { return getToken(JpqlParser.OUTER, 0); }
public TerminalNode POWER() { return getToken(JpqlParser.POWER, 0); }
public TerminalNode FLOOR() { return getToken(JpqlParser.FLOOR, 0); }
public TerminalNode SIGN() { return getToken(JpqlParser.SIGN, 0); }
public TerminalNode SUM() { return getToken(JpqlParser.SUM, 0); }
public TerminalNode TIME() { return getToken(JpqlParser.TIME, 0); }
public TerminalNode TYPE() { return getToken(JpqlParser.TYPE, 0); }
public TerminalNode VALUE() { return getToken(JpqlParser.VALUE, 0); }
@@ -8713,6 +8757,7 @@ public class JpqlParser extends Parser {
match(IDENTIFICATION_VARIABLE);
}
break;
case AVG:
case COUNT:
case DATE:
case FLOOR:
@@ -8720,11 +8765,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TYPE:
case VALUE:
@@ -8733,7 +8781,7 @@ public class JpqlParser extends Parser {
setState(1329);
((Identification_variableContext)_localctx).f = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447337840640L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 606095105L) != 0)) ) {
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447346229248L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 9705910293L) != 0)) ) {
((Identification_variableContext)_localctx).f = (Token)_errHandler.recoverInline(this);
}
else {
@@ -8875,6 +8923,7 @@ public class JpqlParser extends Parser {
boolean_literal();
}
break;
case AVG:
case COUNT:
case DATE:
case FLOOR:
@@ -8882,11 +8931,14 @@ public class JpqlParser extends Parser {
case INNER:
case KEY:
case LEFT:
case MAX:
case MIN:
case NEW:
case ORDER:
case OUTER:
case POWER:
case SIGN:
case SUM:
case TIME:
case TYPE:
case VALUE:
@@ -10116,145 +10168,145 @@ public class JpqlParser extends Parser {
"\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe"+
"\u0100\u0000\u000b\u0004\u0000\u0017\u0017EEGG\\\\\u0002\u0000\u0016\u0016"+
"&&\u0003\u0000\u0012\u0012\u0014\u0014YY\u0001\u0000ij\u0001\u0000\n\u000b"+
"\u0001\u0000\f\r\u0003\u0000\u0019\u0019==__\f\u0000\u001f\u001f##239"+
"9<<>>IIQSWW^^ccff\u0001\u0000oq\u0002\u000000bb\u0002\u0000kkmm\u05ef"+
"\u0000\u0102\u0001\u0000\u0000\u0000\u0002\u0108\u0001\u0000\u0000\u0000"+
"\u0004\u010a\u0001\u0000\u0000\u0000\u0006\u0118\u0001\u0000\u0000\u0000"+
"\b\u011c\u0001\u0000\u0000\u0000\n\u0120\u0001\u0000\u0000\u0000\f\u012b"+
"\u0001\u0000\u0000\u0000\u000e\u012d\u0001\u0000\u0000\u0000\u0010\u0135"+
"\u0001\u0000\u0000\u0000\u0012\u013b\u0001\u0000\u0000\u0000\u0014\u0144"+
"\u0001\u0000\u0000\u0000\u0016\u014d\u0001\u0000\u0000\u0000\u0018\u0151"+
"\u0001\u0000\u0000\u0000\u001a\u0164\u0001\u0000\u0000\u0000\u001c\u0166"+
"\u0001\u0000\u0000\u0000\u001e\u0172\u0001\u0000\u0000\u0000 \u017e\u0001"+
"\u0000\u0000\u0000\"\u018d\u0001\u0000\u0000\u0000$\u0199\u0001\u0000"+
"\u0000\u0000&\u01a5\u0001\u0000\u0000\u0000(\u01a9\u0001\u0000\u0000\u0000"+
"*\u01b4\u0001\u0000\u0000\u0000,\u01bf\u0001\u0000\u0000\u0000.\u01c1"+
"\u0001\u0000\u0000\u00000\u01c8\u0001\u0000\u0000\u00002\u01ce\u0001\u0000"+
"\u0000\u00004\u01d0\u0001\u0000\u0000\u00006\u01d4\u0001\u0000\u0000\u0000"+
"8\u01d8\u0001\u0000\u0000\u0000:\u01ec\u0001\u0000\u0000\u0000<\u0200"+
"\u0001\u0000\u0000\u0000>\u0202\u0001\u0000\u0000\u0000@\u020b\u0001\u0000"+
"\u0000\u0000B\u0217\u0001\u0000\u0000\u0000D\u0228\u0001\u0000\u0000\u0000"+
"F\u022a\u0001\u0000\u0000\u0000H\u023c\u0001\u0000\u0000\u0000J\u0253"+
"\u0001\u0000\u0000\u0000L\u0255\u0001\u0000\u0000\u0000N\u0258\u0001\u0000"+
"\u0000\u0000P\u0264\u0001\u0000\u0000\u0000R\u0266\u0001\u0000\u0000\u0000"+
"T\u0269\u0001\u0000\u0000\u0000V\u0276\u0001\u0000\u0000\u0000X\u027b"+
"\u0001\u0000\u0000\u0000Z\u0286\u0001\u0000\u0000\u0000\\\u029f\u0001"+
"\u0000\u0000\u0000^\u02a9\u0001\u0000\u0000\u0000`\u02b4\u0001\u0000\u0000"+
"\u0000b\u02b6\u0001\u0000\u0000\u0000d\u02be\u0001\u0000\u0000\u0000f"+
"\u02c5\u0001\u0000\u0000\u0000h\u02d2\u0001\u0000\u0000\u0000j\u02dc\u0001"+
"\u0000\u0000\u0000l\u02e5\u0001\u0000\u0000\u0000n\u02e7\u0001\u0000\u0000"+
"\u0000p\u02f2\u0001\u0000\u0000\u0000r\u02fe\u0001\u0000\u0000\u0000t"+
"\u0307\u0001\u0000\u0000\u0000v\u0311\u0001\u0000\u0000\u0000x\u032e\u0001"+
"\u0000\u0000\u0000z\u0332\u0001\u0000\u0000\u0000|\u034c\u0001\u0000\u0000"+
"\u0000~\u034e\u0001\u0000\u0000\u0000\u0080\u0360\u0001\u0000\u0000\u0000"+
"\u0082\u0368\u0001\u0000\u0000\u0000\u0084\u036f\u0001\u0000\u0000\u0000"+
"\u0086\u037c\u0001\u0000\u0000\u0000\u0088\u0381\u0001\u0000\u0000\u0000"+
"\u008a\u0384\u0001\u0000\u0000\u0000\u008c\u038b\u0001\u0000\u0000\u0000"+
"\u008e\u03b8\u0001\u0000\u0000\u0000\u0090\u03c0\u0001\u0000\u0000\u0000"+
"\u0092\u03c2\u0001\u0000\u0000\u0000\u0094\u03cd\u0001\u0000\u0000\u0000"+
"\u0096\u03d9\u0001\u0000\u0000\u0000\u0098\u03ec\u0001\u0000\u0000\u0000"+
"\u009a\u03f9\u0001\u0000\u0000\u0000\u009c\u0406\u0001\u0000\u0000\u0000"+
"\u009e\u0411\u0001\u0000\u0000\u0000\u00a0\u041b\u0001\u0000\u0000\u0000"+
"\u00a2\u041f\u0001\u0000\u0000\u0000\u00a4\u0423\u0001\u0000\u0000\u0000"+
"\u00a6\u0428\u0001\u0000\u0000\u0000\u00a8\u042a\u0001\u0000\u0000\u0000"+
"\u00aa\u0486\u0001\u0000\u0000\u0000\u00ac\u0492\u0001\u0000\u0000\u0000"+
"\u00ae\u04c5\u0001\u0000\u0000\u0000\u00b0\u04c7\u0001\u0000\u0000\u0000"+
"\u00b2\u04c9\u0001\u0000\u0000\u0000\u00b4\u04d5\u0001\u0000\u0000\u0000"+
"\u00b6\u04dc\u0001\u0000\u0000\u0000\u00b8\u04de\u0001\u0000\u0000\u0000"+
"\u00ba\u04e5\u0001\u0000\u0000\u0000\u00bc\u04eb\u0001\u0000\u0000\u0000"+
"\u00be\u04f1\u0001\u0000\u0000\u0000\u00c0\u04f3\u0001\u0000\u0000\u0000"+
"\u00c2\u04ff\u0001\u0000\u0000\u0000\u00c4\u0504\u0001\u0000\u0000\u0000"+
"\u00c6\u0513\u0001\u0000\u0000\u0000\u00c8\u0515\u0001\u0000\u0000\u0000"+
"\u00ca\u051a\u0001\u0000\u0000\u0000\u00cc\u0525\u0001\u0000\u0000\u0000"+
"\u00ce\u052e\u0001\u0000\u0000\u0000\u00d0\u0532\u0001\u0000\u0000\u0000"+
"\u00d2\u0534\u0001\u0000\u0000\u0000\u00d4\u053d\u0001\u0000\u0000\u0000"+
"\u00d6\u0547\u0001\u0000\u0000\u0000\u00d8\u0549\u0001\u0000\u0000\u0000"+
"\u00da\u054b\u0001\u0000\u0000\u0000\u00dc\u054d\u0001\u0000\u0000\u0000"+
"\u00de\u0551\u0001\u0000\u0000\u0000\u00e0\u0553\u0001\u0000\u0000\u0000"+
"\u00e2\u0555\u0001\u0000\u0000\u0000\u00e4\u0557\u0001\u0000\u0000\u0000"+
"\u00e6\u0559\u0001\u0000\u0000\u0000\u00e8\u055b\u0001\u0000\u0000\u0000"+
"\u00ea\u055d\u0001\u0000\u0000\u0000\u00ec\u055f\u0001\u0000\u0000\u0000"+
"\u00ee\u0561\u0001\u0000\u0000\u0000\u00f0\u0563\u0001\u0000\u0000\u0000"+
"\u00f2\u0565\u0001\u0000\u0000\u0000\u00f4\u0567\u0001\u0000\u0000\u0000"+
"\u00f6\u056f\u0001\u0000\u0000\u0000\u00f8\u0571\u0001\u0000\u0000\u0000"+
"\u00fa\u0573\u0001\u0000\u0000\u0000\u00fc\u0575\u0001\u0000\u0000\u0000"+
"\u00fe\u0577\u0001\u0000\u0000\u0000\u0100\u057b\u0001\u0000\u0000\u0000"+
"\u0102\u0103\u0003\u0002\u0001\u0000\u0103\u0104\u0005\u0000\u0000\u0001"+
"\u0104\u0001\u0001\u0000\u0000\u0000\u0105\u0109\u0003\u0004\u0002\u0000"+
"\u0106\u0109\u0003\u0006\u0003\u0000\u0107\u0109\u0003\b\u0004\u0000\u0108"+
"\u0105\u0001\u0000\u0000\u0000\u0108\u0106\u0001\u0000\u0000\u0000\u0108"+
"\u0107\u0001\u0000\u0000\u0000\u0109\u0003\u0001\u0000\u0000\u0000\u010a"+
"\u010b\u0003@ \u0000\u010b\u010d\u0003\n\u0005\u0000\u010c\u010e\u0003"+
"L&\u0000\u010d\u010c\u0001\u0000\u0000\u0000\u010d\u010e\u0001\u0000\u0000"+
"\u0000\u010e\u0110\u0001\u0000\u0000\u0000\u010f\u0111\u0003N\'\u0000"+
"\u0110\u010f\u0001\u0000\u0000\u0000\u0110\u0111\u0001\u0000\u0000\u0000"+
"\u0111\u0113\u0001\u0000\u0000\u0000\u0112\u0114\u0003R)\u0000\u0113\u0112"+
"\u0001\u0000\u0000\u0000\u0113\u0114\u0001\u0000\u0000\u0000\u0114\u0116"+
"\u0001\u0000\u0000\u0000\u0115\u0117\u0003T*\u0000\u0116\u0115\u0001\u0000"+
"\u0000\u0000\u0116\u0117\u0001\u0000\u0000\u0000\u0117\u0005\u0001\u0000"+
"\u0000\u0000\u0118\u011a\u00038\u001c\u0000\u0119\u011b\u0003L&\u0000"+
"\u011a\u0119\u0001\u0000\u0000\u0000\u011a\u011b\u0001\u0000\u0000\u0000"+
"\u011b\u0007\u0001\u0000\u0000\u0000\u011c\u011e\u0003>\u001f\u0000\u011d"+
"\u011f\u0003L&\u0000\u011e\u011d\u0001\u0000\u0000\u0000\u011e\u011f\u0001"+
"\u0000\u0000\u0000\u011f\t\u0001\u0000\u0000\u0000\u0120\u0121\u00053"+
"\u0000\u0000\u0121\u0126\u0003\u000e\u0007\u0000\u0122\u0123\u0005\u0001"+
"\u0000\u0000\u0123\u0125\u0003\f\u0006\u0000\u0124\u0122\u0001\u0000\u0000"+
"\u0000\u0125\u0128\u0001\u0000\u0000\u0000\u0126\u0124\u0001\u0000\u0000"+
"\u0000\u0126\u0127\u0001\u0000\u0000\u0000\u0127\u000b\u0001\u0000\u0000"+
"\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0129\u012c\u0003\u000e\u0007"+
"\u0000\u012a\u012c\u0003 \u0010\u0000\u012b\u0129\u0001\u0000\u0000\u0000"+
"\u012b\u012a\u0001\u0000\u0000\u0000\u012c\r\u0001\u0000\u0000\u0000\u012d"+
"\u0132\u0003\u0010\b\u0000\u012e\u0131\u0003\u0012\t\u0000\u012f\u0131"+
"\u0003\u0014\n\u0000\u0130\u012e\u0001\u0000\u0000\u0000\u0130\u012f\u0001"+
"\u0000\u0000\u0000\u0131\u0134\u0001\u0000\u0000\u0000\u0132\u0130\u0001"+
"\u0000\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133\u000f\u0001"+
"\u0000\u0000\u0000\u0134\u0132\u0001\u0000\u0000\u0000\u0135\u0137\u0003"+
"\u00f4z\u0000\u0136\u0138\u0005\u0015\u0000\u0000\u0137\u0136\u0001\u0000"+
"\u0000\u0000\u0137\u0138\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000"+
"\u0000\u0000\u0139\u013a\u0003\u00d0h\u0000\u013a\u0011\u0001\u0000\u0000"+
"\u0000\u013b\u013c\u0003\u0016\u000b\u0000\u013c\u013e\u0003\u001a\r\u0000"+
"\u013d\u013f\u0005\u0015\u0000\u0000\u013e\u013d\u0001\u0000\u0000\u0000"+
"\u013e\u013f\u0001\u0000\u0000\u0000\u013f\u0140\u0001\u0000\u0000\u0000"+
"\u0140\u0142\u0003\u00d0h\u0000\u0141\u0143\u0003\u0018\f\u0000\u0142"+
"\u0141\u0001\u0000\u0000\u0000\u0142\u0143\u0001\u0000\u0000\u0000\u0143"+
"\u0013\u0001\u0000\u0000\u0000\u0144\u0145\u0003\u0016\u000b\u0000\u0145"+
"\u0146\u00051\u0000\u0000\u0146\u0147\u0003\u001a\r\u0000\u0147\u0015"+
"\u0001\u0000\u0000\u0000\u0148\u014a\u0005>\u0000\u0000\u0149\u014b\u0005"+
"R\u0000\u0000\u014a\u0149\u0001\u0000\u0000\u0000\u014a\u014b\u0001\u0000"+
"\u0000\u0000\u014b\u014e\u0001\u0000\u0000\u0000\u014c\u014e\u00059\u0000"+
"\u0000\u014d\u0148\u0001\u0000\u0000\u0000\u014d\u014c\u0001\u0000\u0000"+
"\u0000\u014d\u014e\u0001\u0000\u0000\u0000\u014e\u014f\u0001\u0000\u0000"+
"\u0000\u014f\u0150\u0005;\u0000\u0000\u0150\u0017\u0001\u0000\u0000\u0000"+
"\u0151\u0152\u0005O\u0000\u0000\u0152\u0153\u0003n7\u0000\u0153\u0019"+
"\u0001\u0000\u0000\u0000\u0154\u0165\u0003\u001c\u000e\u0000\u0155\u0165"+
"\u0003\u001e\u000f\u0000\u0156\u0157\u0005`\u0000\u0000\u0157\u0158\u0005"+
"\u0002\u0000\u0000\u0158\u0159\u0003\u001c\u000e\u0000\u0159\u015a\u0005"+
"\u0015\u0000\u0000\u015a\u015b\u0003\u00eau\u0000\u015b\u015c\u0005\u0003"+
"\u0000\u0000\u015c\u0165\u0001\u0000\u0000\u0000\u015d\u015e\u0005`\u0000"+
"\u0000\u015e\u015f\u0005\u0002\u0000\u0000\u015f\u0160\u0003\u001e\u000f"+
"\u0000\u0160\u0161\u0005\u0015\u0000\u0000\u0161\u0162\u0003\u00eau\u0000"+
"\u0162\u0163\u0005\u0003\u0000\u0000\u0163\u0165\u0001\u0000\u0000\u0000"+
"\u0164\u0154\u0001\u0000\u0000\u0000\u0164\u0155\u0001\u0000\u0000\u0000"+
"\u0164\u0156\u0001\u0000\u0000\u0000\u0164\u015d\u0001\u0000\u0000\u0000"+
"\u0165\u001b\u0001\u0000\u0000\u0000\u0166\u0167\u0003\u00d0h\u0000\u0167"+
"\u016d\u0005\u0004\u0000\u0000\u0168\u0169\u0003\u00e8t\u0000\u0169\u016a"+
"\u0005\u0004\u0000\u0000\u016a\u016c\u0001\u0000\u0000\u0000\u016b\u0168"+
"\u0001\u0000\u0000\u0000\u016c\u016f\u0001\u0000\u0000\u0000\u016d\u016b"+
"\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000\u0000\u016e\u0170"+
"\u0001\u0000\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u0170\u0171"+
"\u0003\u00ecv\u0000\u0171\u001d\u0001\u0000\u0000\u0000\u0172\u0173\u0003"+
"\u00d0h\u0000\u0173\u0179\u0005\u0004\u0000\u0000\u0174\u0175\u0003\u00e8"+
"t\u0000\u0175\u0176\u0005\u0004\u0000\u0000\u0176\u0178\u0001\u0000\u0000"+
"\u0000\u0177\u0174\u0001\u0000\u0000\u0000\u0178\u017b\u0001\u0000\u0000"+
"\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u0179\u017a\u0001\u0000\u0000"+
"\u0000\u017a\u017c\u0001\u0000\u0000\u0000\u017b\u0179\u0001\u0000\u0000"+
"\u0000\u017c\u017d\u0003\u00eew\u0000\u017d\u001f\u0001\u0000\u0000\u0000"+
"\u017e\u017f\u00057\u0000\u0000\u017f\u0180\u0005\u0002\u0000\u0000\u0180"+
"\u0181\u00036\u001b\u0000\u0181\u0183\u0005\u0003\u0000\u0000\u0182\u0184"+
"\u0005\u0015\u0000\u0000\u0183\u0182\u0001\u0000\u0000\u0000\u0183\u0184"+
"\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0186"+
"\u0003\u00d0h\u0000\u0186!\u0001\u0000\u0000\u0000\u0187\u018e\u0003$"+
"\u0012\u0000\u0188\u0189\u0005+\u0000\u0000\u0189\u018a\u0005\u0002\u0000"+
"\u0001\u0000\f\r\u0003\u0000\u0019\u0019==__\u0010\u0000\u0017\u0017\u001f"+
"\u001f##2399<<>>EEGGIIQSWW\\\\^^ccff\u0001\u0000oq\u0002\u000000bb\u0002"+
"\u0000kkmm\u05ef\u0000\u0102\u0001\u0000\u0000\u0000\u0002\u0108\u0001"+
"\u0000\u0000\u0000\u0004\u010a\u0001\u0000\u0000\u0000\u0006\u0118\u0001"+
"\u0000\u0000\u0000\b\u011c\u0001\u0000\u0000\u0000\n\u0120\u0001\u0000"+
"\u0000\u0000\f\u012b\u0001\u0000\u0000\u0000\u000e\u012d\u0001\u0000\u0000"+
"\u0000\u0010\u0135\u0001\u0000\u0000\u0000\u0012\u013b\u0001\u0000\u0000"+
"\u0000\u0014\u0144\u0001\u0000\u0000\u0000\u0016\u014d\u0001\u0000\u0000"+
"\u0000\u0018\u0151\u0001\u0000\u0000\u0000\u001a\u0164\u0001\u0000\u0000"+
"\u0000\u001c\u0166\u0001\u0000\u0000\u0000\u001e\u0172\u0001\u0000\u0000"+
"\u0000 \u017e\u0001\u0000\u0000\u0000\"\u018d\u0001\u0000\u0000\u0000"+
"$\u0199\u0001\u0000\u0000\u0000&\u01a5\u0001\u0000\u0000\u0000(\u01a9"+
"\u0001\u0000\u0000\u0000*\u01b4\u0001\u0000\u0000\u0000,\u01bf\u0001\u0000"+
"\u0000\u0000.\u01c1\u0001\u0000\u0000\u00000\u01c8\u0001\u0000\u0000\u0000"+
"2\u01ce\u0001\u0000\u0000\u00004\u01d0\u0001\u0000\u0000\u00006\u01d4"+
"\u0001\u0000\u0000\u00008\u01d8\u0001\u0000\u0000\u0000:\u01ec\u0001\u0000"+
"\u0000\u0000<\u0200\u0001\u0000\u0000\u0000>\u0202\u0001\u0000\u0000\u0000"+
"@\u020b\u0001\u0000\u0000\u0000B\u0217\u0001\u0000\u0000\u0000D\u0228"+
"\u0001\u0000\u0000\u0000F\u022a\u0001\u0000\u0000\u0000H\u023c\u0001\u0000"+
"\u0000\u0000J\u0253\u0001\u0000\u0000\u0000L\u0255\u0001\u0000\u0000\u0000"+
"N\u0258\u0001\u0000\u0000\u0000P\u0264\u0001\u0000\u0000\u0000R\u0266"+
"\u0001\u0000\u0000\u0000T\u0269\u0001\u0000\u0000\u0000V\u0276\u0001\u0000"+
"\u0000\u0000X\u027b\u0001\u0000\u0000\u0000Z\u0286\u0001\u0000\u0000\u0000"+
"\\\u029f\u0001\u0000\u0000\u0000^\u02a9\u0001\u0000\u0000\u0000`\u02b4"+
"\u0001\u0000\u0000\u0000b\u02b6\u0001\u0000\u0000\u0000d\u02be\u0001\u0000"+
"\u0000\u0000f\u02c5\u0001\u0000\u0000\u0000h\u02d2\u0001\u0000\u0000\u0000"+
"j\u02dc\u0001\u0000\u0000\u0000l\u02e5\u0001\u0000\u0000\u0000n\u02e7"+
"\u0001\u0000\u0000\u0000p\u02f2\u0001\u0000\u0000\u0000r\u02fe\u0001\u0000"+
"\u0000\u0000t\u0307\u0001\u0000\u0000\u0000v\u0311\u0001\u0000\u0000\u0000"+
"x\u032e\u0001\u0000\u0000\u0000z\u0332\u0001\u0000\u0000\u0000|\u034c"+
"\u0001\u0000\u0000\u0000~\u034e\u0001\u0000\u0000\u0000\u0080\u0360\u0001"+
"\u0000\u0000\u0000\u0082\u0368\u0001\u0000\u0000\u0000\u0084\u036f\u0001"+
"\u0000\u0000\u0000\u0086\u037c\u0001\u0000\u0000\u0000\u0088\u0381\u0001"+
"\u0000\u0000\u0000\u008a\u0384\u0001\u0000\u0000\u0000\u008c\u038b\u0001"+
"\u0000\u0000\u0000\u008e\u03b8\u0001\u0000\u0000\u0000\u0090\u03c0\u0001"+
"\u0000\u0000\u0000\u0092\u03c2\u0001\u0000\u0000\u0000\u0094\u03cd\u0001"+
"\u0000\u0000\u0000\u0096\u03d9\u0001\u0000\u0000\u0000\u0098\u03ec\u0001"+
"\u0000\u0000\u0000\u009a\u03f9\u0001\u0000\u0000\u0000\u009c\u0406\u0001"+
"\u0000\u0000\u0000\u009e\u0411\u0001\u0000\u0000\u0000\u00a0\u041b\u0001"+
"\u0000\u0000\u0000\u00a2\u041f\u0001\u0000\u0000\u0000\u00a4\u0423\u0001"+
"\u0000\u0000\u0000\u00a6\u0428\u0001\u0000\u0000\u0000\u00a8\u042a\u0001"+
"\u0000\u0000\u0000\u00aa\u0486\u0001\u0000\u0000\u0000\u00ac\u0492\u0001"+
"\u0000\u0000\u0000\u00ae\u04c5\u0001\u0000\u0000\u0000\u00b0\u04c7\u0001"+
"\u0000\u0000\u0000\u00b2\u04c9\u0001\u0000\u0000\u0000\u00b4\u04d5\u0001"+
"\u0000\u0000\u0000\u00b6\u04dc\u0001\u0000\u0000\u0000\u00b8\u04de\u0001"+
"\u0000\u0000\u0000\u00ba\u04e5\u0001\u0000\u0000\u0000\u00bc\u04eb\u0001"+
"\u0000\u0000\u0000\u00be\u04f1\u0001\u0000\u0000\u0000\u00c0\u04f3\u0001"+
"\u0000\u0000\u0000\u00c2\u04ff\u0001\u0000\u0000\u0000\u00c4\u0504\u0001"+
"\u0000\u0000\u0000\u00c6\u0513\u0001\u0000\u0000\u0000\u00c8\u0515\u0001"+
"\u0000\u0000\u0000\u00ca\u051a\u0001\u0000\u0000\u0000\u00cc\u0525\u0001"+
"\u0000\u0000\u0000\u00ce\u052e\u0001\u0000\u0000\u0000\u00d0\u0532\u0001"+
"\u0000\u0000\u0000\u00d2\u0534\u0001\u0000\u0000\u0000\u00d4\u053d\u0001"+
"\u0000\u0000\u0000\u00d6\u0547\u0001\u0000\u0000\u0000\u00d8\u0549\u0001"+
"\u0000\u0000\u0000\u00da\u054b\u0001\u0000\u0000\u0000\u00dc\u054d\u0001"+
"\u0000\u0000\u0000\u00de\u0551\u0001\u0000\u0000\u0000\u00e0\u0553\u0001"+
"\u0000\u0000\u0000\u00e2\u0555\u0001\u0000\u0000\u0000\u00e4\u0557\u0001"+
"\u0000\u0000\u0000\u00e6\u0559\u0001\u0000\u0000\u0000\u00e8\u055b\u0001"+
"\u0000\u0000\u0000\u00ea\u055d\u0001\u0000\u0000\u0000\u00ec\u055f\u0001"+
"\u0000\u0000\u0000\u00ee\u0561\u0001\u0000\u0000\u0000\u00f0\u0563\u0001"+
"\u0000\u0000\u0000\u00f2\u0565\u0001\u0000\u0000\u0000\u00f4\u0567\u0001"+
"\u0000\u0000\u0000\u00f6\u056f\u0001\u0000\u0000\u0000\u00f8\u0571\u0001"+
"\u0000\u0000\u0000\u00fa\u0573\u0001\u0000\u0000\u0000\u00fc\u0575\u0001"+
"\u0000\u0000\u0000\u00fe\u0577\u0001\u0000\u0000\u0000\u0100\u057b\u0001"+
"\u0000\u0000\u0000\u0102\u0103\u0003\u0002\u0001\u0000\u0103\u0104\u0005"+
"\u0000\u0000\u0001\u0104\u0001\u0001\u0000\u0000\u0000\u0105\u0109\u0003"+
"\u0004\u0002\u0000\u0106\u0109\u0003\u0006\u0003\u0000\u0107\u0109\u0003"+
"\b\u0004\u0000\u0108\u0105\u0001\u0000\u0000\u0000\u0108\u0106\u0001\u0000"+
"\u0000\u0000\u0108\u0107\u0001\u0000\u0000\u0000\u0109\u0003\u0001\u0000"+
"\u0000\u0000\u010a\u010b\u0003@ \u0000\u010b\u010d\u0003\n\u0005\u0000"+
"\u010c\u010e\u0003L&\u0000\u010d\u010c\u0001\u0000\u0000\u0000\u010d\u010e"+
"\u0001\u0000\u0000\u0000\u010e\u0110\u0001\u0000\u0000\u0000\u010f\u0111"+
"\u0003N\'\u0000\u0110\u010f\u0001\u0000\u0000\u0000\u0110\u0111\u0001"+
"\u0000\u0000\u0000\u0111\u0113\u0001\u0000\u0000\u0000\u0112\u0114\u0003"+
"R)\u0000\u0113\u0112\u0001\u0000\u0000\u0000\u0113\u0114\u0001\u0000\u0000"+
"\u0000\u0114\u0116\u0001\u0000\u0000\u0000\u0115\u0117\u0003T*\u0000\u0116"+
"\u0115\u0001\u0000\u0000\u0000\u0116\u0117\u0001\u0000\u0000\u0000\u0117"+
"\u0005\u0001\u0000\u0000\u0000\u0118\u011a\u00038\u001c\u0000\u0119\u011b"+
"\u0003L&\u0000\u011a\u0119\u0001\u0000\u0000\u0000\u011a\u011b\u0001\u0000"+
"\u0000\u0000\u011b\u0007\u0001\u0000\u0000\u0000\u011c\u011e\u0003>\u001f"+
"\u0000\u011d\u011f\u0003L&\u0000\u011e\u011d\u0001\u0000\u0000\u0000\u011e"+
"\u011f\u0001\u0000\u0000\u0000\u011f\t\u0001\u0000\u0000\u0000\u0120\u0121"+
"\u00053\u0000\u0000\u0121\u0126\u0003\u000e\u0007\u0000\u0122\u0123\u0005"+
"\u0001\u0000\u0000\u0123\u0125\u0003\f\u0006\u0000\u0124\u0122\u0001\u0000"+
"\u0000\u0000\u0125\u0128\u0001\u0000\u0000\u0000\u0126\u0124\u0001\u0000"+
"\u0000\u0000\u0126\u0127\u0001\u0000\u0000\u0000\u0127\u000b\u0001\u0000"+
"\u0000\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0129\u012c\u0003\u000e"+
"\u0007\u0000\u012a\u012c\u0003 \u0010\u0000\u012b\u0129\u0001\u0000\u0000"+
"\u0000\u012b\u012a\u0001\u0000\u0000\u0000\u012c\r\u0001\u0000\u0000\u0000"+
"\u012d\u0132\u0003\u0010\b\u0000\u012e\u0131\u0003\u0012\t\u0000\u012f"+
"\u0131\u0003\u0014\n\u0000\u0130\u012e\u0001\u0000\u0000\u0000\u0130\u012f"+
"\u0001\u0000\u0000\u0000\u0131\u0134\u0001\u0000\u0000\u0000\u0132\u0130"+
"\u0001\u0000\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133\u000f"+
"\u0001\u0000\u0000\u0000\u0134\u0132\u0001\u0000\u0000\u0000\u0135\u0137"+
"\u0003\u00f4z\u0000\u0136\u0138\u0005\u0015\u0000\u0000\u0137\u0136\u0001"+
"\u0000\u0000\u0000\u0137\u0138\u0001\u0000\u0000\u0000\u0138\u0139\u0001"+
"\u0000\u0000\u0000\u0139\u013a\u0003\u00d0h\u0000\u013a\u0011\u0001\u0000"+
"\u0000\u0000\u013b\u013c\u0003\u0016\u000b\u0000\u013c\u013e\u0003\u001a"+
"\r\u0000\u013d\u013f\u0005\u0015\u0000\u0000\u013e\u013d\u0001\u0000\u0000"+
"\u0000\u013e\u013f\u0001\u0000\u0000\u0000\u013f\u0140\u0001\u0000\u0000"+
"\u0000\u0140\u0142\u0003\u00d0h\u0000\u0141\u0143\u0003\u0018\f\u0000"+
"\u0142\u0141\u0001\u0000\u0000\u0000\u0142\u0143\u0001\u0000\u0000\u0000"+
"\u0143\u0013\u0001\u0000\u0000\u0000\u0144\u0145\u0003\u0016\u000b\u0000"+
"\u0145\u0146\u00051\u0000\u0000\u0146\u0147\u0003\u001a\r\u0000\u0147"+
"\u0015\u0001\u0000\u0000\u0000\u0148\u014a\u0005>\u0000\u0000\u0149\u014b"+
"\u0005R\u0000\u0000\u014a\u0149\u0001\u0000\u0000\u0000\u014a\u014b\u0001"+
"\u0000\u0000\u0000\u014b\u014e\u0001\u0000\u0000\u0000\u014c\u014e\u0005"+
"9\u0000\u0000\u014d\u0148\u0001\u0000\u0000\u0000\u014d\u014c\u0001\u0000"+
"\u0000\u0000\u014d\u014e\u0001\u0000\u0000\u0000\u014e\u014f\u0001\u0000"+
"\u0000\u0000\u014f\u0150\u0005;\u0000\u0000\u0150\u0017\u0001\u0000\u0000"+
"\u0000\u0151\u0152\u0005O\u0000\u0000\u0152\u0153\u0003n7\u0000\u0153"+
"\u0019\u0001\u0000\u0000\u0000\u0154\u0165\u0003\u001c\u000e\u0000\u0155"+
"\u0165\u0003\u001e\u000f\u0000\u0156\u0157\u0005`\u0000\u0000\u0157\u0158"+
"\u0005\u0002\u0000\u0000\u0158\u0159\u0003\u001c\u000e\u0000\u0159\u015a"+
"\u0005\u0015\u0000\u0000\u015a\u015b\u0003\u00eau\u0000\u015b\u015c\u0005"+
"\u0003\u0000\u0000\u015c\u0165\u0001\u0000\u0000\u0000\u015d\u015e\u0005"+
"`\u0000\u0000\u015e\u015f\u0005\u0002\u0000\u0000\u015f\u0160\u0003\u001e"+
"\u000f\u0000\u0160\u0161\u0005\u0015\u0000\u0000\u0161\u0162\u0003\u00ea"+
"u\u0000\u0162\u0163\u0005\u0003\u0000\u0000\u0163\u0165\u0001\u0000\u0000"+
"\u0000\u0164\u0154\u0001\u0000\u0000\u0000\u0164\u0155\u0001\u0000\u0000"+
"\u0000\u0164\u0156\u0001\u0000\u0000\u0000\u0164\u015d\u0001\u0000\u0000"+
"\u0000\u0165\u001b\u0001\u0000\u0000\u0000\u0166\u0167\u0003\u00d0h\u0000"+
"\u0167\u016d\u0005\u0004\u0000\u0000\u0168\u0169\u0003\u00e8t\u0000\u0169"+
"\u016a\u0005\u0004\u0000\u0000\u016a\u016c\u0001\u0000\u0000\u0000\u016b"+
"\u0168\u0001\u0000\u0000\u0000\u016c\u016f\u0001\u0000\u0000\u0000\u016d"+
"\u016b\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000\u0000\u016e"+
"\u0170\u0001\u0000\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u0170"+
"\u0171\u0003\u00ecv\u0000\u0171\u001d\u0001\u0000\u0000\u0000\u0172\u0173"+
"\u0003\u00d0h\u0000\u0173\u0179\u0005\u0004\u0000\u0000\u0174\u0175\u0003"+
"\u00e8t\u0000\u0175\u0176\u0005\u0004\u0000\u0000\u0176\u0178\u0001\u0000"+
"\u0000\u0000\u0177\u0174\u0001\u0000\u0000\u0000\u0178\u017b\u0001\u0000"+
"\u0000\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u0179\u017a\u0001\u0000"+
"\u0000\u0000\u017a\u017c\u0001\u0000\u0000\u0000\u017b\u0179\u0001\u0000"+
"\u0000\u0000\u017c\u017d\u0003\u00eew\u0000\u017d\u001f\u0001\u0000\u0000"+
"\u0000\u017e\u017f\u00057\u0000\u0000\u017f\u0180\u0005\u0002\u0000\u0000"+
"\u0180\u0181\u00036\u001b\u0000\u0181\u0183\u0005\u0003\u0000\u0000\u0182"+
"\u0184\u0005\u0015\u0000\u0000\u0183\u0182\u0001\u0000\u0000\u0000\u0183"+
"\u0184\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185"+
"\u0186\u0003\u00d0h\u0000\u0186!\u0001\u0000\u0000\u0000\u0187\u018e\u0003"+
"$\u0012\u0000\u0188\u0189\u0005+\u0000\u0000\u0189\u018a\u0005\u0002\u0000"+
"\u0000\u018a\u018b\u0003\u00d0h\u0000\u018b\u018c\u0005\u0003\u0000\u0000"+
"\u018c\u018e\u0001\u0000\u0000\u0000\u018d\u0187\u0001\u0000\u0000\u0000"+
"\u018d\u0188\u0001\u0000\u0000\u0000\u018e#\u0001\u0000\u0000\u0000\u018f"+