Input parameters for SPEL grammar

This commit is contained in:
aboyko
2024-08-14 11:51:08 -04:00
parent 5836f41f8b
commit ece638010f
8 changed files with 1117 additions and 836 deletions

View File

@@ -117,12 +117,6 @@ IDENTIFIER
: (ALPHABETIC | '_') (ALPHABETIC | DIGIT | '_' | '$')*
;
NUMERIC_LITERAL
: REAL_LITERAL
| INTEGER_LITERAL
;
REAL_LITERAL
: '.' DECIMAL_DIGIT+ EXPONENT_PART? REAL_TYPE_SUFFIX?
| DECIMAL_DIGIT+ '.' DECIMAL_DIGIT+ EXPONENT_PART? REAL_TYPE_SUFFIX?

View File

@@ -58,6 +58,7 @@ node
nonDottedNode
: (LSQUARE spelExpr RSQUARE)
| inputParameter
;
dottedNode
@@ -105,16 +106,21 @@ startNode
| projection
| selection
| inlineListOrMap
| inputParameter
;
literal
: NUMERIC_LITERAL
: numericLiteral
| STRING_LITERAL
| TRUE
| FALSE
;
numericLiteral
: INTEGER_LITERAL
| REAL_LITERAL
;
parenspelExpr
: LPAREN spelExpr RPAREN
@@ -168,4 +174,7 @@ beanReference
: (BEAN_REF | FACTORY_BEAN_REF) (IDENTIFIER | STRING_LITERAL)
;
inputParameter
: (LSQUARE INTEGER_LITERAL RSQUARE)
;

View File

@@ -37,9 +37,9 @@ public class SpelLexer extends Lexer {
LE=36, LT=37, LCURLY=38, RCURLY=39, BACKTICK=40, OR=41, AND=42, TRUE=43,
FALSE=44, NEW=45, NULL=46, T=47, MATCHES=48, GT_KEYWORD=49, GE_KEYWORD=50,
LE_KEYWORD=51, LT_KEYWORD=52, EQ_KEYWORD=53, NE_KEYWORD=54, IDENTIFIER=55,
NUMERIC_LITERAL=56, REAL_LITERAL=57, INTEGER_LITERAL=58, STRING_LITERAL=59,
SINGLE_QUOTED_STRING=60, DOUBLE_QUOTED_STRING=61, ESCAPED_BACKTICK=62,
SPEL_IN_TEMPLATE_STRING_OPEN=63, TEMPLATE_TEXT=64;
REAL_LITERAL=56, INTEGER_LITERAL=57, STRING_LITERAL=58, SINGLE_QUOTED_STRING=59,
DOUBLE_QUOTED_STRING=60, ESCAPED_BACKTICK=61, SPEL_IN_TEMPLATE_STRING_OPEN=62,
TEMPLATE_TEXT=63;
public static final int
IN_TEMPLATE_STRING=1;
public static String[] channelNames = {
@@ -59,11 +59,11 @@ public class SpelLexer extends Lexer {
"SELECT", "ELVIS", "SAFE_NAVI", "QMARK", "SELECT_LAST", "GE", "GT", "LE",
"LT", "LCURLY", "RCURLY", "BACKTICK", "OR", "AND", "TRUE", "FALSE", "NEW",
"NULL", "T", "MATCHES", "GT_KEYWORD", "GE_KEYWORD", "LE_KEYWORD", "LT_KEYWORD",
"EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "NUMERIC_LITERAL", "REAL_LITERAL",
"INTEGER_LITERAL", "STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING",
"INTEGER_TYPE_SUFFIX", "HEX_DIGIT", "DECIMAL_DIGIT", "EXPONENT_PART",
"SIGN", "REAL_TYPE_SUFFIX", "ALPHABETIC", "DIGIT", "ESCAPED_BACKTICK",
"SPEL_IN_TEMPLATE_STRING_OPEN", "TEMPLATE_TEXT", "BACKTICK_IN_TEMPLATE"
"EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "REAL_LITERAL", "INTEGER_LITERAL",
"STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING", "INTEGER_TYPE_SUFFIX",
"HEX_DIGIT", "DECIMAL_DIGIT", "EXPONENT_PART", "SIGN", "REAL_TYPE_SUFFIX",
"ALPHABETIC", "DIGIT", "ESCAPED_BACKTICK", "SPEL_IN_TEMPLATE_STRING_OPEN",
"TEMPLATE_TEXT", "BACKTICK_IN_TEMPLATE"
};
}
public static final String[] ruleNames = makeRuleNames();
@@ -76,7 +76,7 @@ public class SpelLexer extends Lexer {
"'?:'", "'?.'", "'?'", "'$['", "'>='", "'>'", "'<='", "'<'", null, null,
null, "'or'", "'and'", "'true'", "'false'", "'new'", "'null'", "'T'",
"'matches'", "'gt'", "'ge'", "'le'", "'lt'", "'eq'", "'ne'", null, null,
null, null, null, null, null, "'``'"
null, null, null, null, "'``'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -89,9 +89,9 @@ public class SpelLexer extends Lexer {
"ELVIS", "SAFE_NAVI", "QMARK", "SELECT_LAST", "GE", "GT", "LE", "LT",
"LCURLY", "RCURLY", "BACKTICK", "OR", "AND", "TRUE", "FALSE", "NEW",
"NULL", "T", "MATCHES", "GT_KEYWORD", "GE_KEYWORD", "LE_KEYWORD", "LT_KEYWORD",
"EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "NUMERIC_LITERAL", "REAL_LITERAL",
"INTEGER_LITERAL", "STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING",
"ESCAPED_BACKTICK", "SPEL_IN_TEMPLATE_STRING_OPEN", "TEMPLATE_TEXT"
"EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "REAL_LITERAL", "INTEGER_LITERAL",
"STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING", "ESCAPED_BACKTICK",
"SPEL_IN_TEMPLATE_STRING_OPEN", "TEMPLATE_TEXT"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -164,7 +164,7 @@ public class SpelLexer extends Lexer {
case 39:
RCURLY_action((RuleContext)_localctx, actionIndex);
break;
case 71:
case 70:
SPEL_IN_TEMPLATE_STRING_OPEN_action((RuleContext)_localctx, actionIndex);
break;
}
@@ -196,7 +196,7 @@ public class SpelLexer extends Lexer {
}
public static final String _serializedATN =
"\u0004\u0000@\u01d8\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+
"\u0004\u0000?\u01d2\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+
"\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+
"\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+
"\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+
@@ -215,452 +215,448 @@ public class SpelLexer extends Lexer {
"9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+
">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+
"C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+
"H\u0007H\u0002I\u0007I\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+
"\u0001\u0001\u0003\u0001\u009c\b\u0001\u0001\u0002\u0004\u0002\u009f\b"+
"\u0002\u000b\u0002\f\u0002\u00a0\u0001\u0002\u0001\u0002\u0001\u0003\u0001"+
"\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001"+
"\u0005\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+
"\u0001\t\u0001\t\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\f\u0001"+
"\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001"+
"\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001"+
"\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001"+
"\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+
"\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+
"\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+
"\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001"+
"\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+
"!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001$\u0001$\u0001"+
"$\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+
"\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001"+
"*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001"+
",\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001"+
".\u0001.\u0001.\u0001.\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+
"0\u00010\u00010\u00010\u00011\u00011\u00011\u00012\u00012\u00012\u0001"+
"3\u00013\u00013\u00014\u00014\u00014\u00015\u00015\u00015\u00016\u0001"+
"6\u00016\u00017\u00017\u00037\u0140\b7\u00017\u00017\u00017\u00057\u0145"+
"\b7\n7\f7\u0148\t7\u00018\u00018\u00038\u014c\b8\u00019\u00019\u00049"+
"\u0150\b9\u000b9\f9\u0151\u00019\u00039\u0155\b9\u00019\u00039\u0158\b"+
"9\u00019\u00049\u015b\b9\u000b9\f9\u015c\u00019\u00019\u00049\u0161\b"+
"9\u000b9\f9\u0162\u00019\u00039\u0166\b9\u00019\u00039\u0169\b9\u0001"+
"9\u00049\u016c\b9\u000b9\f9\u016d\u00019\u00019\u00039\u0172\b9\u0001"+
"9\u00049\u0175\b9\u000b9\f9\u0176\u00019\u00019\u00039\u017b\b9\u0001"+
":\u0004:\u017e\b:\u000b:\f:\u017f\u0001:\u0003:\u0183\b:\u0001;\u0001"+
";\u0003;\u0187\b;\u0001<\u0001<\u0001<\u0001<\u0005<\u018d\b<\n<\f<\u0190"+
"\t<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0005=\u0198\b=\n=\f=\u019b"+
"\t=\u0001=\u0001=\u0001>\u0001>\u0001?\u0001?\u0001@\u0001@\u0001A\u0001"+
"A\u0005A\u01a7\bA\nA\fA\u01aa\tA\u0001A\u0004A\u01ad\bA\u000bA\fA\u01ae"+
"\u0001A\u0001A\u0005A\u01b3\bA\nA\fA\u01b6\tA\u0001A\u0004A\u01b9\bA\u000b"+
"A\fA\u01ba\u0003A\u01bd\bA\u0001B\u0001B\u0001C\u0001C\u0001D\u0003D\u01c4"+
"\bD\u0001E\u0001E\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001"+
"G\u0001G\u0001G\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0000"+
"\u0000J\u0002\u0001\u0004\u0000\u0006\u0002\b\u0003\n\u0004\f\u0005\u000e"+
"\u0006\u0010\u0007\u0012\b\u0014\t\u0016\n\u0018\u000b\u001a\f\u001c\r"+
"\u001e\u000e \u000f\"\u0010$\u0011&\u0012(\u0013*\u0014,\u0015.\u0016"+
"0\u00172\u00184\u00196\u001a8\u001b:\u001c<\u001d>\u001e@\u001fB D!F\""+
"H#J$L%N&P\'R(T)V*X+Z,\\-^.`/b0d1f2h3j4l5n6p7r8t9v:x;z<|=~\u0000\u0080"+
"\u0000\u0082\u0000\u0084\u0000\u0086\u0000\u0088\u0000\u008a\u0000\u008c"+
"\u0000\u008e>\u0090?\u0092@\u0094\u0000\u0002\u0000\u0001\f\u0003\u0000"+
"\n\n\r\r\u2028\u2029\u0003\u0000\t\n\r\r \u0002\u0000$$__\u0002\u0000"+
"\n\n\'\'\u0002\u0000\n\n\"\"\u0002\u0000LLll\u0003\u000009AFaf\u0001\u0000"+
"09\u0002\u0000++--\u0004\u0000DDFFddff\u0293\u0000AZaz\u00aa\u00aa\u00b5"+
"\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0"+
"\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f"+
"\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7"+
"\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef"+
"\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee"+
"\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1"+
"\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824"+
"\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0"+
"\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985"+
"\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd"+
"\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05"+
"\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38"+
"\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93"+
"\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0"+
"\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32"+
"\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83"+
"\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e"+
"\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e"+
"\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60"+
"\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5"+
"\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e"+
"\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a"+
"\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01"+
"\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c"+
"\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6"+
"\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000"+
"\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e"+
"\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0"+
"\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260"+
"\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2"+
"\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0"+
"\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1"+
"\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780"+
"\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa"+
"\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0"+
"\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83"+
"\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80"+
"\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa"+
"\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50"+
"\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6"+
"\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0"+
"\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102"+
"\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126"+
"\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e"+
"\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27"+
"\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8"+
"\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8"+
"\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d"+
"\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0"+
"\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500"+
"\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640"+
"\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717"+
"\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0"+
"\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2"+
"\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c"+
"\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2"+
"\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a"+
"\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984"+
"\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6"+
"\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40"+
"\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a"+
"\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5"+
"\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2"+
"\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2"+
"\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11"+
"\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30"+
"\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00"+
"\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900"+
"\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13"+
"\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a"+
"\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40"+
"\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3"+
"\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0"+
"\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21"+
"\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2"+
"\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda"+
"\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001"+
"<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280"+
"\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d"+
"\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380"+
"\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400"+
"\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500"+
"\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c"+
"\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597"+
"\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb"+
"\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760"+
"\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2"+
"\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a"+
"\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f"+
"\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0"+
"\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920"+
"\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00"+
"\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19"+
"\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0"+
"\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40"+
"\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00"+
"\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00"+
"\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00"+
"\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70"+
"\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003"+
"\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083"+
"\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144"+
"\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176"+
"\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da"+
"\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213"+
"\u8001\u122b\u8001\u123f\u8001\u1240\u8001\u1280\u8001\u1286\u8001\u1288"+
"\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f\u8001\u129d\u8001\u129f"+
"\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305\u8001\u130c\u8001\u130f"+
"\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a\u8001\u1330\u8001\u1332"+
"\u8001\u1333\u8001\u1335\u8001\u1339\u8001\u133d\u8001\u133d\u8001\u1350"+
"\u8001\u1350\u8001\u135d\u8001\u1361\u8001\u1400\u8001\u1434\u8001\u1447"+
"\u8001\u144a\u8001\u145f\u8001\u1461\u8001\u1480\u8001\u14af\u8001\u14c4"+
"\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001\u1580\u8001\u15ae\u8001\u15d8"+
"\u8001\u15db\u8001\u1600\u8001\u162f\u8001\u1644\u8001\u1644\u8001\u1680"+
"\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001\u1700\u8001\u171a\u8001\u1740"+
"\u8001\u1746\u8001\u1800\u8001\u182b\u8001\u18a0\u8001\u18df\u8001\u18ff"+
"\u8001\u1906\u8001\u1909\u8001\u1909\u8001\u190c\u8001\u1913\u8001\u1915"+
"\u8001\u1916\u8001\u1918\u8001\u192f\u8001\u193f\u8001\u193f\u8001\u1941"+
"\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001\u19aa\u8001\u19d0\u8001\u19e1"+
"\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001\u1a00\u8001\u1a00\u8001\u1a0b"+
"\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001\u1a50\u8001\u1a50\u8001\u1a5c"+
"\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001\u1ab0\u8001\u1af8\u8001\u1c00"+
"\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001\u1c40\u8001\u1c40\u8001\u1c72"+
"\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b"+
"\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67"+
"\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0"+
"\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001\u1f04\u8001\u1f10\u8001\u1f12"+
"\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+
"\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342f\u8001\u3441"+
"\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40"+
"\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00"+
"\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d"+
"\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50"+
"\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3"+
"\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00"+
"\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd"+
"\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub132\u8001\ub132\u8001\ub150"+
"\u8001\ub152\u8001\ub155\u8001\ub155\u8001\ub164\u8001\ub167\u8001\ub170"+
"\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80"+
"\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456"+
"\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5"+
"\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb"+
"\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507"+
"\u8001\ud50a\u8001\ud50d\u8001\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e"+
"\u8001\ud539\u8001\ud53b\u8001\ud53e\u8001\ud540\u8001\ud544\u8001\ud546"+
"\u8001\ud546\u8001\ud54a\u8001\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8"+
"\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc"+
"\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750"+
"\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa"+
"\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25"+
"\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001\ue100\u8001\ue12c\u8001\ue137"+
"\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0"+
"\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+
"\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800"+
"\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00"+
"\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21\u8001\uee22\u8001\uee24"+
"\u8001\uee24\u8001\uee27\u8001\uee27\u8001\uee29\u8001\uee32\u8001\uee34"+
"\u8001\uee37\u8001\uee39\u8001\uee39\u8001\uee3b\u8001\uee3b\u8001\uee42"+
"\u8001\uee42\u8001\uee47\u8001\uee47\u8001\uee49\u8001\uee49\u8001\uee4b"+
"\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001\uee51\u8001\uee52\u8001\uee54"+
"\u8001\uee54\u8001\uee57\u8001\uee57\u8001\uee59\u8001\uee59\u8001\uee5b"+
"\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001\uee5f\u8001\uee5f\u8001\uee61"+
"\u8001\uee62\u8001\uee64\u8001\uee64\u8001\uee67\u8001\uee6a\u8001\uee6c"+
"\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e"+
"\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1"+
"\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000"+
"\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740\u8002\ub81d\u8002\ub820"+
"\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000"+
"\u8003\u134a\u8003\u1350\u8003\u23af\u0002\u0000\n\n``\u01ed\u0000\u0002"+
"\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001"+
"\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000"+
"\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000"+
"\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000"+
"\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+
"\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+
"\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+
"\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+
"\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+
"\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+
"\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+
"\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+
"\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+
"\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+
"\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+
"\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000"+
"\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000"+
"\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T"+
"\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000"+
"\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000"+
"\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000"+
"b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001"+
"\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000"+
"\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000\u0000\u0000"+
"p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001"+
"\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000"+
"\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0001"+
"\u008e\u0001\u0000\u0000\u0000\u0001\u0090\u0001\u0000\u0000\u0000\u0001"+
"\u0092\u0001\u0000\u0000\u0000\u0001\u0094\u0001\u0000\u0000\u0000\u0002"+
"\u0096\u0001\u0000\u0000\u0000\u0004\u009b\u0001\u0000\u0000\u0000\u0006"+
"\u009e\u0001\u0000\u0000\u0000\b\u00a4\u0001\u0000\u0000\u0000\n\u00a7"+
"\u0001\u0000\u0000\u0000\f\u00a9\u0001\u0000\u0000\u0000\u000e\u00ac\u0001"+
"\u0000\u0000\u0000\u0010\u00ae\u0001\u0000\u0000\u0000\u0012\u00b0\u0001"+
"\u0000\u0000\u0000\u0014\u00b2\u0001\u0000\u0000\u0000\u0016\u00b4\u0001"+
"\u0000\u0000\u0000\u0018\u00b6\u0001\u0000\u0000\u0000\u001a\u00b8\u0001"+
"\u0000\u0000\u0000\u001c\u00ba\u0001\u0000\u0000\u0000\u001e\u00bc\u0001"+
"\u0000\u0000\u0000 \u00be\u0001\u0000\u0000\u0000\"\u00c0\u0001\u0000"+
"\u0000\u0000$\u00c2\u0001\u0000\u0000\u0000&\u00c4\u0001\u0000\u0000\u0000"+
"(\u00c6\u0001\u0000\u0000\u0000*\u00c9\u0001\u0000\u0000\u0000,\u00cb"+
"\u0001\u0000\u0000\u0000.\u00ce\u0001\u0000\u0000\u00000\u00d1\u0001\u0000"+
"\u0000\u00002\u00d3\u0001\u0000\u0000\u00004\u00d6\u0001\u0000\u0000\u0000"+
"6\u00d8\u0001\u0000\u0000\u00008\u00db\u0001\u0000\u0000\u0000:\u00dd"+
"\u0001\u0000\u0000\u0000<\u00e0\u0001\u0000\u0000\u0000>\u00e3\u0001\u0000"+
"\u0000\u0000@\u00e6\u0001\u0000\u0000\u0000B\u00e9\u0001\u0000\u0000\u0000"+
"D\u00eb\u0001\u0000\u0000\u0000F\u00ee\u0001\u0000\u0000\u0000H\u00f1"+
"\u0001\u0000\u0000\u0000J\u00f3\u0001\u0000\u0000\u0000L\u00f6\u0001\u0000"+
"\u0000\u0000N\u00f8\u0001\u0000\u0000\u0000P\u00fd\u0001\u0000\u0000\u0000"+
"R\u0102\u0001\u0000\u0000\u0000T\u0106\u0001\u0000\u0000\u0000V\u0109"+
"\u0001\u0000\u0000\u0000X\u010d\u0001\u0000\u0000\u0000Z\u0112\u0001\u0000"+
"\u0000\u0000\\\u0118\u0001\u0000\u0000\u0000^\u011c\u0001\u0000\u0000"+
"\u0000`\u0121\u0001\u0000\u0000\u0000b\u0123\u0001\u0000\u0000\u0000d"+
"\u012b\u0001\u0000\u0000\u0000f\u012e\u0001\u0000\u0000\u0000h\u0131\u0001"+
"\u0000\u0000\u0000j\u0134\u0001\u0000\u0000\u0000l\u0137\u0001\u0000\u0000"+
"\u0000n\u013a\u0001\u0000\u0000\u0000p\u013f\u0001\u0000\u0000\u0000r"+
"\u014b\u0001\u0000\u0000\u0000t\u017a\u0001\u0000\u0000\u0000v\u017d\u0001"+
"\u0000\u0000\u0000x\u0186\u0001\u0000\u0000\u0000z\u0188\u0001\u0000\u0000"+
"\u0000|\u0193\u0001\u0000\u0000\u0000~\u019e\u0001\u0000\u0000\u0000\u0080"+
"\u01a0\u0001\u0000\u0000\u0000\u0082\u01a2\u0001\u0000\u0000\u0000\u0084"+
"\u01bc\u0001\u0000\u0000\u0000\u0086\u01be\u0001\u0000\u0000\u0000\u0088"+
"\u01c0\u0001\u0000\u0000\u0000\u008a\u01c3\u0001\u0000\u0000\u0000\u008c"+
"\u01c5\u0001\u0000\u0000\u0000\u008e\u01c7\u0001\u0000\u0000\u0000\u0090"+
"\u01ca\u0001\u0000\u0000\u0000\u0092\u01d1\u0001\u0000\u0000\u0000\u0094"+
"\u01d3\u0001\u0000\u0000\u0000\u0096\u0097\u0005;\u0000\u0000\u0097\u0003"+
"\u0001\u0000\u0000\u0000\u0098\u0099\u0005\r\u0000\u0000\u0099\u009c\u0005"+
"\n\u0000\u0000\u009a\u009c\u0007\u0000\u0000\u0000\u009b\u0098\u0001\u0000"+
"\u0000\u0000\u009b\u009a\u0001\u0000\u0000\u0000\u009c\u0005\u0001\u0000"+
"\u0000\u0000\u009d\u009f\u0007\u0001\u0000\u0000\u009e\u009d\u0001\u0000"+
"\u0000\u0000\u009f\u00a0\u0001\u0000\u0000\u0000\u00a0\u009e\u0001\u0000"+
"\u0000\u0000\u00a0\u00a1\u0001\u0000\u0000\u0000\u00a1\u00a2\u0001\u0000"+
"\u0000\u0000\u00a2\u00a3\u0006\u0002\u0000\u0000\u00a3\u0007\u0001\u0000"+
"\u0000\u0000\u00a4\u00a5\u0005+\u0000\u0000\u00a5\u00a6\u0005+\u0000\u0000"+
"\u00a6\t\u0001\u0000\u0000\u0000\u00a7\u00a8\u0005+\u0000\u0000\u00a8"+
"\u000b\u0001\u0000\u0000\u0000\u00a9\u00aa\u0005-\u0000\u0000\u00aa\u00ab"+
"\u0005-\u0000\u0000\u00ab\r\u0001\u0000\u0000\u0000\u00ac\u00ad\u0005"+
"-\u0000\u0000\u00ad\u000f\u0001\u0000\u0000\u0000\u00ae\u00af\u0005:\u0000"+
"\u0000\u00af\u0011\u0001\u0000\u0000\u0000\u00b0\u00b1\u0005.\u0000\u0000"+
"\u00b1\u0013\u0001\u0000\u0000\u0000\u00b2\u00b3\u0005,\u0000\u0000\u00b3"+
"\u0015\u0001\u0000\u0000\u0000\u00b4\u00b5\u0005*\u0000\u0000\u00b5\u0017"+
"\u0001\u0000\u0000\u0000\u00b6\u00b7\u0005/\u0000\u0000\u00b7\u0019\u0001"+
"\u0000\u0000\u0000\u00b8\u00b9\u0005%\u0000\u0000\u00b9\u001b\u0001\u0000"+
"\u0000\u0000\u00ba\u00bb\u0005(\u0000\u0000\u00bb\u001d\u0001\u0000\u0000"+
"\u0000\u00bc\u00bd\u0005)\u0000\u0000\u00bd\u001f\u0001\u0000\u0000\u0000"+
"\u00be\u00bf\u0005[\u0000\u0000\u00bf!\u0001\u0000\u0000\u0000\u00c0\u00c1"+
"\u0005]\u0000\u0000\u00c1#\u0001\u0000\u0000\u0000\u00c2\u00c3\u0005#"+
"\u0000\u0000\u00c3%\u0001\u0000\u0000\u0000\u00c4\u00c5\u0005@\u0000\u0000"+
"\u00c5\'\u0001\u0000\u0000\u0000\u00c6\u00c7\u0005^\u0000\u0000\u00c7"+
"\u00c8\u0005[\u0000\u0000\u00c8)\u0001\u0000\u0000\u0000\u00c9\u00ca\u0005"+
"^\u0000\u0000\u00ca+\u0001\u0000\u0000\u0000\u00cb\u00cc\u0005!\u0000"+
"\u0000\u00cc\u00cd\u0005=\u0000\u0000\u00cd-\u0001\u0000\u0000\u0000\u00ce"+
"\u00cf\u0005!\u0000\u0000\u00cf\u00d0\u0005[\u0000\u0000\u00d0/\u0001"+
"\u0000\u0000\u0000\u00d1\u00d2\u0005!\u0000\u0000\u00d21\u0001\u0000\u0000"+
"\u0000\u00d3\u00d4\u0005=\u0000\u0000\u00d4\u00d5\u0005=\u0000\u0000\u00d5"+
"3\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005=\u0000\u0000\u00d75\u0001"+
"\u0000\u0000\u0000\u00d8\u00d9\u0005&\u0000\u0000\u00d9\u00da\u0005&\u0000"+
"\u0000\u00da7\u0001\u0000\u0000\u0000\u00db\u00dc\u0005&\u0000\u0000\u00dc"+
"9\u0001\u0000\u0000\u0000\u00dd\u00de\u0005|\u0000\u0000\u00de\u00df\u0005"+
"|\u0000\u0000\u00df;\u0001\u0000\u0000\u0000\u00e0\u00e1\u0005?\u0000"+
"\u0000\u00e1\u00e2\u0005[\u0000\u0000\u00e2=\u0001\u0000\u0000\u0000\u00e3"+
"\u00e4\u0005?\u0000\u0000\u00e4\u00e5\u0005:\u0000\u0000\u00e5?\u0001"+
"\u0000\u0000\u0000\u00e6\u00e7\u0005?\u0000\u0000\u00e7\u00e8\u0005.\u0000"+
"\u0000\u00e8A\u0001\u0000\u0000\u0000\u00e9\u00ea\u0005?\u0000\u0000\u00ea"+
"C\u0001\u0000\u0000\u0000\u00eb\u00ec\u0005$\u0000\u0000\u00ec\u00ed\u0005"+
"[\u0000\u0000\u00edE\u0001\u0000\u0000\u0000\u00ee\u00ef\u0005>\u0000"+
"\u0000\u00ef\u00f0\u0005=\u0000\u0000\u00f0G\u0001\u0000\u0000\u0000\u00f1"+
"\u00f2\u0005>\u0000\u0000\u00f2I\u0001\u0000\u0000\u0000\u00f3\u00f4\u0005"+
"<\u0000\u0000\u00f4\u00f5\u0005=\u0000\u0000\u00f5K\u0001\u0000\u0000"+
"\u0000\u00f6\u00f7\u0005<\u0000\u0000\u00f7M\u0001\u0000\u0000\u0000\u00f8"+
"\u00f9\u0005{\u0000\u0000\u00f9\u00fa\u0006&\u0001\u0000\u00fa\u00fb\u0001"+
"\u0000\u0000\u0000\u00fb\u00fc\u0006&\u0002\u0000\u00fcO\u0001\u0000\u0000"+
"\u0000\u00fd\u00fe\u0005}\u0000\u0000\u00fe\u00ff\u0006\'\u0003\u0000"+
"\u00ff\u0100\u0001\u0000\u0000\u0000\u0100\u0101\u0006\'\u0004\u0000\u0101"+
"Q\u0001\u0000\u0000\u0000\u0102\u0103\u0005`\u0000\u0000\u0103\u0104\u0001"+
"\u0000\u0000\u0000\u0104\u0105\u0006(\u0005\u0000\u0105S\u0001\u0000\u0000"+
"\u0000\u0106\u0107\u0005o\u0000\u0000\u0107\u0108\u0005r\u0000\u0000\u0108"+
"U\u0001\u0000\u0000\u0000\u0109\u010a\u0005a\u0000\u0000\u010a\u010b\u0005"+
"n\u0000\u0000\u010b\u010c\u0005d\u0000\u0000\u010cW\u0001\u0000\u0000"+
"\u0000\u010d\u010e\u0005t\u0000\u0000\u010e\u010f\u0005r\u0000\u0000\u010f"+
"\u0110\u0005u\u0000\u0000\u0110\u0111\u0005e\u0000\u0000\u0111Y\u0001"+
"\u0000\u0000\u0000\u0112\u0113\u0005f\u0000\u0000\u0113\u0114\u0005a\u0000"+
"\u0000\u0114\u0115\u0005l\u0000\u0000\u0115\u0116\u0005s\u0000\u0000\u0116"+
"\u0117\u0005e\u0000\u0000\u0117[\u0001\u0000\u0000\u0000\u0118\u0119\u0005"+
"n\u0000\u0000\u0119\u011a\u0005e\u0000\u0000\u011a\u011b\u0005w\u0000"+
"\u0000\u011b]\u0001\u0000\u0000\u0000\u011c\u011d\u0005n\u0000\u0000\u011d"+
"\u011e\u0005u\u0000\u0000\u011e\u011f\u0005l\u0000\u0000\u011f\u0120\u0005"+
"l\u0000\u0000\u0120_\u0001\u0000\u0000\u0000\u0121\u0122\u0005T\u0000"+
"\u0000\u0122a\u0001\u0000\u0000\u0000\u0123\u0124\u0005m\u0000\u0000\u0124"+
"\u0125\u0005a\u0000\u0000\u0125\u0126\u0005t\u0000\u0000\u0126\u0127\u0005"+
"c\u0000\u0000\u0127\u0128\u0005h\u0000\u0000\u0128\u0129\u0005e\u0000"+
"\u0000\u0129\u012a\u0005s\u0000\u0000\u012ac\u0001\u0000\u0000\u0000\u012b"+
"\u012c\u0005g\u0000\u0000\u012c\u012d\u0005t\u0000\u0000\u012de\u0001"+
"\u0000\u0000\u0000\u012e\u012f\u0005g\u0000\u0000\u012f\u0130\u0005e\u0000"+
"\u0000\u0130g\u0001\u0000\u0000\u0000\u0131\u0132\u0005l\u0000\u0000\u0132"+
"\u0133\u0005e\u0000\u0000\u0133i\u0001\u0000\u0000\u0000\u0134\u0135\u0005"+
"l\u0000\u0000\u0135\u0136\u0005t\u0000\u0000\u0136k\u0001\u0000\u0000"+
"\u0000\u0137\u0138\u0005e\u0000\u0000\u0138\u0139\u0005q\u0000\u0000\u0139"+
"m\u0001\u0000\u0000\u0000\u013a\u013b\u0005n\u0000\u0000\u013b\u013c\u0005"+
"e\u0000\u0000\u013co\u0001\u0000\u0000\u0000\u013d\u0140\u0003\u008aD"+
"\u0000\u013e\u0140\u0005_\u0000\u0000\u013f\u013d\u0001\u0000\u0000\u0000"+
"\u013f\u013e\u0001\u0000\u0000\u0000\u0140\u0146\u0001\u0000\u0000\u0000"+
"\u0141\u0145\u0003\u008aD\u0000\u0142\u0145\u0003\u008cE\u0000\u0143\u0145"+
"\u0007\u0002\u0000\u0000\u0144\u0141\u0001\u0000\u0000\u0000\u0144\u0142"+
"\u0001\u0000\u0000\u0000\u0144\u0143\u0001\u0000\u0000\u0000\u0145\u0148"+
"\u0001\u0000\u0000\u0000\u0146\u0144\u0001\u0000\u0000\u0000\u0146\u0147"+
"\u0001\u0000\u0000\u0000\u0147q\u0001\u0000\u0000\u0000\u0148\u0146\u0001"+
"\u0000\u0000\u0000\u0149\u014c\u0003t9\u0000\u014a\u014c\u0003v:\u0000"+
"\u014b\u0149\u0001\u0000\u0000\u0000\u014b\u014a\u0001\u0000\u0000\u0000"+
"\u014cs\u0001\u0000\u0000\u0000\u014d\u014f\u0005.\u0000\u0000\u014e\u0150"+
"\u0003\u0082@\u0000\u014f\u014e\u0001\u0000\u0000\u0000\u0150\u0151\u0001"+
"\u0000\u0000\u0000\u0151\u014f\u0001\u0000\u0000\u0000\u0151\u0152\u0001"+
"\u0000\u0000\u0000\u0152\u0154\u0001\u0000\u0000\u0000\u0153\u0155\u0003"+
"\u0084A\u0000\u0154\u0153\u0001\u0000\u0000\u0000\u0154\u0155\u0001\u0000"+
"\u0000\u0000\u0155\u0157\u0001\u0000\u0000\u0000\u0156\u0158\u0003\u0088"+
"C\u0000\u0157\u0156\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000"+
"\u0000\u0158\u017b\u0001\u0000\u0000\u0000\u0159\u015b\u0003\u0082@\u0000"+
"\u015a\u0159\u0001\u0000\u0000\u0000\u015b\u015c\u0001\u0000\u0000\u0000"+
"\u015c\u015a\u0001\u0000\u0000\u0000\u015c\u015d\u0001\u0000\u0000\u0000"+
"\u015d\u015e\u0001\u0000\u0000\u0000\u015e\u0160\u0005.\u0000\u0000\u015f"+
"\u0161\u0003\u0082@\u0000\u0160\u015f\u0001\u0000\u0000\u0000\u0161\u0162"+
"\u0001\u0000\u0000\u0000\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0163"+
"\u0001\u0000\u0000\u0000\u0163\u0165\u0001\u0000\u0000\u0000\u0164\u0166"+
"\u0003\u0084A\u0000\u0165\u0164\u0001\u0000\u0000\u0000\u0165\u0166\u0001"+
"\u0000\u0000\u0000\u0166\u0168\u0001\u0000\u0000\u0000\u0167\u0169\u0003"+
"\u0088C\u0000\u0168\u0167\u0001\u0000\u0000\u0000\u0168\u0169\u0001\u0000"+
"\u0000\u0000\u0169\u017b\u0001\u0000\u0000\u0000\u016a\u016c\u0003\u0082"+
"@\u0000\u016b\u016a\u0001\u0000\u0000\u0000\u016c\u016d\u0001\u0000\u0000"+
"\u0000\u016d\u016b\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000"+
"\u0000\u016e\u016f\u0001\u0000\u0000\u0000\u016f\u0171\u0003\u0084A\u0000"+
"\u0170\u0172\u0003\u0088C\u0000\u0171\u0170\u0001\u0000\u0000\u0000\u0171"+
"\u0172\u0001\u0000\u0000\u0000\u0172\u017b\u0001\u0000\u0000\u0000\u0173"+
"\u0175\u0003\u0082@\u0000\u0174\u0173\u0001\u0000\u0000\u0000\u0175\u0176"+
"\u0001\u0000\u0000\u0000\u0176\u0174\u0001\u0000\u0000\u0000\u0176\u0177"+
"\u0001\u0000\u0000\u0000\u0177\u0178\u0001\u0000\u0000\u0000\u0178\u0179"+
"\u0003\u0088C\u0000\u0179\u017b\u0001\u0000\u0000\u0000\u017a\u014d\u0001"+
"\u0000\u0000\u0000\u017a\u015a\u0001\u0000\u0000\u0000\u017a\u016b\u0001"+
"\u0000\u0000\u0000\u017a\u0174\u0001\u0000\u0000\u0000\u017bu\u0001\u0000"+
"\u0000\u0000\u017c\u017e\u0003\u0082@\u0000\u017d\u017c\u0001\u0000\u0000"+
"\u0000\u017e\u017f\u0001\u0000\u0000\u0000\u017f\u017d\u0001\u0000\u0000"+
"\u0000\u017f\u0180\u0001\u0000\u0000\u0000\u0180\u0182\u0001\u0000\u0000"+
"\u0000\u0181\u0183\u0003~>\u0000\u0182\u0181\u0001\u0000\u0000\u0000\u0182"+
"\u0183\u0001\u0000\u0000\u0000\u0183w\u0001\u0000\u0000\u0000\u0184\u0187"+
"\u0003z<\u0000\u0185\u0187\u0003|=\u0000\u0186\u0184\u0001\u0000\u0000"+
"\u0000\u0186\u0185\u0001\u0000\u0000\u0000\u0187y\u0001\u0000\u0000\u0000"+
"\u0188\u018e\u0005\'\u0000\u0000\u0189\u018a\u0005\'\u0000\u0000\u018a"+
"\u018d\u0005\'\u0000\u0000\u018b\u018d\b\u0003\u0000\u0000\u018c\u0189"+
"\u0001\u0000\u0000\u0000\u018c\u018b\u0001\u0000\u0000\u0000\u018d\u0190"+
"\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e\u018f"+
"\u0001\u0000\u0000\u0000\u018f\u0191\u0001\u0000\u0000\u0000\u0190\u018e"+
"\u0001\u0000\u0000\u0000\u0191\u0192\u0005\'\u0000\u0000\u0192{\u0001"+
"\u0000\u0000\u0000\u0193\u0199\u0005\"\u0000\u0000\u0194\u0195\u0005\""+
"\u0000\u0000\u0195\u0198\u0005\"\u0000\u0000\u0196\u0198\b\u0004\u0000"+
"\u0000\u0197\u0194\u0001\u0000\u0000\u0000\u0197\u0196\u0001\u0000\u0000"+
"\u0000\u0198\u019b\u0001\u0000\u0000\u0000\u0199\u0197\u0001\u0000\u0000"+
"\u0000\u0199\u019a\u0001\u0000\u0000\u0000\u019a\u019c\u0001\u0000\u0000"+
"\u0000\u019b\u0199\u0001\u0000\u0000\u0000\u019c\u019d\u0005\"\u0000\u0000"+
"\u019d}\u0001\u0000\u0000\u0000\u019e\u019f\u0007\u0005\u0000\u0000\u019f"+
"\u007f\u0001\u0000\u0000\u0000\u01a0\u01a1\u0007\u0006\u0000\u0000\u01a1"+
"\u0081\u0001\u0000\u0000\u0000\u01a2\u01a3\u0007\u0007\u0000\u0000\u01a3"+
"\u0083\u0001\u0000\u0000\u0000\u01a4\u01a8\u0005e\u0000\u0000\u01a5\u01a7"+
"\u0003\u0086B\u0000\u01a6\u01a5\u0001\u0000\u0000\u0000\u01a7\u01aa\u0001"+
"\u0000\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a8\u01a9\u0001"+
"\u0000\u0000\u0000\u01a9\u01ac\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001"+
"\u0000\u0000\u0000\u01ab\u01ad\u0003\u0082@\u0000\u01ac\u01ab\u0001\u0000"+
"\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000"+
"\u0000\u0000\u01ae\u01af\u0001\u0000\u0000\u0000\u01af\u01bd\u0001\u0000"+
"\u0000\u0000\u01b0\u01b4\u0005E\u0000\u0000\u01b1\u01b3\u0003\u0086B\u0000"+
"\u01b2\u01b1\u0001\u0000\u0000\u0000\u01b3\u01b6\u0001\u0000\u0000\u0000"+
"\u01b4\u01b2\u0001\u0000\u0000\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000"+
"\u01b5\u01b8\u0001\u0000\u0000\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000"+
"\u01b7\u01b9\u0003\u0082@\u0000\u01b8\u01b7\u0001\u0000\u0000\u0000\u01b9"+
"\u01ba\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01ba"+
"\u01bb\u0001\u0000\u0000\u0000\u01bb\u01bd\u0001\u0000\u0000\u0000\u01bc"+
"\u01a4\u0001\u0000\u0000\u0000\u01bc\u01b0\u0001\u0000\u0000\u0000\u01bd"+
"\u0085\u0001\u0000\u0000\u0000\u01be\u01bf\u0007\b\u0000\u0000\u01bf\u0087"+
"\u0001\u0000\u0000\u0000\u01c0\u01c1\u0007\t\u0000\u0000\u01c1\u0089\u0001"+
"\u0000\u0000\u0000\u01c2\u01c4\u0007\n\u0000\u0000\u01c3\u01c2\u0001\u0000"+
"\u0000\u0000\u01c4\u008b\u0001\u0000\u0000\u0000\u01c5\u01c6\u0007\u0007"+
"\u0000\u0000\u01c6\u008d\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005`\u0000"+
"\u0000\u01c8\u01c9\u0005`\u0000\u0000\u01c9\u008f\u0001\u0000\u0000\u0000"+
"\u01ca\u01cb\u0005#\u0000\u0000\u01cb\u01cc\u0005{\u0000\u0000\u01cc\u01cd"+
"\u0001\u0000\u0000\u0000\u01cd\u01ce\u0006G\u0006\u0000\u01ce\u01cf\u0001"+
"\u0000\u0000\u0000\u01cf\u01d0\u0006G\u0002\u0000\u01d0\u0091\u0001\u0000"+
"\u0000\u0000\u01d1\u01d2\b\u000b\u0000\u0000\u01d2\u0093\u0001\u0000\u0000"+
"\u0000\u01d3\u01d4\u0005`\u0000\u0000\u01d4\u01d5\u0001\u0000\u0000\u0000"+
"\u01d5\u01d6\u0006I\u0007\u0000\u01d6\u01d7\u0006I\u0004\u0000\u01d7\u0095"+
"\u0001\u0000\u0000\u0000 \u0000\u0001\u009b\u00a0\u013f\u0144\u0146\u014b"+
"\u0151\u0154\u0157\u015c\u0162\u0165\u0168\u016d\u0171\u0176\u017a\u017f"+
"\u0182\u0186\u018c\u018e\u0197\u0199\u01a8\u01ae\u01b4\u01ba\u01bc\u01c3"+
"\b\u0000\u0001\u0000\u0001&\u0000\u0005\u0000\u0000\u0001\'\u0001\u0004"+
"\u0000\u0000\u0005\u0001\u0000\u0001G\u0002\u0007(\u0000";
"H\u0007H\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+
"\u0001\u009a\b\u0001\u0001\u0002\u0004\u0002\u009d\b\u0002\u000b\u0002"+
"\f\u0002\u009e\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+
"\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006"+
"\u0001\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+
"\n\u0001\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\r\u0001\r\u0001"+
"\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+
"\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001"+
"\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+
"\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0018\u0001"+
"\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001"+
"\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+
"\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+
"\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+
"\"\u0001\"\u0001\"\u0001#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001%\u0001"+
"&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'"+
"\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001"+
"*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+
",\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001"+
".\u0001.\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+
"0\u00010\u00011\u00011\u00011\u00012\u00012\u00012\u00013\u00013\u0001"+
"3\u00014\u00014\u00014\u00015\u00015\u00015\u00016\u00016\u00016\u0001"+
"7\u00017\u00037\u013e\b7\u00017\u00017\u00017\u00057\u0143\b7\n7\f7\u0146"+
"\t7\u00018\u00018\u00048\u014a\b8\u000b8\f8\u014b\u00018\u00038\u014f"+
"\b8\u00018\u00038\u0152\b8\u00018\u00048\u0155\b8\u000b8\f8\u0156\u0001"+
"8\u00018\u00048\u015b\b8\u000b8\f8\u015c\u00018\u00038\u0160\b8\u0001"+
"8\u00038\u0163\b8\u00018\u00048\u0166\b8\u000b8\f8\u0167\u00018\u0001"+
"8\u00038\u016c\b8\u00018\u00048\u016f\b8\u000b8\f8\u0170\u00018\u0001"+
"8\u00038\u0175\b8\u00019\u00049\u0178\b9\u000b9\f9\u0179\u00019\u0003"+
"9\u017d\b9\u0001:\u0001:\u0003:\u0181\b:\u0001;\u0001;\u0001;\u0001;\u0005"+
";\u0187\b;\n;\f;\u018a\t;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0005"+
"<\u0192\b<\n<\f<\u0195\t<\u0001<\u0001<\u0001=\u0001=\u0001>\u0001>\u0001"+
"?\u0001?\u0001@\u0001@\u0005@\u01a1\b@\n@\f@\u01a4\t@\u0001@\u0004@\u01a7"+
"\b@\u000b@\f@\u01a8\u0001@\u0001@\u0005@\u01ad\b@\n@\f@\u01b0\t@\u0001"+
"@\u0004@\u01b3\b@\u000b@\f@\u01b4\u0003@\u01b7\b@\u0001A\u0001A\u0001"+
"B\u0001B\u0001C\u0003C\u01be\bC\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+
"F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001H\u0001"+
"H\u0001H\u0001H\u0001H\u0000\u0000I\u0002\u0001\u0004\u0000\u0006\u0002"+
"\b\u0003\n\u0004\f\u0005\u000e\u0006\u0010\u0007\u0012\b\u0014\t\u0016"+
"\n\u0018\u000b\u001a\f\u001c\r\u001e\u000e \u000f\"\u0010$\u0011&\u0012"+
"(\u0013*\u0014,\u0015.\u00160\u00172\u00184\u00196\u001a8\u001b:\u001c"+
"<\u001d>\u001e@\u001fB D!F\"H#J$L%N&P\'R(T)V*X+Z,\\-^.`/b0d1f2h3j4l5n"+
"6p7r8t9v:x;z<|\u0000~\u0000\u0080\u0000\u0082\u0000\u0084\u0000\u0086"+
"\u0000\u0088\u0000\u008a\u0000\u008c=\u008e>\u0090?\u0092\u0000\u0002"+
"\u0000\u0001\f\u0003\u0000\n\n\r\r\u2028\u2029\u0003\u0000\t\n\r\r \u0002"+
"\u0000$$__\u0002\u0000\n\n\'\'\u0002\u0000\n\n\"\"\u0002\u0000LLll\u0003"+
"\u000009AFaf\u0001\u000009\u0002\u0000++--\u0004\u0000DDFFddff\u0293\u0000"+
"AZaz\u00aa\u00aa\u00b5\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8"+
"\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376"+
"\u0377\u037a\u037d\u037f\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e"+
"\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560"+
"\u0588\u05d0\u05ea\u05ef\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5"+
"\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712"+
"\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800"+
"\u0815\u081a\u081a\u0824\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870"+
"\u0887\u0889\u088e\u08a0\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958"+
"\u0961\u0971\u0980\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2"+
"\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0"+
"\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32"+
"\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85"+
"\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd"+
"\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13"+
"\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f"+
"\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99"+
"\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0"+
"\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58"+
"\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92"+
"\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1"+
"\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54"+
"\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd"+
"\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84"+
"\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd"+
"\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49"+
"\u0f6c\u0f88\u0f8c\u1000\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061"+
"\u1061\u1065\u1066\u106e\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7"+
"\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258"+
"\u1258\u125a\u125d\u1260\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8"+
"\u12be\u12c0\u12c0\u12c2\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318"+
"\u135a\u1380\u138f\u13a0\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681"+
"\u169a\u16a0\u16ea\u16f1\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760"+
"\u176c\u176e\u1770\u1780\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880"+
"\u1884\u1887\u18a8\u18aa\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970"+
"\u1974\u1980\u19ab\u19b0\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05"+
"\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d"+
"\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee"+
"\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20"+
"\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f"+
"\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0"+
"\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f"+
"\u207f\u2090\u209c\u2102\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119"+
"\u211d\u2124\u2124\u2126\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c"+
"\u213f\u2145\u2149\u214e\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2"+
"\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80"+
"\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8"+
"\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b"+
"\u303c\u3041\u3096\u309d\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131"+
"\u318e\u31a0\u31bf\u31f0\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0"+
"\u8000\ua4fd\u8000\ua500\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a"+
"\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0"+
"\u8000\ua6e5\u8000\ua717\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b"+
"\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5"+
"\u8000\ua7d9\u8000\ua7f2\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807"+
"\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882"+
"\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd"+
"\u8000\ua8fe\u8000\ua90a\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960"+
"\u8000\ua97c\u8000\ua984\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0"+
"\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00"+
"\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60"+
"\u8000\uaa76\u8000\uaa7a\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1"+
"\u8000\uaab1\u8000\uaab5\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0"+
"\u8000\uaac0\u8000\uaac2\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0"+
"\u8000\uaaea\u8000\uaaf2\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09"+
"\u8000\uab0e\u8000\uab11\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28"+
"\u8000\uab2e\u8000\uab30\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70"+
"\u8000\uabe2\u8000\uac00\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb"+
"\u8000\ud7fb\u8000\uf900\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00"+
"\u8000\ufb06\u8000\ufb13\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f"+
"\u8000\ufb28\u8000\ufb2a\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e"+
"\u8000\ufb3e\u8000\ufb40\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46"+
"\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92"+
"\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76"+
"\u8000\ufefc\u8000\uff21\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66"+
"\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2"+
"\u8000\uffd7\u8000\uffda\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001"+
"&\u8001(\u8001:\u8001<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080"+
"\u8001\u00fa\u8001\u0280\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300"+
"\u8001\u031f\u8001\u032d\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350"+
"\u8001\u0375\u8001\u0380\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8"+
"\u8001\u03cf\u8001\u0400\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8"+
"\u8001\u04fb\u8001\u0500\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570"+
"\u8001\u057a\u8001\u057c\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594"+
"\u8001\u0595\u8001\u0597\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3"+
"\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740"+
"\u8001\u0755\u8001\u0760\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787"+
"\u8001\u07b0\u8001\u07b2\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808"+
"\u8001\u0808\u8001\u080a\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c"+
"\u8001\u083c\u8001\u083f\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880"+
"\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900"+
"\u8001\u0915\u8001\u0920\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be"+
"\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15"+
"\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80"+
"\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00"+
"\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80"+
"\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0"+
"\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0"+
"\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30"+
"\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0"+
"\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075"+
"\u8001\u1075\u8001\u1083\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103"+
"\u8001\u1126\u8001\u1144\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150"+
"\u8001\u1172\u8001\u1176\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1"+
"\u8001\u11c4\u8001\u11da\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200"+
"\u8001\u1211\u8001\u1213\u8001\u122b\u8001\u123f\u8001\u1240\u8001\u1280"+
"\u8001\u1286\u8001\u1288\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f"+
"\u8001\u129d\u8001\u129f\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305"+
"\u8001\u130c\u8001\u130f\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a"+
"\u8001\u1330\u8001\u1332\u8001\u1333\u8001\u1335\u8001\u1339\u8001\u133d"+
"\u8001\u133d\u8001\u1350\u8001\u1350\u8001\u135d\u8001\u1361\u8001\u1400"+
"\u8001\u1434\u8001\u1447\u8001\u144a\u8001\u145f\u8001\u1461\u8001\u1480"+
"\u8001\u14af\u8001\u14c4\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001\u1580"+
"\u8001\u15ae\u8001\u15d8\u8001\u15db\u8001\u1600\u8001\u162f\u8001\u1644"+
"\u8001\u1644\u8001\u1680\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001\u1700"+
"\u8001\u171a\u8001\u1740\u8001\u1746\u8001\u1800\u8001\u182b\u8001\u18a0"+
"\u8001\u18df\u8001\u18ff\u8001\u1906\u8001\u1909\u8001\u1909\u8001\u190c"+
"\u8001\u1913\u8001\u1915\u8001\u1916\u8001\u1918\u8001\u192f\u8001\u193f"+
"\u8001\u193f\u8001\u1941\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001\u19aa"+
"\u8001\u19d0\u8001\u19e1\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001\u1a00"+
"\u8001\u1a00\u8001\u1a0b\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001\u1a50"+
"\u8001\u1a50\u8001\u1a5c\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001\u1ab0"+
"\u8001\u1af8\u8001\u1c00\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001\u1c40"+
"\u8001\u1c40\u8001\u1c72\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08"+
"\u8001\u1d09\u8001\u1d0b\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60"+
"\u8001\u1d65\u8001\u1d67\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98"+
"\u8001\u1d98\u8001\u1ee0\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001\u1f04"+
"\u8001\u1f10\u8001\u1f12\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001\u2000"+
"\u8001\u2399\u8001\u2480\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000"+
"\u8001\u342f\u8001\u3441\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800"+
"\u8001\u6a38\u8001\u6a40\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0"+
"\u8001\u6aed\u8001\u6b00\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63"+
"\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00"+
"\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0"+
"\u8001\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800"+
"\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5"+
"\u8001\uaffb\u8001\uaffd\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub132"+
"\u8001\ub132\u8001\ub150\u8001\ub152\u8001\ub155\u8001\ub155\u8001\ub164"+
"\u8001\ub167\u8001\ub170\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70"+
"\u8001\ubc7c\u8001\ubc80\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400"+
"\u8001\ud454\u8001\ud456\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2"+
"\u8001\ud4a2\u8001\ud4a5\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac\u8001\ud4ae"+
"\u8001\ud4b9\u8001\ud4bb\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3\u8001\ud4c5"+
"\u8001\ud505\u8001\ud507\u8001\ud50a\u8001\ud50d\u8001\ud514\u8001\ud516"+
"\u8001\ud51c\u8001\ud51e\u8001\ud539\u8001\ud53b\u8001\ud53e\u8001\ud540"+
"\u8001\ud544\u8001\ud546\u8001\ud546\u8001\ud54a\u8001\ud550\u8001\ud552"+
"\u8001\ud6a5\u8001\ud6a8\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc"+
"\u8001\ud6fa\u8001\ud6fc\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736"+
"\u8001\ud74e\u8001\ud750\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a"+
"\u8001\ud7a8\u8001\ud7aa\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00"+
"\u8001\udf1e\u8001\udf25\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001\ue100"+
"\u8001\ue12c\u8001\ue137\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290"+
"\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001\ue7e0"+
"\u8001\ue7e6\u8001\ue7e8\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0"+
"\u8001\ue7fe\u8001\ue800\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b"+
"\u8001\ue94b\u8001\uee00\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21"+
"\u8001\uee22\u8001\uee24\u8001\uee24\u8001\uee27\u8001\uee27\u8001\uee29"+
"\u8001\uee32\u8001\uee34\u8001\uee37\u8001\uee39\u8001\uee39\u8001\uee3b"+
"\u8001\uee3b\u8001\uee42\u8001\uee42\u8001\uee47\u8001\uee47\u8001\uee49"+
"\u8001\uee49\u8001\uee4b\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001\uee51"+
"\u8001\uee52\u8001\uee54\u8001\uee54\u8001\uee57\u8001\uee57\u8001\uee59"+
"\u8001\uee59\u8001\uee5b\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001\uee5f"+
"\u8001\uee5f\u8001\uee61\u8001\uee62\u8001\uee64\u8001\uee64\u8001\uee67"+
"\u8001\uee6a\u8001\uee6c\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79"+
"\u8001\uee7c\u8001\uee7e\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b"+
"\u8001\uee9b\u8001\ueea1\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab"+
"\u8001\ueebb\u8002\u0000\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740"+
"\u8002\ub81d\u8002\ub820\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800"+
"\u8002\ufa1d\u8003\u0000\u8003\u134a\u8003\u1350\u8003\u23af\u0002\u0000"+
"\n\n``\u01e6\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000"+
"\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000"+
"\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000"+
"\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000"+
"\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000"+
"\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000"+
"\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+
"\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+
"$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+
"\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000"+
"\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u0000"+
"2\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001"+
"\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000"+
"\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000"+
"@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001"+
"\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000"+
"\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000"+
"N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001"+
"\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000"+
"\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000"+
"\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001"+
"\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000"+
"\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000"+
"j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001"+
"\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000"+
"\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000"+
"x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0001\u008c\u0001"+
"\u0000\u0000\u0000\u0001\u008e\u0001\u0000\u0000\u0000\u0001\u0090\u0001"+
"\u0000\u0000\u0000\u0001\u0092\u0001\u0000\u0000\u0000\u0002\u0094\u0001"+
"\u0000\u0000\u0000\u0004\u0099\u0001\u0000\u0000\u0000\u0006\u009c\u0001"+
"\u0000\u0000\u0000\b\u00a2\u0001\u0000\u0000\u0000\n\u00a5\u0001\u0000"+
"\u0000\u0000\f\u00a7\u0001\u0000\u0000\u0000\u000e\u00aa\u0001\u0000\u0000"+
"\u0000\u0010\u00ac\u0001\u0000\u0000\u0000\u0012\u00ae\u0001\u0000\u0000"+
"\u0000\u0014\u00b0\u0001\u0000\u0000\u0000\u0016\u00b2\u0001\u0000\u0000"+
"\u0000\u0018\u00b4\u0001\u0000\u0000\u0000\u001a\u00b6\u0001\u0000\u0000"+
"\u0000\u001c\u00b8\u0001\u0000\u0000\u0000\u001e\u00ba\u0001\u0000\u0000"+
"\u0000 \u00bc\u0001\u0000\u0000\u0000\"\u00be\u0001\u0000\u0000\u0000"+
"$\u00c0\u0001\u0000\u0000\u0000&\u00c2\u0001\u0000\u0000\u0000(\u00c4"+
"\u0001\u0000\u0000\u0000*\u00c7\u0001\u0000\u0000\u0000,\u00c9\u0001\u0000"+
"\u0000\u0000.\u00cc\u0001\u0000\u0000\u00000\u00cf\u0001\u0000\u0000\u0000"+
"2\u00d1\u0001\u0000\u0000\u00004\u00d4\u0001\u0000\u0000\u00006\u00d6"+
"\u0001\u0000\u0000\u00008\u00d9\u0001\u0000\u0000\u0000:\u00db\u0001\u0000"+
"\u0000\u0000<\u00de\u0001\u0000\u0000\u0000>\u00e1\u0001\u0000\u0000\u0000"+
"@\u00e4\u0001\u0000\u0000\u0000B\u00e7\u0001\u0000\u0000\u0000D\u00e9"+
"\u0001\u0000\u0000\u0000F\u00ec\u0001\u0000\u0000\u0000H\u00ef\u0001\u0000"+
"\u0000\u0000J\u00f1\u0001\u0000\u0000\u0000L\u00f4\u0001\u0000\u0000\u0000"+
"N\u00f6\u0001\u0000\u0000\u0000P\u00fb\u0001\u0000\u0000\u0000R\u0100"+
"\u0001\u0000\u0000\u0000T\u0104\u0001\u0000\u0000\u0000V\u0107\u0001\u0000"+
"\u0000\u0000X\u010b\u0001\u0000\u0000\u0000Z\u0110\u0001\u0000\u0000\u0000"+
"\\\u0116\u0001\u0000\u0000\u0000^\u011a\u0001\u0000\u0000\u0000`\u011f"+
"\u0001\u0000\u0000\u0000b\u0121\u0001\u0000\u0000\u0000d\u0129\u0001\u0000"+
"\u0000\u0000f\u012c\u0001\u0000\u0000\u0000h\u012f\u0001\u0000\u0000\u0000"+
"j\u0132\u0001\u0000\u0000\u0000l\u0135\u0001\u0000\u0000\u0000n\u0138"+
"\u0001\u0000\u0000\u0000p\u013d\u0001\u0000\u0000\u0000r\u0174\u0001\u0000"+
"\u0000\u0000t\u0177\u0001\u0000\u0000\u0000v\u0180\u0001\u0000\u0000\u0000"+
"x\u0182\u0001\u0000\u0000\u0000z\u018d\u0001\u0000\u0000\u0000|\u0198"+
"\u0001\u0000\u0000\u0000~\u019a\u0001\u0000\u0000\u0000\u0080\u019c\u0001"+
"\u0000\u0000\u0000\u0082\u01b6\u0001\u0000\u0000\u0000\u0084\u01b8\u0001"+
"\u0000\u0000\u0000\u0086\u01ba\u0001\u0000\u0000\u0000\u0088\u01bd\u0001"+
"\u0000\u0000\u0000\u008a\u01bf\u0001\u0000\u0000\u0000\u008c\u01c1\u0001"+
"\u0000\u0000\u0000\u008e\u01c4\u0001\u0000\u0000\u0000\u0090\u01cb\u0001"+
"\u0000\u0000\u0000\u0092\u01cd\u0001\u0000\u0000\u0000\u0094\u0095\u0005"+
";\u0000\u0000\u0095\u0003\u0001\u0000\u0000\u0000\u0096\u0097\u0005\r"+
"\u0000\u0000\u0097\u009a\u0005\n\u0000\u0000\u0098\u009a\u0007\u0000\u0000"+
"\u0000\u0099\u0096\u0001\u0000\u0000\u0000\u0099\u0098\u0001\u0000\u0000"+
"\u0000\u009a\u0005\u0001\u0000\u0000\u0000\u009b\u009d\u0007\u0001\u0000"+
"\u0000\u009c\u009b\u0001\u0000\u0000\u0000\u009d\u009e\u0001\u0000\u0000"+
"\u0000\u009e\u009c\u0001\u0000\u0000\u0000\u009e\u009f\u0001\u0000\u0000"+
"\u0000\u009f\u00a0\u0001\u0000\u0000\u0000\u00a0\u00a1\u0006\u0002\u0000"+
"\u0000\u00a1\u0007\u0001\u0000\u0000\u0000\u00a2\u00a3\u0005+\u0000\u0000"+
"\u00a3\u00a4\u0005+\u0000\u0000\u00a4\t\u0001\u0000\u0000\u0000\u00a5"+
"\u00a6\u0005+\u0000\u0000\u00a6\u000b\u0001\u0000\u0000\u0000\u00a7\u00a8"+
"\u0005-\u0000\u0000\u00a8\u00a9\u0005-\u0000\u0000\u00a9\r\u0001\u0000"+
"\u0000\u0000\u00aa\u00ab\u0005-\u0000\u0000\u00ab\u000f\u0001\u0000\u0000"+
"\u0000\u00ac\u00ad\u0005:\u0000\u0000\u00ad\u0011\u0001\u0000\u0000\u0000"+
"\u00ae\u00af\u0005.\u0000\u0000\u00af\u0013\u0001\u0000\u0000\u0000\u00b0"+
"\u00b1\u0005,\u0000\u0000\u00b1\u0015\u0001\u0000\u0000\u0000\u00b2\u00b3"+
"\u0005*\u0000\u0000\u00b3\u0017\u0001\u0000\u0000\u0000\u00b4\u00b5\u0005"+
"/\u0000\u0000\u00b5\u0019\u0001\u0000\u0000\u0000\u00b6\u00b7\u0005%\u0000"+
"\u0000\u00b7\u001b\u0001\u0000\u0000\u0000\u00b8\u00b9\u0005(\u0000\u0000"+
"\u00b9\u001d\u0001\u0000\u0000\u0000\u00ba\u00bb\u0005)\u0000\u0000\u00bb"+
"\u001f\u0001\u0000\u0000\u0000\u00bc\u00bd\u0005[\u0000\u0000\u00bd!\u0001"+
"\u0000\u0000\u0000\u00be\u00bf\u0005]\u0000\u0000\u00bf#\u0001\u0000\u0000"+
"\u0000\u00c0\u00c1\u0005#\u0000\u0000\u00c1%\u0001\u0000\u0000\u0000\u00c2"+
"\u00c3\u0005@\u0000\u0000\u00c3\'\u0001\u0000\u0000\u0000\u00c4\u00c5"+
"\u0005^\u0000\u0000\u00c5\u00c6\u0005[\u0000\u0000\u00c6)\u0001\u0000"+
"\u0000\u0000\u00c7\u00c8\u0005^\u0000\u0000\u00c8+\u0001\u0000\u0000\u0000"+
"\u00c9\u00ca\u0005!\u0000\u0000\u00ca\u00cb\u0005=\u0000\u0000\u00cb-"+
"\u0001\u0000\u0000\u0000\u00cc\u00cd\u0005!\u0000\u0000\u00cd\u00ce\u0005"+
"[\u0000\u0000\u00ce/\u0001\u0000\u0000\u0000\u00cf\u00d0\u0005!\u0000"+
"\u0000\u00d01\u0001\u0000\u0000\u0000\u00d1\u00d2\u0005=\u0000\u0000\u00d2"+
"\u00d3\u0005=\u0000\u0000\u00d33\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005"+
"=\u0000\u0000\u00d55\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005&\u0000"+
"\u0000\u00d7\u00d8\u0005&\u0000\u0000\u00d87\u0001\u0000\u0000\u0000\u00d9"+
"\u00da\u0005&\u0000\u0000\u00da9\u0001\u0000\u0000\u0000\u00db\u00dc\u0005"+
"|\u0000\u0000\u00dc\u00dd\u0005|\u0000\u0000\u00dd;\u0001\u0000\u0000"+
"\u0000\u00de\u00df\u0005?\u0000\u0000\u00df\u00e0\u0005[\u0000\u0000\u00e0"+
"=\u0001\u0000\u0000\u0000\u00e1\u00e2\u0005?\u0000\u0000\u00e2\u00e3\u0005"+
":\u0000\u0000\u00e3?\u0001\u0000\u0000\u0000\u00e4\u00e5\u0005?\u0000"+
"\u0000\u00e5\u00e6\u0005.\u0000\u0000\u00e6A\u0001\u0000\u0000\u0000\u00e7"+
"\u00e8\u0005?\u0000\u0000\u00e8C\u0001\u0000\u0000\u0000\u00e9\u00ea\u0005"+
"$\u0000\u0000\u00ea\u00eb\u0005[\u0000\u0000\u00ebE\u0001\u0000\u0000"+
"\u0000\u00ec\u00ed\u0005>\u0000\u0000\u00ed\u00ee\u0005=\u0000\u0000\u00ee"+
"G\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005>\u0000\u0000\u00f0I\u0001"+
"\u0000\u0000\u0000\u00f1\u00f2\u0005<\u0000\u0000\u00f2\u00f3\u0005=\u0000"+
"\u0000\u00f3K\u0001\u0000\u0000\u0000\u00f4\u00f5\u0005<\u0000\u0000\u00f5"+
"M\u0001\u0000\u0000\u0000\u00f6\u00f7\u0005{\u0000\u0000\u00f7\u00f8\u0006"+
"&\u0001\u0000\u00f8\u00f9\u0001\u0000\u0000\u0000\u00f9\u00fa\u0006&\u0002"+
"\u0000\u00faO\u0001\u0000\u0000\u0000\u00fb\u00fc\u0005}\u0000\u0000\u00fc"+
"\u00fd\u0006\'\u0003\u0000\u00fd\u00fe\u0001\u0000\u0000\u0000\u00fe\u00ff"+
"\u0006\'\u0004\u0000\u00ffQ\u0001\u0000\u0000\u0000\u0100\u0101\u0005"+
"`\u0000\u0000\u0101\u0102\u0001\u0000\u0000\u0000\u0102\u0103\u0006(\u0005"+
"\u0000\u0103S\u0001\u0000\u0000\u0000\u0104\u0105\u0005o\u0000\u0000\u0105"+
"\u0106\u0005r\u0000\u0000\u0106U\u0001\u0000\u0000\u0000\u0107\u0108\u0005"+
"a\u0000\u0000\u0108\u0109\u0005n\u0000\u0000\u0109\u010a\u0005d\u0000"+
"\u0000\u010aW\u0001\u0000\u0000\u0000\u010b\u010c\u0005t\u0000\u0000\u010c"+
"\u010d\u0005r\u0000\u0000\u010d\u010e\u0005u\u0000\u0000\u010e\u010f\u0005"+
"e\u0000\u0000\u010fY\u0001\u0000\u0000\u0000\u0110\u0111\u0005f\u0000"+
"\u0000\u0111\u0112\u0005a\u0000\u0000\u0112\u0113\u0005l\u0000\u0000\u0113"+
"\u0114\u0005s\u0000\u0000\u0114\u0115\u0005e\u0000\u0000\u0115[\u0001"+
"\u0000\u0000\u0000\u0116\u0117\u0005n\u0000\u0000\u0117\u0118\u0005e\u0000"+
"\u0000\u0118\u0119\u0005w\u0000\u0000\u0119]\u0001\u0000\u0000\u0000\u011a"+
"\u011b\u0005n\u0000\u0000\u011b\u011c\u0005u\u0000\u0000\u011c\u011d\u0005"+
"l\u0000\u0000\u011d\u011e\u0005l\u0000\u0000\u011e_\u0001\u0000\u0000"+
"\u0000\u011f\u0120\u0005T\u0000\u0000\u0120a\u0001\u0000\u0000\u0000\u0121"+
"\u0122\u0005m\u0000\u0000\u0122\u0123\u0005a\u0000\u0000\u0123\u0124\u0005"+
"t\u0000\u0000\u0124\u0125\u0005c\u0000\u0000\u0125\u0126\u0005h\u0000"+
"\u0000\u0126\u0127\u0005e\u0000\u0000\u0127\u0128\u0005s\u0000\u0000\u0128"+
"c\u0001\u0000\u0000\u0000\u0129\u012a\u0005g\u0000\u0000\u012a\u012b\u0005"+
"t\u0000\u0000\u012be\u0001\u0000\u0000\u0000\u012c\u012d\u0005g\u0000"+
"\u0000\u012d\u012e\u0005e\u0000\u0000\u012eg\u0001\u0000\u0000\u0000\u012f"+
"\u0130\u0005l\u0000\u0000\u0130\u0131\u0005e\u0000\u0000\u0131i\u0001"+
"\u0000\u0000\u0000\u0132\u0133\u0005l\u0000\u0000\u0133\u0134\u0005t\u0000"+
"\u0000\u0134k\u0001\u0000\u0000\u0000\u0135\u0136\u0005e\u0000\u0000\u0136"+
"\u0137\u0005q\u0000\u0000\u0137m\u0001\u0000\u0000\u0000\u0138\u0139\u0005"+
"n\u0000\u0000\u0139\u013a\u0005e\u0000\u0000\u013ao\u0001\u0000\u0000"+
"\u0000\u013b\u013e\u0003\u0088C\u0000\u013c\u013e\u0005_\u0000\u0000\u013d"+
"\u013b\u0001\u0000\u0000\u0000\u013d\u013c\u0001\u0000\u0000\u0000\u013e"+
"\u0144\u0001\u0000\u0000\u0000\u013f\u0143\u0003\u0088C\u0000\u0140\u0143"+
"\u0003\u008aD\u0000\u0141\u0143\u0007\u0002\u0000\u0000\u0142\u013f\u0001"+
"\u0000\u0000\u0000\u0142\u0140\u0001\u0000\u0000\u0000\u0142\u0141\u0001"+
"\u0000\u0000\u0000\u0143\u0146\u0001\u0000\u0000\u0000\u0144\u0142\u0001"+
"\u0000\u0000\u0000\u0144\u0145\u0001\u0000\u0000\u0000\u0145q\u0001\u0000"+
"\u0000\u0000\u0146\u0144\u0001\u0000\u0000\u0000\u0147\u0149\u0005.\u0000"+
"\u0000\u0148\u014a\u0003\u0080?\u0000\u0149\u0148\u0001\u0000\u0000\u0000"+
"\u014a\u014b\u0001\u0000\u0000\u0000\u014b\u0149\u0001\u0000\u0000\u0000"+
"\u014b\u014c\u0001\u0000\u0000\u0000\u014c\u014e\u0001\u0000\u0000\u0000"+
"\u014d\u014f\u0003\u0082@\u0000\u014e\u014d\u0001\u0000\u0000\u0000\u014e"+
"\u014f\u0001\u0000\u0000\u0000\u014f\u0151\u0001\u0000\u0000\u0000\u0150"+
"\u0152\u0003\u0086B\u0000\u0151\u0150\u0001\u0000\u0000\u0000\u0151\u0152"+
"\u0001\u0000\u0000\u0000\u0152\u0175\u0001\u0000\u0000\u0000\u0153\u0155"+
"\u0003\u0080?\u0000\u0154\u0153\u0001\u0000\u0000\u0000\u0155\u0156\u0001"+
"\u0000\u0000\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0156\u0157\u0001"+
"\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000\u0000\u0158\u015a\u0005"+
".\u0000\u0000\u0159\u015b\u0003\u0080?\u0000\u015a\u0159\u0001\u0000\u0000"+
"\u0000\u015b\u015c\u0001\u0000\u0000\u0000\u015c\u015a\u0001\u0000\u0000"+
"\u0000\u015c\u015d\u0001\u0000\u0000\u0000\u015d\u015f\u0001\u0000\u0000"+
"\u0000\u015e\u0160\u0003\u0082@\u0000\u015f\u015e\u0001\u0000\u0000\u0000"+
"\u015f\u0160\u0001\u0000\u0000\u0000\u0160\u0162\u0001\u0000\u0000\u0000"+
"\u0161\u0163\u0003\u0086B\u0000\u0162\u0161\u0001\u0000\u0000\u0000\u0162"+
"\u0163\u0001\u0000\u0000\u0000\u0163\u0175\u0001\u0000\u0000\u0000\u0164"+
"\u0166\u0003\u0080?\u0000\u0165\u0164\u0001\u0000\u0000\u0000\u0166\u0167"+
"\u0001\u0000\u0000\u0000\u0167\u0165\u0001\u0000\u0000\u0000\u0167\u0168"+
"\u0001\u0000\u0000\u0000\u0168\u0169\u0001\u0000\u0000\u0000\u0169\u016b"+
"\u0003\u0082@\u0000\u016a\u016c\u0003\u0086B\u0000\u016b\u016a\u0001\u0000"+
"\u0000\u0000\u016b\u016c\u0001\u0000\u0000\u0000\u016c\u0175\u0001\u0000"+
"\u0000\u0000\u016d\u016f\u0003\u0080?\u0000\u016e\u016d\u0001\u0000\u0000"+
"\u0000\u016f\u0170\u0001\u0000\u0000\u0000\u0170\u016e\u0001\u0000\u0000"+
"\u0000\u0170\u0171\u0001\u0000\u0000\u0000\u0171\u0172\u0001\u0000\u0000"+
"\u0000\u0172\u0173\u0003\u0086B\u0000\u0173\u0175\u0001\u0000\u0000\u0000"+
"\u0174\u0147\u0001\u0000\u0000\u0000\u0174\u0154\u0001\u0000\u0000\u0000"+
"\u0174\u0165\u0001\u0000\u0000\u0000\u0174\u016e\u0001\u0000\u0000\u0000"+
"\u0175s\u0001\u0000\u0000\u0000\u0176\u0178\u0003\u0080?\u0000\u0177\u0176"+
"\u0001\u0000\u0000\u0000\u0178\u0179\u0001\u0000\u0000\u0000\u0179\u0177"+
"\u0001\u0000\u0000\u0000\u0179\u017a\u0001\u0000\u0000\u0000\u017a\u017c"+
"\u0001\u0000\u0000\u0000\u017b\u017d\u0003|=\u0000\u017c\u017b\u0001\u0000"+
"\u0000\u0000\u017c\u017d\u0001\u0000\u0000\u0000\u017du\u0001\u0000\u0000"+
"\u0000\u017e\u0181\u0003x;\u0000\u017f\u0181\u0003z<\u0000\u0180\u017e"+
"\u0001\u0000\u0000\u0000\u0180\u017f\u0001\u0000\u0000\u0000\u0181w\u0001"+
"\u0000\u0000\u0000\u0182\u0188\u0005\'\u0000\u0000\u0183\u0184\u0005\'"+
"\u0000\u0000\u0184\u0187\u0005\'\u0000\u0000\u0185\u0187\b\u0003\u0000"+
"\u0000\u0186\u0183\u0001\u0000\u0000\u0000\u0186\u0185\u0001\u0000\u0000"+
"\u0000\u0187\u018a\u0001\u0000\u0000\u0000\u0188\u0186\u0001\u0000\u0000"+
"\u0000\u0188\u0189\u0001\u0000\u0000\u0000\u0189\u018b\u0001\u0000\u0000"+
"\u0000\u018a\u0188\u0001\u0000\u0000\u0000\u018b\u018c\u0005\'\u0000\u0000"+
"\u018cy\u0001\u0000\u0000\u0000\u018d\u0193\u0005\"\u0000\u0000\u018e"+
"\u018f\u0005\"\u0000\u0000\u018f\u0192\u0005\"\u0000\u0000\u0190\u0192"+
"\b\u0004\u0000\u0000\u0191\u018e\u0001\u0000\u0000\u0000\u0191\u0190\u0001"+
"\u0000\u0000\u0000\u0192\u0195\u0001\u0000\u0000\u0000\u0193\u0191\u0001"+
"\u0000\u0000\u0000\u0193\u0194\u0001\u0000\u0000\u0000\u0194\u0196\u0001"+
"\u0000\u0000\u0000\u0195\u0193\u0001\u0000\u0000\u0000\u0196\u0197\u0005"+
"\"\u0000\u0000\u0197{\u0001\u0000\u0000\u0000\u0198\u0199\u0007\u0005"+
"\u0000\u0000\u0199}\u0001\u0000\u0000\u0000\u019a\u019b\u0007\u0006\u0000"+
"\u0000\u019b\u007f\u0001\u0000\u0000\u0000\u019c\u019d\u0007\u0007\u0000"+
"\u0000\u019d\u0081\u0001\u0000\u0000\u0000\u019e\u01a2\u0005e\u0000\u0000"+
"\u019f\u01a1\u0003\u0084A\u0000\u01a0\u019f\u0001\u0000\u0000\u0000\u01a1"+
"\u01a4\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000\u01a2"+
"\u01a3\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4"+
"\u01a2\u0001\u0000\u0000\u0000\u01a5\u01a7\u0003\u0080?\u0000\u01a6\u01a5"+
"\u0001\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000\u01a8\u01a6"+
"\u0001\u0000\u0000\u0000\u01a8\u01a9\u0001\u0000\u0000\u0000\u01a9\u01b7"+
"\u0001\u0000\u0000\u0000\u01aa\u01ae\u0005E\u0000\u0000\u01ab\u01ad\u0003"+
"\u0084A\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000\u01ad\u01b0\u0001\u0000"+
"\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01af\u0001\u0000"+
"\u0000\u0000\u01af\u01b2\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001\u0000"+
"\u0000\u0000\u01b1\u01b3\u0003\u0080?\u0000\u01b2\u01b1\u0001\u0000\u0000"+
"\u0000\u01b3\u01b4\u0001\u0000\u0000\u0000\u01b4\u01b2\u0001\u0000\u0000"+
"\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000\u01b5\u01b7\u0001\u0000\u0000"+
"\u0000\u01b6\u019e\u0001\u0000\u0000\u0000\u01b6\u01aa\u0001\u0000\u0000"+
"\u0000\u01b7\u0083\u0001\u0000\u0000\u0000\u01b8\u01b9\u0007\b\u0000\u0000"+
"\u01b9\u0085\u0001\u0000\u0000\u0000\u01ba\u01bb\u0007\t\u0000\u0000\u01bb"+
"\u0087\u0001\u0000\u0000\u0000\u01bc\u01be\u0007\n\u0000\u0000\u01bd\u01bc"+
"\u0001\u0000\u0000\u0000\u01be\u0089\u0001\u0000\u0000\u0000\u01bf\u01c0"+
"\u0007\u0007\u0000\u0000\u01c0\u008b\u0001\u0000\u0000\u0000\u01c1\u01c2"+
"\u0005`\u0000\u0000\u01c2\u01c3\u0005`\u0000\u0000\u01c3\u008d\u0001\u0000"+
"\u0000\u0000\u01c4\u01c5\u0005#\u0000\u0000\u01c5\u01c6\u0005{\u0000\u0000"+
"\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7\u01c8\u0006F\u0006\u0000\u01c8"+
"\u01c9\u0001\u0000\u0000\u0000\u01c9\u01ca\u0006F\u0002\u0000\u01ca\u008f"+
"\u0001\u0000\u0000\u0000\u01cb\u01cc\b\u000b\u0000\u0000\u01cc\u0091\u0001"+
"\u0000\u0000\u0000\u01cd\u01ce\u0005`\u0000\u0000\u01ce\u01cf\u0001\u0000"+
"\u0000\u0000\u01cf\u01d0\u0006H\u0007\u0000\u01d0\u01d1\u0006H\u0004\u0000"+
"\u01d1\u0093\u0001\u0000\u0000\u0000\u001f\u0000\u0001\u0099\u009e\u013d"+
"\u0142\u0144\u014b\u014e\u0151\u0156\u015c\u015f\u0162\u0167\u016b\u0170"+
"\u0174\u0179\u017c\u0180\u0186\u0188\u0191\u0193\u01a2\u01a8\u01ae\u01b4"+
"\u01b6\u01bd\b\u0000\u0001\u0000\u0001&\u0000\u0005\u0000\u0000\u0001"+
"\'\u0001\u0004\u0000\u0000\u0005\u0001\u0000\u0001F\u0002\u0007(\u0000";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@@ -180,6 +180,18 @@ public class SpelParserBaseListener implements SpelParserListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitLiteral(SpelParser.LiteralContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterNumericLiteral(SpelParser.NumericLiteralContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitNumericLiteral(SpelParser.NumericLiteralContext ctx) { }
/**
* {@inheritDoc}
*
@@ -324,6 +336,18 @@ public class SpelParserBaseListener implements SpelParserListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitBeanReference(SpelParser.BeanReferenceContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterInputParameter(SpelParser.InputParameterContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitInputParameter(SpelParser.InputParameterContext ctx) { }
/**
* {@inheritDoc}

View File

@@ -149,6 +149,16 @@ public interface SpelParserListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitLiteral(SpelParser.LiteralContext ctx);
/**
* Enter a parse tree produced by {@link SpelParser#numericLiteral}.
* @param ctx the parse tree
*/
void enterNumericLiteral(SpelParser.NumericLiteralContext ctx);
/**
* Exit a parse tree produced by {@link SpelParser#numericLiteral}.
* @param ctx the parse tree
*/
void exitNumericLiteral(SpelParser.NumericLiteralContext ctx);
/**
* Enter a parse tree produced by {@link SpelParser#parenspelExpr}.
* @param ctx the parse tree
@@ -269,4 +279,14 @@ public interface SpelParserListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitBeanReference(SpelParser.BeanReferenceContext ctx);
/**
* Enter a parse tree produced by {@link SpelParser#inputParameter}.
* @param ctx the parse tree
*/
void enterInputParameter(SpelParser.InputParameterContext ctx);
/**
* Exit a parse tree produced by {@link SpelParser#inputParameter}.
* @param ctx the parse tree
*/
void exitInputParameter(SpelParser.InputParameterContext ctx);
}

View File

@@ -12,16 +12,26 @@ package org.springframework.ide.vscode.boot.java.spel;
import static org.springframework.ide.vscode.parser.spel.SpelLexer.*;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.antlr.v4.runtime.ANTLRErrorListener;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ConsoleErrorListener;
import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.atn.ATNConfigSet;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.tree.ErrorNode;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.springframework.ide.vscode.commons.languageserver.semantic.tokens.SemanticTokenData;
@@ -32,15 +42,26 @@ import org.springframework.ide.vscode.parser.spel.SpelParser.BeanReferenceContex
import org.springframework.ide.vscode.parser.spel.SpelParser.ConstructorReferenceContext;
import org.springframework.ide.vscode.parser.spel.SpelParser.DottedNodeContext;
import org.springframework.ide.vscode.parser.spel.SpelParser.FunctionOrVarContext;
import org.springframework.ide.vscode.parser.spel.SpelParser.InputParameterContext;
import org.springframework.ide.vscode.parser.spel.SpelParser.MethodOrPropertyContext;
import org.springframework.ide.vscode.parser.spel.SpelParser.PossiblyQualifiedIdContext;
import org.springframework.ide.vscode.parser.spel.SpelParserBaseListener;
public class SpelSemanticTokens implements SemanticTokensDataProvider {
private final Optional<Consumer<RecognitionException>> parseErrorHandler;
public SpelSemanticTokens(Optional<Consumer<RecognitionException>> parseErrorHandler) {
this.parseErrorHandler = parseErrorHandler;
}
public SpelSemanticTokens() {
this(Optional.empty());
}
@Override
public List<String> getTokenTypes() {
return List.of("operator", "keyword", "type", "string", "number", "method", "property");
return List.of("operator", "keyword", "type", "string", "number", "method", "property", "parameter");
}
@Override
@@ -54,6 +75,8 @@ public class SpelSemanticTokens implements SemanticTokensDataProvider {
lexer.removeErrorListener(ConsoleErrorListener.INSTANCE);
parser.removeErrorListener(ConsoleErrorListener.INSTANCE);
List<SemanticTokenData> tokens = new ArrayList<>();
parser.addParseListener(new SpelParserBaseListener() {
private void processTerminalNode(TerminalNode node) {
@@ -119,7 +142,6 @@ public class SpelSemanticTokens implements SemanticTokensDataProvider {
case IDENTIFIER:
semantics.put(node.getSymbol(), "variable");
break;
case NUMERIC_LITERAL:
case INTEGER_LITERAL:
case REAL_LITERAL:
semantics.put(node.getSymbol(), "number");
@@ -178,6 +200,17 @@ public class SpelSemanticTokens implements SemanticTokensDataProvider {
}
}
@Override
public void exitInputParameter(InputParameterContext ctx) {
semantics.remove(ctx.LSQUARE().getSymbol());
semantics.remove(ctx.INTEGER_LITERAL().getSymbol());
semantics.remove(ctx.RSQUARE().getSymbol());
int start = ctx.getStart().getStartIndex() + initialOffset;
int end = start + ctx.getText().length();
tokens.add(new SemanticTokenData(start, end, "parameter", new String[0]));
}
@Override
public void visitTerminal(TerminalNode node) {
processTerminalNode(node);
@@ -190,13 +223,38 @@ public class SpelSemanticTokens implements SemanticTokensDataProvider {
});
parser.addErrorListener(new ANTLRErrorListener() {
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine,
String msg, RecognitionException e) {
parseErrorHandler.ifPresent(h -> h.accept(e));
}
@Override
public void reportContextSensitivity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, int prediction,
ATNConfigSet configs) {
}
@Override
public void reportAttemptingFullContext(Parser recognizer, DFA dfa, int startIndex, int stopIndex,
BitSet conflictingAlts, ATNConfigSet configs) {
}
@Override
public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact,
BitSet ambigAlts, ATNConfigSet configs) {
}
});
parser.spelExpr();
List<SemanticTokenData> tokens = semantics.entrySet().stream()
tokens.addAll(semantics.entrySet().stream()
.map(e -> new SemanticTokenData(e.getKey().getStartIndex() + initialOffset,
e.getKey().getStartIndex() + e.getKey().getText().length() + initialOffset, e.getValue(),
new String[0]))
.collect(Collectors.toList());
.collect(Collectors.toList()));
Collections.sort(tokens);

View File

@@ -13,13 +13,15 @@ package org.springframework.ide.vscode.boot.java.spel;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.ide.vscode.commons.languageserver.semantic.tokens.SemanticTokenData;
public class SpelSemanticTokensTest {
private SpelSemanticTokens provider = new SpelSemanticTokens();
private SpelSemanticTokens provider = new SpelSemanticTokens(Optional.of(Assertions::fail));
@Test
void simpleCompare() {
@@ -124,5 +126,22 @@ public class SpelSemanticTokensTest {
assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(37, 38, "operator", new String[0]));
assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(38, 39, "operator", new String[0]));
}
//https://github.com/spring-projects/sts4/issues/1320
@Test
void inputParameter() {
List<SemanticTokenData> tokens = provider.computeTokens("[1].size().longValue()", 0);
assertThat(tokens.size()).isEqualTo(9);
assertThat(tokens.get(0)).isEqualTo(new SemanticTokenData(0, 3, "parameter", new String[0])); // [1]
assertThat(tokens.get(1)).isEqualTo(new SemanticTokenData(3, 4, "operator", new String[0])); // .
assertThat(tokens.get(2)).isEqualTo(new SemanticTokenData(4, 8, "method", new String[0])); // size
assertThat(tokens.get(3)).isEqualTo(new SemanticTokenData(8, 9, "operator", new String[0])); // (
assertThat(tokens.get(4)).isEqualTo(new SemanticTokenData(9, 10, "operator", new String[0])); // )
assertThat(tokens.get(5)).isEqualTo(new SemanticTokenData(10, 11, "operator", new String[0])); // .
assertThat(tokens.get(6)).isEqualTo(new SemanticTokenData(11, 20, "method", new String[0])); // longValue
assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(20, 21, "operator", new String[0])); // (
assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(21, 22, "operator", new String[0])); // )
}
}