diff --git a/atomic_counter b/atomic_counter deleted file mode 100755 index 0fafc0b..0000000 Binary files a/atomic_counter and /dev/null differ diff --git a/parser/TLexer.g4 b/parser/TLexer.g4 index 9b53a1f..ca9be1b 100644 --- a/parser/TLexer.g4 +++ b/parser/TLexer.g4 @@ -57,9 +57,9 @@ NIL_LIT : 'nil' -> mode(NLSEMI); RETURN : 'return' -> mode(NLSEMI); SYNC : 'sync'; // New keyword //SELECT : 'select'; -//STRUCT : 'struct'; +STRUCT : 'struct'; //SWITCH : 'switch'; -//TYPE : 'type'; +TYPE : 'type'; VAR : 'var'; IDENTIFIER: LETTER (LETTER | UNICODE_DIGIT)* -> mode(NLSEMI); @@ -76,7 +76,7 @@ ASSIGN : '='; COMMA : ','; SEMI : ';'; COLON : ':'; -//DOT : '.'; +DOT : '.'; PLUS_PLUS : '++' -> mode(NLSEMI); MINUS_MINUS : '--' -> mode(NLSEMI); DECLARE_ASSIGN : ':='; diff --git a/parser/TParser.g4 b/parser/TParser.g4 index b85273c..17d8424 100644 --- a/parser/TParser.g4 +++ b/parser/TParser.g4 @@ -97,7 +97,7 @@ importPath declaration : constDecl - //| typeDecl + | typeDecl | varDecl ; @@ -116,10 +116,10 @@ identifierList expressionList : expression (COMMA expression)* ; -/* + typeDecl : TYPE (typeSpec | L_PAREN (typeSpec eos)* R_PAREN) - ;*/ + ; typeSpec : aliasDecl @@ -169,7 +169,7 @@ varDecl ; varSpec - : identifierList (type_ (ASSIGN expressionList)? | ASSIGN expressionList) + : identifierList (type_ (ASSIGN expressionList)?) // | ASSIGN expressionList not supported yet (without type) ; block @@ -376,13 +376,13 @@ typeArgs ; typeName - //: qualifiedIdent - : IDENTIFIER + : qualifiedIdent + | IDENTIFIER ; typeLit : arrayType - //| structType + | structType //| pointerType | functionType //| interfaceType @@ -393,7 +393,7 @@ typeLit ; arrayType - : L_BRACKET arrayLength R_BRACKET elementType + : L_BRACKET arrayLength? R_BRACKET elementType ; arrayLength @@ -410,12 +410,12 @@ pointerType interfaceType : INTERFACE L_CURLY ((methodSpec | typeElement) eos)* R_CURLY - ; - + ;*/ +/* sliceType : L_BRACKET R_BRACKET elementType - ; - + ;*/ +/* // It's possible to replace `type` with more restricted typeLit list and also pay attention to nil maps mapType : MAP L_BRACKET type_ R_BRACKET elementType @@ -462,7 +462,7 @@ parameterDecl expression : primaryExpr | unary_op = (PLUS | MINUS | EXCLAMATION | CARET | STAR | AMPERSAND /*| RECEIVE*/) expression - | expression EMIT expression + | expression EMIT expression // For Sync channels | expression mul_op = (STAR | DIV | MOD | LSHIFT | RSHIFT | AMPERSAND | BIT_CLEAR) expression | expression add_op = (PLUS | MINUS | OR | CARET) expression | expression rel_op = ( @@ -482,7 +482,11 @@ primaryExpr /*( {this->isOperand()}? operand | {this->isConversion()}? conversion | {this.isMethodExpr()}? methodExpr )*/ - ( /*DOT IDENTIFIER* | index | /*slice_ | typeAssertion |*/ arguments )* + op = operation* + ; + +operation + : ( DOT IDENTIFIER* | index | slice_ | /*typeAssertion |*/ arguments ) ; conversion @@ -519,20 +523,20 @@ integer operandName : IDENTIFIER - // | qualifiedIdent + | qualifiedIdent ; -/* + qualifiedIdent : IDENTIFIER DOT IDENTIFIER - ;*/ + ; compositeLit : literalType literalValue ; literalType - //: structType - : arrayType + : structType + | arrayType //| L_BRACKET ELLIPSIS R_BRACKET elementType //| sliceType //| mapType @@ -560,23 +564,23 @@ element : expression | literalValue ; -/* + structType : STRUCT L_CURLY (fieldDecl eos)* R_CURLY ; fieldDecl : (identifierList type_ | embeddedField) tag = string_? - ;*/ + ; string_ : RAW_STRING_LIT | INTERPRETED_STRING_LIT ; -/* + embeddedField : STAR? typeName typeArgs? - ;*/ + ; functionLit : FUNC signature block @@ -585,10 +589,10 @@ functionLit index : L_BRACKET expression R_BRACKET ; -/* + slice_ : L_BRACKET (expression? COLON expression? | expression? COLON expression COLON expression) R_BRACKET - ;*/ + ; /* typeAssertion : DOT L_PAREN type_ R_PAREN diff --git a/parser/generated/TLexer.cpp b/parser/generated/TLexer.cpp index 7a2fbdf..a1bc825 100644 --- a/parser/generated/TLexer.cpp +++ b/parser/generated/TLexer.cpp @@ -66,14 +66,14 @@ void tlexerLexerInitialize() { auto staticData = std::make_unique( std::vector{ "AS", "ASYNC", "BREAK", "CASE", "CONST", "CONTINUE", "ELSE", "FOR", - "FROM", "FUNC", "JOIN", "IF", "NIL_LIT", "RETURN", "SYNC", "VAR", - "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", - "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "PLUS_PLUS", "MINUS_MINUS", - "DECLARE_ASSIGN", "LOGICAL_OR", "LOGICAL_AND", "SYNC_RETURN", "EQUALS", - "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", - "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", "UNDERLYING", - "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "EMIT", - "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", + "FROM", "FUNC", "JOIN", "IF", "NIL_LIT", "RETURN", "SYNC", "STRUCT", + "TYPE", "VAR", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", + "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", + "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "LOGICAL_OR", "LOGICAL_AND", + "SYNC_RETURN", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", + "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", + "UNDERLYING", "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", + "EMIT", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "HEX_FLOAT_LIT", "HEX_MANTISSA", "HEX_EXPONENT", "IMAGINARY_LIT", "RUNE", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", @@ -91,22 +91,22 @@ void tlexerLexerInitialize() { std::vector{ "", "'as'", "'async'", "'break'", "'case'", "'const'", "'continue'", "'else'", "'for'", "'from'", "'func'", "'join'", "'if'", "'nil'", - "'return'", "'sync'", "'var'", "", "'('", "')'", "'{'", "'}'", "'['", - "']'", "'='", "','", "';'", "':'", "'++'", "'--'", "':='", "'||'", - "'&&'", "'<|'", "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", - "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'~'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'return'", "'sync'", "'struct'", "'type'", "'var'", "", "'('", "')'", + "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", + "'--'", "':='", "'||'", "'&&'", "'<|'", "'=='", "'!='", "'<'", "'<='", + "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'~'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }, std::vector{ "", "AS", "ASYNC", "BREAK", "CASE", "CONST", "CONTINUE", "ELSE", "FOR", - "FROM", "FUNC", "JOIN", "IF", "NIL_LIT", "RETURN", "SYNC", "VAR", - "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", - "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "PLUS_PLUS", "MINUS_MINUS", - "DECLARE_ASSIGN", "LOGICAL_OR", "LOGICAL_AND", "SYNC_RETURN", "EQUALS", - "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", - "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", "UNDERLYING", - "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "EMIT", - "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", + "FROM", "FUNC", "JOIN", "IF", "NIL_LIT", "RETURN", "SYNC", "STRUCT", + "TYPE", "VAR", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", + "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", + "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "LOGICAL_OR", "LOGICAL_AND", + "SYNC_RETURN", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", + "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", + "UNDERLYING", "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", + "EMIT", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", @@ -115,7 +115,7 @@ void tlexerLexerInitialize() { } ); static const int32_t serializedATNSegment[] = { - 4,0,78,740,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, + 4,0,81,760,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, 2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7, 13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7, 20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7, @@ -128,364 +128,371 @@ void tlexerLexerInitialize() { 69,2,70,7,70,2,71,7,71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7, 76,2,77,7,77,2,78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7, 83,2,84,7,84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7, - 90,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1, - 2,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5, - 1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1, - 8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,12, - 1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13, - 1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,16,1,16,1,16,5,16,278, - 8,16,10,16,12,16,281,9,16,1,16,1,16,1,17,1,17,1,18,1,18,1,18,1,18,1,19, - 1,19,1,20,1,20,1,20,1,20,1,21,1,21,1,22,1,22,1,22,1,22,1,23,1,23,1,24, - 1,24,1,25,1,25,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28, - 1,28,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,31,1,31,1,32,1,32,1,32,1,33, - 1,33,1,33,1,34,1,34,1,34,1,35,1,35,1,36,1,36,1,36,1,37,1,37,1,38,1,38, - 1,38,1,39,1,39,1,40,1,40,1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,1,44, - 1,44,1,44,1,45,1,45,1,46,1,46,1,47,1,47,1,48,1,48,1,49,1,49,1,50,1,50, - 1,51,1,51,1,52,1,52,1,52,1,53,1,53,1,53,3,53,384,8,53,1,53,5,53,387,8, - 53,10,53,12,53,390,9,53,3,53,392,8,53,1,53,1,53,1,54,1,54,1,54,3,54,399, - 8,54,1,54,4,54,402,8,54,11,54,12,54,403,1,54,1,54,1,55,1,55,3,55,410, - 8,55,1,55,3,55,413,8,55,1,55,4,55,416,8,55,11,55,12,55,417,1,55,1,55, - 1,56,1,56,1,56,3,56,425,8,56,1,56,4,56,428,8,56,11,56,12,56,429,1,56, - 1,56,1,57,1,57,3,57,436,8,57,1,57,1,57,1,58,1,58,1,58,3,58,443,8,58,1, - 58,3,58,446,8,58,1,58,3,58,449,8,58,1,58,1,58,1,58,3,58,454,8,58,3,58, - 456,8,58,1,59,1,59,1,59,1,59,1,59,1,60,3,60,464,8,60,1,60,4,60,467,8, - 60,11,60,12,60,468,1,60,1,60,3,60,473,8,60,1,60,5,60,476,8,60,10,60,12, - 60,479,9,60,3,60,481,8,60,1,60,1,60,1,60,3,60,486,8,60,1,60,5,60,489, - 8,60,10,60,12,60,492,9,60,3,60,494,8,60,1,61,1,61,3,61,498,8,61,1,61, - 1,61,1,62,1,62,1,62,1,62,1,62,3,62,507,8,62,1,62,1,62,1,62,1,62,1,63, - 1,63,1,63,3,63,516,8,63,1,63,1,63,1,64,1,64,1,64,1,64,1,65,1,65,3,65, - 526,8,65,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,68,1,68, - 1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, - 1,69,1,69,1,70,1,70,5,70,558,8,70,10,70,12,70,561,9,70,1,70,1,70,1,70, - 1,70,1,71,1,71,1,71,5,71,570,8,71,10,71,12,71,573,9,71,1,71,1,71,1,71, - 1,71,1,72,4,72,580,8,72,11,72,12,72,581,1,72,1,72,1,73,1,73,1,73,1,73, - 5,73,590,8,73,10,73,12,73,593,9,73,1,73,1,73,1,73,1,73,1,73,1,74,4,74, - 601,8,74,11,74,12,74,602,1,74,1,74,1,75,1,75,1,75,1,75,5,75,611,8,75, - 10,75,12,75,614,9,75,1,75,1,75,1,76,1,76,1,76,1,76,3,76,622,8,76,1,77, - 1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77, - 1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,3,77,650,8,77, - 1,78,1,78,3,78,654,8,78,1,78,5,78,657,8,78,10,78,12,78,660,9,78,1,79, - 1,79,1,80,1,80,1,81,1,81,1,82,1,82,3,82,670,8,82,1,82,1,82,1,83,1,83, - 3,83,676,8,83,1,84,1,84,1,85,1,85,1,86,4,86,683,8,86,11,86,12,86,684, - 1,86,1,86,1,87,1,87,1,87,1,87,5,87,693,8,87,10,87,12,87,696,9,87,1,87, - 1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,5,88,707,8,88,10,88,12,88,710, - 9,88,1,88,1,88,1,89,4,89,715,8,89,11,89,12,89,716,1,89,1,89,1,89,1,89, - 1,89,5,89,724,8,89,10,89,12,89,727,9,89,1,89,1,89,1,89,3,89,732,8,89, - 1,89,1,89,1,90,1,90,1,90,1,90,1,90,3,591,694,725,0,91,2,1,4,2,6,3,8,4, - 10,5,12,6,14,7,16,8,18,9,20,10,22,11,24,12,26,13,28,14,30,15,32,16,34, - 17,36,18,38,19,40,20,42,21,44,22,46,23,48,24,50,25,52,26,54,27,56,28, - 58,29,60,30,62,31,64,32,66,33,68,34,70,35,72,36,74,37,76,38,78,39,80, - 40,82,41,84,42,86,43,88,44,90,45,92,46,94,47,96,48,98,49,100,50,102,51, - 104,52,106,53,108,54,110,55,112,56,114,57,116,58,118,59,120,60,122,0, - 124,0,126,61,128,0,130,62,132,63,134,64,136,65,138,66,140,67,142,68,144, - 69,146,70,148,71,150,72,152,73,154,0,156,0,158,0,160,0,162,0,164,0,166, - 0,168,0,170,0,172,0,174,74,176,75,178,76,180,77,182,78,2,0,1,19,1,0,49, - 57,1,0,48,57,2,0,66,66,98,98,2,0,79,79,111,111,2,0,88,88,120,120,2,0, - 80,80,112,112,2,0,43,43,45,45,1,0,96,96,2,0,34,34,92,92,2,0,9,9,32,32, - 2,0,10,10,13,13,3,0,10,10,13,13,39,39,9,0,34,34,39,39,92,92,97,98,102, - 102,110,110,114,114,116,116,118,118,1,0,48,55,3,0,48,57,65,70,97,102, - 1,0,48,49,2,0,69,69,101,101,64,0,48,57,1632,1641,1776,1785,1984,1993, - 2406,2415,2534,2543,2662,2671,2790,2799,2918,2927,3046,3055,3174,3183, - 3302,3311,3430,3439,3558,3567,3664,3673,3792,3801,3872,3881,4160,4169, - 4240,4249,6112,6121,6160,6169,6470,6479,6608,6617,6784,6793,6800,6809, - 6992,7001,7088,7097,7232,7241,7248,7257,42528,42537,43216,43225,43264, - 43273,43472,43481,43504,43513,43600,43609,44016,44025,65296,65305,66720, - 66729,68912,68921,69734,69743,69872,69881,69942,69951,70096,70105,70384, - 70393,70736,70745,70864,70873,71248,71257,71360,71369,71472,71481,71904, - 71913,72016,72025,72784,72793,73040,73049,73120,73129,73552,73561,92768, - 92777,92864,92873,93008,93017,120782,120831,123200,123209,123632,123641, - 124144,124153,125264,125273,130032,130041,659,0,65,90,97,122,170,170, - 181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750, - 880,884,886,887,890,893,895,895,902,902,904,906,908,908,910,929,931,1013, - 1015,1153,1162,1327,1329,1366,1369,1369,1376,1416,1488,1514,1519,1522, - 1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788, - 1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036,2037, - 2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2144,2154, - 2160,2183,2185,2190,2208,2249,2308,2361,2365,2365,2384,2384,2392,2401, - 2417,2432,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489, - 2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2556,2556,2565,2570, - 2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652, - 2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739, - 2741,2745,2749,2749,2768,2768,2784,2785,2809,2809,2821,2828,2831,2832, - 2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913, - 2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972, - 2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088, - 3090,3112,3114,3129,3133,3133,3160,3162,3165,3165,3168,3169,3200,3200, - 3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3293,3294, - 3296,3297,3313,3314,3332,3340,3342,3344,3346,3386,3389,3389,3406,3406, - 3412,3414,3423,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517,3517, - 3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3718,3722, - 3724,3747,3749,3749,3751,3760,3762,3763,3773,3773,3776,3780,3782,3782, - 3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159,4159, - 4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238,4238, - 4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694, - 4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798, - 4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992,5007, - 5024,5109,5112,5117,5121,5740,5743,5759,5761,5786,5792,5866,5873,5880, - 5888,5905,5919,5937,5952,5969,5984,5996,5998,6000,6016,6067,6103,6103, - 6108,6108,6176,6264,6272,6276,6279,6312,6314,6314,6320,6389,6400,6430, - 6480,6509,6512,6516,6528,6571,6576,6601,6656,6678,6688,6740,6823,6823, - 6917,6963,6981,6988,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247, - 7258,7293,7296,7304,7312,7354,7357,7359,7401,7404,7406,7411,7413,7414, - 7418,7418,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023, - 8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126, - 8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188, - 8305,8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469, - 8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511, - 8517,8521,8526,8526,8579,8580,11264,11492,11499,11502,11506,11507,11520, - 11557,11559,11559,11565,11565,11568,11623,11631,11631,11648,11670,11680, - 11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728, - 11734,11736,11742,11823,11823,12293,12294,12337,12341,12347,12348,12353, - 12438,12445,12447,12449,12538,12540,12543,12549,12591,12593,12686,12704, - 12735,12784,12799,13312,19903,19968,42124,42192,42237,42240,42508,42512, - 42527,42538,42539,42560,42606,42623,42653,42656,42725,42775,42783,42786, - 42888,42891,42954,42960,42961,42963,42963,42965,42969,42994,43009,43011, - 43013,43015,43018,43020,43042,43072,43123,43138,43187,43250,43255,43259, - 43259,43261,43262,43274,43301,43312,43334,43360,43388,43396,43442,43471, - 43471,43488,43492,43494,43503,43514,43518,43520,43560,43584,43586,43588, - 43595,43616,43638,43642,43642,43646,43695,43697,43697,43701,43702,43705, - 43709,43712,43712,43714,43714,43739,43741,43744,43754,43762,43764,43777, - 43782,43785,43790,43793,43798,43808,43814,43816,43822,43824,43866,43868, - 43881,43888,44002,44032,55203,55216,55238,55243,55291,63744,64109,64112, - 64217,64256,64262,64275,64279,64285,64285,64287,64296,64298,64310,64312, - 64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848, - 64911,64914,64967,65008,65019,65136,65140,65142,65276,65313,65338,65345, - 65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500,65536, - 65547,65549,65574,65576,65594,65596,65597,65599,65613,65616,65629,65664, - 65786,66176,66204,66208,66256,66304,66335,66349,66368,66370,66377,66384, - 66421,66432,66461,66464,66499,66504,66511,66560,66717,66736,66771,66776, - 66811,66816,66855,66864,66915,66928,66938,66940,66954,66956,66962,66964, - 66965,66967,66977,66979,66993,66995,67001,67003,67004,67072,67382,67392, - 67413,67424,67431,67456,67461,67463,67504,67506,67514,67584,67589,67592, - 67592,67594,67637,67639,67640,67644,67644,67647,67669,67680,67702,67712, - 67742,67808,67826,67828,67829,67840,67861,67872,67897,67968,68023,68030, - 68031,68096,68096,68112,68115,68117,68119,68121,68149,68192,68220,68224, - 68252,68288,68295,68297,68324,68352,68405,68416,68437,68448,68466,68480, - 68497,68608,68680,68736,68786,68800,68850,68864,68899,69248,69289,69296, - 69297,69376,69404,69415,69415,69424,69445,69488,69505,69552,69572,69600, - 69622,69635,69687,69745,69746,69749,69749,69763,69807,69840,69864,69891, - 69926,69956,69956,69959,69959,69968,70002,70006,70006,70019,70066,70081, - 70084,70106,70106,70108,70108,70144,70161,70163,70187,70207,70208,70272, - 70278,70280,70280,70282,70285,70287,70301,70303,70312,70320,70366,70405, - 70412,70415,70416,70419,70440,70442,70448,70450,70451,70453,70457,70461, - 70461,70480,70480,70493,70497,70656,70708,70727,70730,70751,70753,70784, - 70831,70852,70853,70855,70855,71040,71086,71128,71131,71168,71215,71236, - 71236,71296,71338,71352,71352,71424,71450,71488,71494,71680,71723,71840, - 71903,71935,71942,71945,71945,71948,71955,71957,71958,71960,71983,71999, - 71999,72001,72001,72096,72103,72106,72144,72161,72161,72163,72163,72192, - 72192,72203,72242,72250,72250,72272,72272,72284,72329,72349,72349,72368, - 72440,72704,72712,72714,72750,72768,72768,72818,72847,72960,72966,72968, - 72969,72971,73008,73030,73030,73056,73061,73063,73064,73066,73097,73112, - 73112,73440,73458,73474,73474,73476,73488,73490,73523,73648,73648,73728, - 74649,74880,75075,77712,77808,77824,78895,78913,78918,82944,83526,92160, - 92728,92736,92766,92784,92862,92880,92909,92928,92975,92992,92995,93027, - 93047,93053,93071,93760,93823,93952,94026,94032,94032,94099,94111,94176, - 94177,94179,94179,94208,100343,100352,101589,101632,101640,110576,110579, - 110581,110587,110589,110590,110592,110882,110898,110898,110928,110930, - 110933,110933,110948,110951,110960,111355,113664,113770,113776,113788, - 113792,113800,113808,113817,119808,119892,119894,119964,119966,119967, - 119970,119970,119973,119974,119977,119980,119982,119993,119995,119995, - 119997,120003,120005,120069,120071,120074,120077,120084,120086,120092, - 120094,120121,120123,120126,120128,120132,120134,120134,120138,120144, - 120146,120485,120488,120512,120514,120538,120540,120570,120572,120596, - 120598,120628,120630,120654,120656,120686,120688,120712,120714,120744, - 120746,120770,120772,120779,122624,122654,122661,122666,122928,122989, - 123136,123180,123191,123197,123214,123214,123536,123565,123584,123627, - 124112,124139,124896,124902,124904,124907,124909,124910,124912,124926, - 124928,125124,125184,125251,125259,125259,126464,126467,126469,126495, - 126497,126498,126500,126500,126503,126503,126505,126514,126516,126519, - 126521,126521,126523,126523,126530,126530,126535,126535,126537,126537, - 126539,126539,126541,126543,126545,126546,126548,126548,126551,126551, - 126553,126553,126555,126555,126557,126557,126559,126559,126561,126562, - 126564,126564,126567,126570,126572,126578,126580,126583,126585,126588, - 126590,126590,126592,126601,126603,126619,126625,126627,126629,126633, - 126635,126651,131072,173791,173824,177977,177984,178205,178208,183969, - 183984,191456,194560,195101,196608,201546,201552,205743,784,0,2,1,0,0, - 0,0,4,1,0,0,0,0,6,1,0,0,0,0,8,1,0,0,0,0,10,1,0,0,0,0,12,1,0,0,0,0,14, - 1,0,0,0,0,16,1,0,0,0,0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0,0,0,24,1,0, - 0,0,0,26,1,0,0,0,0,28,1,0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34,1,0,0,0, - 0,36,1,0,0,0,0,38,1,0,0,0,0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0,0,0,46, - 1,0,0,0,0,48,1,0,0,0,0,50,1,0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56,1,0, - 0,0,0,58,1,0,0,0,0,60,1,0,0,0,0,62,1,0,0,0,0,64,1,0,0,0,0,66,1,0,0,0, - 0,68,1,0,0,0,0,70,1,0,0,0,0,72,1,0,0,0,0,74,1,0,0,0,0,76,1,0,0,0,0,78, - 1,0,0,0,0,80,1,0,0,0,0,82,1,0,0,0,0,84,1,0,0,0,0,86,1,0,0,0,0,88,1,0, - 0,0,0,90,1,0,0,0,0,92,1,0,0,0,0,94,1,0,0,0,0,96,1,0,0,0,0,98,1,0,0,0, - 0,100,1,0,0,0,0,102,1,0,0,0,0,104,1,0,0,0,0,106,1,0,0,0,0,108,1,0,0,0, - 0,110,1,0,0,0,0,112,1,0,0,0,0,114,1,0,0,0,0,116,1,0,0,0,0,118,1,0,0,0, - 0,120,1,0,0,0,0,126,1,0,0,0,0,130,1,0,0,0,0,132,1,0,0,0,0,134,1,0,0,0, - 0,136,1,0,0,0,0,138,1,0,0,0,0,140,1,0,0,0,0,142,1,0,0,0,0,144,1,0,0,0, - 0,146,1,0,0,0,0,148,1,0,0,0,0,150,1,0,0,0,0,152,1,0,0,0,1,174,1,0,0,0, - 1,176,1,0,0,0,1,178,1,0,0,0,1,180,1,0,0,0,1,182,1,0,0,0,2,184,1,0,0,0, - 4,187,1,0,0,0,6,193,1,0,0,0,8,201,1,0,0,0,10,206,1,0,0,0,12,212,1,0,0, - 0,14,223,1,0,0,0,16,228,1,0,0,0,18,232,1,0,0,0,20,237,1,0,0,0,22,242, - 1,0,0,0,24,247,1,0,0,0,26,250,1,0,0,0,28,256,1,0,0,0,30,265,1,0,0,0,32, - 270,1,0,0,0,34,274,1,0,0,0,36,284,1,0,0,0,38,286,1,0,0,0,40,290,1,0,0, - 0,42,292,1,0,0,0,44,296,1,0,0,0,46,298,1,0,0,0,48,302,1,0,0,0,50,304, - 1,0,0,0,52,306,1,0,0,0,54,308,1,0,0,0,56,310,1,0,0,0,58,315,1,0,0,0,60, - 320,1,0,0,0,62,323,1,0,0,0,64,326,1,0,0,0,66,329,1,0,0,0,68,332,1,0,0, - 0,70,335,1,0,0,0,72,338,1,0,0,0,74,340,1,0,0,0,76,343,1,0,0,0,78,345, - 1,0,0,0,80,348,1,0,0,0,82,350,1,0,0,0,84,352,1,0,0,0,86,354,1,0,0,0,88, - 357,1,0,0,0,90,360,1,0,0,0,92,363,1,0,0,0,94,365,1,0,0,0,96,367,1,0,0, - 0,98,369,1,0,0,0,100,371,1,0,0,0,102,373,1,0,0,0,104,375,1,0,0,0,106, - 377,1,0,0,0,108,391,1,0,0,0,110,395,1,0,0,0,112,407,1,0,0,0,114,421,1, - 0,0,0,116,435,1,0,0,0,118,455,1,0,0,0,120,457,1,0,0,0,122,493,1,0,0,0, - 124,495,1,0,0,0,126,506,1,0,0,0,128,512,1,0,0,0,130,519,1,0,0,0,132,525, - 1,0,0,0,134,527,1,0,0,0,136,532,1,0,0,0,138,537,1,0,0,0,140,544,1,0,0, - 0,142,555,1,0,0,0,144,566,1,0,0,0,146,579,1,0,0,0,148,585,1,0,0,0,150, - 600,1,0,0,0,152,606,1,0,0,0,154,621,1,0,0,0,156,623,1,0,0,0,158,651,1, - 0,0,0,160,661,1,0,0,0,162,663,1,0,0,0,164,665,1,0,0,0,166,667,1,0,0,0, - 168,675,1,0,0,0,170,677,1,0,0,0,172,679,1,0,0,0,174,682,1,0,0,0,176,688, - 1,0,0,0,178,702,1,0,0,0,180,731,1,0,0,0,182,735,1,0,0,0,184,185,5,97, - 0,0,185,186,5,115,0,0,186,3,1,0,0,0,187,188,5,97,0,0,188,189,5,115,0, - 0,189,190,5,121,0,0,190,191,5,110,0,0,191,192,5,99,0,0,192,5,1,0,0,0, - 193,194,5,98,0,0,194,195,5,114,0,0,195,196,5,101,0,0,196,197,5,97,0,0, - 197,198,5,107,0,0,198,199,1,0,0,0,199,200,6,2,0,0,200,7,1,0,0,0,201,202, - 5,99,0,0,202,203,5,97,0,0,203,204,5,115,0,0,204,205,5,101,0,0,205,9,1, - 0,0,0,206,207,5,99,0,0,207,208,5,111,0,0,208,209,5,110,0,0,209,210,5, - 115,0,0,210,211,5,116,0,0,211,11,1,0,0,0,212,213,5,99,0,0,213,214,5,111, - 0,0,214,215,5,110,0,0,215,216,5,116,0,0,216,217,5,105,0,0,217,218,5,110, - 0,0,218,219,5,117,0,0,219,220,5,101,0,0,220,221,1,0,0,0,221,222,6,5,0, - 0,222,13,1,0,0,0,223,224,5,101,0,0,224,225,5,108,0,0,225,226,5,115,0, - 0,226,227,5,101,0,0,227,15,1,0,0,0,228,229,5,102,0,0,229,230,5,111,0, - 0,230,231,5,114,0,0,231,17,1,0,0,0,232,233,5,102,0,0,233,234,5,114,0, - 0,234,235,5,111,0,0,235,236,5,109,0,0,236,19,1,0,0,0,237,238,5,102,0, - 0,238,239,5,117,0,0,239,240,5,110,0,0,240,241,5,99,0,0,241,21,1,0,0,0, - 242,243,5,106,0,0,243,244,5,111,0,0,244,245,5,105,0,0,245,246,5,110,0, - 0,246,23,1,0,0,0,247,248,5,105,0,0,248,249,5,102,0,0,249,25,1,0,0,0,250, - 251,5,110,0,0,251,252,5,105,0,0,252,253,5,108,0,0,253,254,1,0,0,0,254, - 255,6,12,0,0,255,27,1,0,0,0,256,257,5,114,0,0,257,258,5,101,0,0,258,259, - 5,116,0,0,259,260,5,117,0,0,260,261,5,114,0,0,261,262,5,110,0,0,262,263, - 1,0,0,0,263,264,6,13,0,0,264,29,1,0,0,0,265,266,5,115,0,0,266,267,5,121, - 0,0,267,268,5,110,0,0,268,269,5,99,0,0,269,31,1,0,0,0,270,271,5,118,0, - 0,271,272,5,97,0,0,272,273,5,114,0,0,273,33,1,0,0,0,274,279,3,168,83, - 0,275,278,3,168,83,0,276,278,3,170,84,0,277,275,1,0,0,0,277,276,1,0,0, - 0,278,281,1,0,0,0,279,277,1,0,0,0,279,280,1,0,0,0,280,282,1,0,0,0,281, - 279,1,0,0,0,282,283,6,16,0,0,283,35,1,0,0,0,284,285,5,40,0,0,285,37,1, - 0,0,0,286,287,5,41,0,0,287,288,1,0,0,0,288,289,6,18,0,0,289,39,1,0,0, - 0,290,291,5,123,0,0,291,41,1,0,0,0,292,293,5,125,0,0,293,294,1,0,0,0, - 294,295,6,20,0,0,295,43,1,0,0,0,296,297,5,91,0,0,297,45,1,0,0,0,298,299, - 5,93,0,0,299,300,1,0,0,0,300,301,6,22,0,0,301,47,1,0,0,0,302,303,5,61, - 0,0,303,49,1,0,0,0,304,305,5,44,0,0,305,51,1,0,0,0,306,307,5,59,0,0,307, - 53,1,0,0,0,308,309,5,58,0,0,309,55,1,0,0,0,310,311,5,43,0,0,311,312,5, - 43,0,0,312,313,1,0,0,0,313,314,6,27,0,0,314,57,1,0,0,0,315,316,5,45,0, - 0,316,317,5,45,0,0,317,318,1,0,0,0,318,319,6,28,0,0,319,59,1,0,0,0,320, - 321,5,58,0,0,321,322,5,61,0,0,322,61,1,0,0,0,323,324,5,124,0,0,324,325, - 5,124,0,0,325,63,1,0,0,0,326,327,5,38,0,0,327,328,5,38,0,0,328,65,1,0, - 0,0,329,330,5,60,0,0,330,331,5,124,0,0,331,67,1,0,0,0,332,333,5,61,0, - 0,333,334,5,61,0,0,334,69,1,0,0,0,335,336,5,33,0,0,336,337,5,61,0,0,337, - 71,1,0,0,0,338,339,5,60,0,0,339,73,1,0,0,0,340,341,5,60,0,0,341,342,5, - 61,0,0,342,75,1,0,0,0,343,344,5,62,0,0,344,77,1,0,0,0,345,346,5,62,0, - 0,346,347,5,61,0,0,347,79,1,0,0,0,348,349,5,124,0,0,349,81,1,0,0,0,350, - 351,5,47,0,0,351,83,1,0,0,0,352,353,5,37,0,0,353,85,1,0,0,0,354,355,5, - 60,0,0,355,356,5,60,0,0,356,87,1,0,0,0,357,358,5,62,0,0,358,359,5,62, - 0,0,359,89,1,0,0,0,360,361,5,38,0,0,361,362,5,94,0,0,362,91,1,0,0,0,363, - 364,5,126,0,0,364,93,1,0,0,0,365,366,5,33,0,0,366,95,1,0,0,0,367,368, - 5,43,0,0,368,97,1,0,0,0,369,370,5,45,0,0,370,99,1,0,0,0,371,372,5,94, - 0,0,372,101,1,0,0,0,373,374,5,42,0,0,374,103,1,0,0,0,375,376,5,38,0,0, - 376,105,1,0,0,0,377,378,5,60,0,0,378,379,5,45,0,0,379,107,1,0,0,0,380, - 392,5,48,0,0,381,388,7,0,0,0,382,384,5,95,0,0,383,382,1,0,0,0,383,384, - 1,0,0,0,384,385,1,0,0,0,385,387,7,1,0,0,386,383,1,0,0,0,387,390,1,0,0, - 0,388,386,1,0,0,0,388,389,1,0,0,0,389,392,1,0,0,0,390,388,1,0,0,0,391, - 380,1,0,0,0,391,381,1,0,0,0,392,393,1,0,0,0,393,394,6,53,0,0,394,109, - 1,0,0,0,395,396,5,48,0,0,396,401,7,2,0,0,397,399,5,95,0,0,398,397,1,0, - 0,0,398,399,1,0,0,0,399,400,1,0,0,0,400,402,3,164,81,0,401,398,1,0,0, - 0,402,403,1,0,0,0,403,401,1,0,0,0,403,404,1,0,0,0,404,405,1,0,0,0,405, - 406,6,54,0,0,406,111,1,0,0,0,407,409,5,48,0,0,408,410,7,3,0,0,409,408, - 1,0,0,0,409,410,1,0,0,0,410,415,1,0,0,0,411,413,5,95,0,0,412,411,1,0, - 0,0,412,413,1,0,0,0,413,414,1,0,0,0,414,416,3,160,79,0,415,412,1,0,0, - 0,416,417,1,0,0,0,417,415,1,0,0,0,417,418,1,0,0,0,418,419,1,0,0,0,419, - 420,6,55,0,0,420,113,1,0,0,0,421,422,5,48,0,0,422,427,7,4,0,0,423,425, - 5,95,0,0,424,423,1,0,0,0,424,425,1,0,0,0,425,426,1,0,0,0,426,428,3,162, - 80,0,427,424,1,0,0,0,428,429,1,0,0,0,429,427,1,0,0,0,429,430,1,0,0,0, - 430,431,1,0,0,0,431,432,6,56,0,0,432,115,1,0,0,0,433,436,3,118,58,0,434, - 436,3,120,59,0,435,433,1,0,0,0,435,434,1,0,0,0,436,437,1,0,0,0,437,438, - 6,57,0,0,438,117,1,0,0,0,439,448,3,158,78,0,440,442,5,46,0,0,441,443, - 3,158,78,0,442,441,1,0,0,0,442,443,1,0,0,0,443,445,1,0,0,0,444,446,3, - 166,82,0,445,444,1,0,0,0,445,446,1,0,0,0,446,449,1,0,0,0,447,449,3,166, - 82,0,448,440,1,0,0,0,448,447,1,0,0,0,449,456,1,0,0,0,450,451,5,46,0,0, - 451,453,3,158,78,0,452,454,3,166,82,0,453,452,1,0,0,0,453,454,1,0,0,0, - 454,456,1,0,0,0,455,439,1,0,0,0,455,450,1,0,0,0,456,119,1,0,0,0,457,458, - 5,48,0,0,458,459,7,4,0,0,459,460,3,122,60,0,460,461,3,124,61,0,461,121, - 1,0,0,0,462,464,5,95,0,0,463,462,1,0,0,0,463,464,1,0,0,0,464,465,1,0, - 0,0,465,467,3,162,80,0,466,463,1,0,0,0,467,468,1,0,0,0,468,466,1,0,0, - 0,468,469,1,0,0,0,469,480,1,0,0,0,470,477,5,46,0,0,471,473,5,95,0,0,472, - 471,1,0,0,0,472,473,1,0,0,0,473,474,1,0,0,0,474,476,3,162,80,0,475,472, - 1,0,0,0,476,479,1,0,0,0,477,475,1,0,0,0,477,478,1,0,0,0,478,481,1,0,0, - 0,479,477,1,0,0,0,480,470,1,0,0,0,480,481,1,0,0,0,481,494,1,0,0,0,482, - 483,5,46,0,0,483,490,3,162,80,0,484,486,5,95,0,0,485,484,1,0,0,0,485, - 486,1,0,0,0,486,487,1,0,0,0,487,489,3,162,80,0,488,485,1,0,0,0,489,492, - 1,0,0,0,490,488,1,0,0,0,490,491,1,0,0,0,491,494,1,0,0,0,492,490,1,0,0, - 0,493,466,1,0,0,0,493,482,1,0,0,0,494,123,1,0,0,0,495,497,7,5,0,0,496, - 498,7,6,0,0,497,496,1,0,0,0,497,498,1,0,0,0,498,499,1,0,0,0,499,500,3, - 158,78,0,500,125,1,0,0,0,501,507,3,108,53,0,502,507,3,110,54,0,503,507, - 3,112,55,0,504,507,3,114,56,0,505,507,3,116,57,0,506,501,1,0,0,0,506, - 502,1,0,0,0,506,503,1,0,0,0,506,504,1,0,0,0,506,505,1,0,0,0,507,508,1, - 0,0,0,508,509,5,105,0,0,509,510,1,0,0,0,510,511,6,62,0,0,511,127,1,0, - 0,0,512,515,5,39,0,0,513,516,3,154,76,0,514,516,3,132,65,0,515,513,1, - 0,0,0,515,514,1,0,0,0,516,517,1,0,0,0,517,518,5,39,0,0,518,129,1,0,0, - 0,519,520,3,128,63,0,520,521,1,0,0,0,521,522,6,64,0,0,522,131,1,0,0,0, - 523,526,3,134,66,0,524,526,3,136,67,0,525,523,1,0,0,0,525,524,1,0,0,0, - 526,133,1,0,0,0,527,528,5,92,0,0,528,529,3,160,79,0,529,530,3,160,79, - 0,530,531,3,160,79,0,531,135,1,0,0,0,532,533,5,92,0,0,533,534,5,120,0, - 0,534,535,3,162,80,0,535,536,3,162,80,0,536,137,1,0,0,0,537,538,5,92, - 0,0,538,539,5,117,0,0,539,540,3,162,80,0,540,541,3,162,80,0,541,542,3, - 162,80,0,542,543,3,162,80,0,543,139,1,0,0,0,544,545,5,92,0,0,545,546, - 5,85,0,0,546,547,3,162,80,0,547,548,3,162,80,0,548,549,3,162,80,0,549, - 550,3,162,80,0,550,551,3,162,80,0,551,552,3,162,80,0,552,553,3,162,80, - 0,553,554,3,162,80,0,554,141,1,0,0,0,555,559,5,96,0,0,556,558,8,7,0,0, - 557,556,1,0,0,0,558,561,1,0,0,0,559,557,1,0,0,0,559,560,1,0,0,0,560,562, - 1,0,0,0,561,559,1,0,0,0,562,563,5,96,0,0,563,564,1,0,0,0,564,565,6,70, - 0,0,565,143,1,0,0,0,566,571,5,34,0,0,567,570,8,8,0,0,568,570,3,156,77, - 0,569,567,1,0,0,0,569,568,1,0,0,0,570,573,1,0,0,0,571,569,1,0,0,0,571, - 572,1,0,0,0,572,574,1,0,0,0,573,571,1,0,0,0,574,575,5,34,0,0,575,576, - 1,0,0,0,576,577,6,71,0,0,577,145,1,0,0,0,578,580,7,9,0,0,579,578,1,0, - 0,0,580,581,1,0,0,0,581,579,1,0,0,0,581,582,1,0,0,0,582,583,1,0,0,0,583, - 584,6,72,1,0,584,147,1,0,0,0,585,586,5,47,0,0,586,587,5,42,0,0,587,591, - 1,0,0,0,588,590,9,0,0,0,589,588,1,0,0,0,590,593,1,0,0,0,591,592,1,0,0, - 0,591,589,1,0,0,0,592,594,1,0,0,0,593,591,1,0,0,0,594,595,5,42,0,0,595, - 596,5,47,0,0,596,597,1,0,0,0,597,598,6,73,1,0,598,149,1,0,0,0,599,601, - 7,10,0,0,600,599,1,0,0,0,601,602,1,0,0,0,602,600,1,0,0,0,602,603,1,0, - 0,0,603,604,1,0,0,0,604,605,6,74,1,0,605,151,1,0,0,0,606,607,5,47,0,0, - 607,608,5,47,0,0,608,612,1,0,0,0,609,611,8,10,0,0,610,609,1,0,0,0,611, - 614,1,0,0,0,612,610,1,0,0,0,612,613,1,0,0,0,613,615,1,0,0,0,614,612,1, - 0,0,0,615,616,6,75,1,0,616,153,1,0,0,0,617,622,8,11,0,0,618,622,3,138, - 68,0,619,622,3,140,69,0,620,622,3,156,77,0,621,617,1,0,0,0,621,618,1, - 0,0,0,621,619,1,0,0,0,621,620,1,0,0,0,622,155,1,0,0,0,623,649,5,92,0, - 0,624,625,5,117,0,0,625,626,3,162,80,0,626,627,3,162,80,0,627,628,3,162, - 80,0,628,629,3,162,80,0,629,650,1,0,0,0,630,631,5,85,0,0,631,632,3,162, - 80,0,632,633,3,162,80,0,633,634,3,162,80,0,634,635,3,162,80,0,635,636, - 3,162,80,0,636,637,3,162,80,0,637,638,3,162,80,0,638,639,3,162,80,0,639, - 650,1,0,0,0,640,650,7,12,0,0,641,642,3,160,79,0,642,643,3,160,79,0,643, - 644,3,160,79,0,644,650,1,0,0,0,645,646,5,120,0,0,646,647,3,162,80,0,647, - 648,3,162,80,0,648,650,1,0,0,0,649,624,1,0,0,0,649,630,1,0,0,0,649,640, - 1,0,0,0,649,641,1,0,0,0,649,645,1,0,0,0,650,157,1,0,0,0,651,658,7,1,0, - 0,652,654,5,95,0,0,653,652,1,0,0,0,653,654,1,0,0,0,654,655,1,0,0,0,655, - 657,7,1,0,0,656,653,1,0,0,0,657,660,1,0,0,0,658,656,1,0,0,0,658,659,1, - 0,0,0,659,159,1,0,0,0,660,658,1,0,0,0,661,662,7,13,0,0,662,161,1,0,0, - 0,663,664,7,14,0,0,664,163,1,0,0,0,665,666,7,15,0,0,666,165,1,0,0,0,667, - 669,7,16,0,0,668,670,7,6,0,0,669,668,1,0,0,0,669,670,1,0,0,0,670,671, - 1,0,0,0,671,672,3,158,78,0,672,167,1,0,0,0,673,676,3,172,85,0,674,676, - 5,95,0,0,675,673,1,0,0,0,675,674,1,0,0,0,676,169,1,0,0,0,677,678,7,17, - 0,0,678,171,1,0,0,0,679,680,7,18,0,0,680,173,1,0,0,0,681,683,7,9,0,0, - 682,681,1,0,0,0,683,684,1,0,0,0,684,682,1,0,0,0,684,685,1,0,0,0,685,686, - 1,0,0,0,686,687,6,86,1,0,687,175,1,0,0,0,688,689,5,47,0,0,689,690,5,42, - 0,0,690,694,1,0,0,0,691,693,8,10,0,0,692,691,1,0,0,0,693,696,1,0,0,0, - 694,695,1,0,0,0,694,692,1,0,0,0,695,697,1,0,0,0,696,694,1,0,0,0,697,698, - 5,42,0,0,698,699,5,47,0,0,699,700,1,0,0,0,700,701,6,87,1,0,701,177,1, - 0,0,0,702,703,5,47,0,0,703,704,5,47,0,0,704,708,1,0,0,0,705,707,8,10, - 0,0,706,705,1,0,0,0,707,710,1,0,0,0,708,706,1,0,0,0,708,709,1,0,0,0,709, - 711,1,0,0,0,710,708,1,0,0,0,711,712,6,88,1,0,712,179,1,0,0,0,713,715, - 7,10,0,0,714,713,1,0,0,0,715,716,1,0,0,0,716,714,1,0,0,0,716,717,1,0, - 0,0,717,732,1,0,0,0,718,732,5,59,0,0,719,720,5,47,0,0,720,721,5,42,0, - 0,721,725,1,0,0,0,722,724,9,0,0,0,723,722,1,0,0,0,724,727,1,0,0,0,725, - 726,1,0,0,0,725,723,1,0,0,0,726,728,1,0,0,0,727,725,1,0,0,0,728,729,5, - 42,0,0,729,732,5,47,0,0,730,732,5,0,0,1,731,714,1,0,0,0,731,718,1,0,0, - 0,731,719,1,0,0,0,731,730,1,0,0,0,732,733,1,0,0,0,733,734,6,89,2,0,734, - 181,1,0,0,0,735,736,1,0,0,0,736,737,1,0,0,0,737,738,6,90,2,0,738,739, - 6,90,1,0,739,183,1,0,0,0,51,0,1,277,279,383,388,391,398,403,409,412,417, - 424,429,435,442,445,448,453,455,463,468,472,477,480,485,490,493,497,506, - 515,525,559,569,571,581,591,602,612,621,649,653,658,669,675,684,694,708, - 716,725,731,3,2,1,0,0,1,0,2,0,0 + 90,2,91,7,91,2,92,7,92,2,93,7,93,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1, + 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1, + 4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6, + 1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10, + 1,10,1,10,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13, + 1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15, + 1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,18, + 1,18,1,18,5,18,296,8,18,10,18,12,18,299,9,18,1,18,1,18,1,19,1,19,1,20, + 1,20,1,20,1,20,1,21,1,21,1,22,1,22,1,22,1,22,1,23,1,23,1,24,1,24,1,24, + 1,24,1,25,1,25,1,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30,1,30, + 1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,33,1,33,1,33,1,34, + 1,34,1,34,1,35,1,35,1,35,1,36,1,36,1,36,1,37,1,37,1,37,1,38,1,38,1,39, + 1,39,1,39,1,40,1,40,1,41,1,41,1,41,1,42,1,42,1,43,1,43,1,44,1,44,1,45, + 1,45,1,45,1,46,1,46,1,46,1,47,1,47,1,47,1,48,1,48,1,49,1,49,1,50,1,50, + 1,51,1,51,1,52,1,52,1,53,1,53,1,54,1,54,1,55,1,55,1,55,1,56,1,56,1,56, + 3,56,404,8,56,1,56,5,56,407,8,56,10,56,12,56,410,9,56,3,56,412,8,56,1, + 56,1,56,1,57,1,57,1,57,3,57,419,8,57,1,57,4,57,422,8,57,11,57,12,57,423, + 1,57,1,57,1,58,1,58,3,58,430,8,58,1,58,3,58,433,8,58,1,58,4,58,436,8, + 58,11,58,12,58,437,1,58,1,58,1,59,1,59,1,59,3,59,445,8,59,1,59,4,59,448, + 8,59,11,59,12,59,449,1,59,1,59,1,60,1,60,3,60,456,8,60,1,60,1,60,1,61, + 1,61,1,61,3,61,463,8,61,1,61,3,61,466,8,61,1,61,3,61,469,8,61,1,61,1, + 61,1,61,3,61,474,8,61,3,61,476,8,61,1,62,1,62,1,62,1,62,1,62,1,63,3,63, + 484,8,63,1,63,4,63,487,8,63,11,63,12,63,488,1,63,1,63,3,63,493,8,63,1, + 63,5,63,496,8,63,10,63,12,63,499,9,63,3,63,501,8,63,1,63,1,63,1,63,3, + 63,506,8,63,1,63,5,63,509,8,63,10,63,12,63,512,9,63,3,63,514,8,63,1,64, + 1,64,3,64,518,8,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,3,65,527,8,65,1, + 65,1,65,1,65,1,65,1,66,1,66,1,66,3,66,536,8,66,1,66,1,66,1,67,1,67,1, + 67,1,67,1,68,1,68,3,68,546,8,68,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1, + 70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1, + 72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,5,73,578,8,73,10,73,12,73, + 581,9,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,5,74,590,8,74,10,74,12,74, + 593,9,74,1,74,1,74,1,74,1,74,1,75,4,75,600,8,75,11,75,12,75,601,1,75, + 1,75,1,76,1,76,1,76,1,76,5,76,610,8,76,10,76,12,76,613,9,76,1,76,1,76, + 1,76,1,76,1,76,1,77,4,77,621,8,77,11,77,12,77,622,1,77,1,77,1,78,1,78, + 1,78,1,78,5,78,631,8,78,10,78,12,78,634,9,78,1,78,1,78,1,79,1,79,1,79, + 1,79,3,79,642,8,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80, + 1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80, + 1,80,1,80,3,80,670,8,80,1,81,1,81,3,81,674,8,81,1,81,5,81,677,8,81,10, + 81,12,81,680,9,81,1,82,1,82,1,83,1,83,1,84,1,84,1,85,1,85,3,85,690,8, + 85,1,85,1,85,1,86,1,86,3,86,696,8,86,1,87,1,87,1,88,1,88,1,89,4,89,703, + 8,89,11,89,12,89,704,1,89,1,89,1,90,1,90,1,90,1,90,5,90,713,8,90,10,90, + 12,90,716,9,90,1,90,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,5,91,727, + 8,91,10,91,12,91,730,9,91,1,91,1,91,1,92,4,92,735,8,92,11,92,12,92,736, + 1,92,1,92,1,92,1,92,1,92,5,92,744,8,92,10,92,12,92,747,9,92,1,92,1,92, + 1,92,3,92,752,8,92,1,92,1,92,1,93,1,93,1,93,1,93,1,93,3,611,714,745,0, + 94,2,1,4,2,6,3,8,4,10,5,12,6,14,7,16,8,18,9,20,10,22,11,24,12,26,13,28, + 14,30,15,32,16,34,17,36,18,38,19,40,20,42,21,44,22,46,23,48,24,50,25, + 52,26,54,27,56,28,58,29,60,30,62,31,64,32,66,33,68,34,70,35,72,36,74, + 37,76,38,78,39,80,40,82,41,84,42,86,43,88,44,90,45,92,46,94,47,96,48, + 98,49,100,50,102,51,104,52,106,53,108,54,110,55,112,56,114,57,116,58, + 118,59,120,60,122,61,124,62,126,63,128,0,130,0,132,64,134,0,136,65,138, + 66,140,67,142,68,144,69,146,70,148,71,150,72,152,73,154,74,156,75,158, + 76,160,0,162,0,164,0,166,0,168,0,170,0,172,0,174,0,176,0,178,0,180,77, + 182,78,184,79,186,80,188,81,2,0,1,19,1,0,49,57,1,0,48,57,2,0,66,66,98, + 98,2,0,79,79,111,111,2,0,88,88,120,120,2,0,80,80,112,112,2,0,43,43,45, + 45,1,0,96,96,2,0,34,34,92,92,2,0,9,9,32,32,2,0,10,10,13,13,3,0,10,10, + 13,13,39,39,9,0,34,34,39,39,92,92,97,98,102,102,110,110,114,114,116,116, + 118,118,1,0,48,55,3,0,48,57,65,70,97,102,1,0,48,49,2,0,69,69,101,101, + 64,0,48,57,1632,1641,1776,1785,1984,1993,2406,2415,2534,2543,2662,2671, + 2790,2799,2918,2927,3046,3055,3174,3183,3302,3311,3430,3439,3558,3567, + 3664,3673,3792,3801,3872,3881,4160,4169,4240,4249,6112,6121,6160,6169, + 6470,6479,6608,6617,6784,6793,6800,6809,6992,7001,7088,7097,7232,7241, + 7248,7257,42528,42537,43216,43225,43264,43273,43472,43481,43504,43513, + 43600,43609,44016,44025,65296,65305,66720,66729,68912,68921,69734,69743, + 69872,69881,69942,69951,70096,70105,70384,70393,70736,70745,70864,70873, + 71248,71257,71360,71369,71472,71481,71904,71913,72016,72025,72784,72793, + 73040,73049,73120,73129,73552,73561,92768,92777,92864,92873,93008,93017, + 120782,120831,123200,123209,123632,123641,124144,124153,125264,125273, + 130032,130041,659,0,65,90,97,122,170,170,181,181,186,186,192,214,216, + 246,248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,895, + 895,902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1327,1329, + 1366,1369,1369,1376,1416,1488,1514,1519,1522,1568,1610,1646,1647,1649, + 1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810, + 1839,1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074, + 2074,2084,2084,2088,2088,2112,2136,2144,2154,2160,2183,2185,2190,2208, + 2249,2308,2361,2365,2365,2384,2384,2392,2401,2417,2432,2437,2444,2447, + 2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524, + 2525,2527,2529,2544,2545,2556,2556,2565,2570,2575,2576,2579,2600,2602, + 2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693, + 2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768, + 2768,2784,2785,2809,2809,2821,2828,2831,2832,2835,2856,2858,2864,2866, + 2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949, + 2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984, + 2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3129,3133, + 3133,3160,3162,3165,3165,3168,3169,3200,3200,3205,3212,3214,3216,3218, + 3240,3242,3251,3253,3257,3261,3261,3293,3294,3296,3297,3313,3314,3332, + 3340,3342,3344,3346,3386,3389,3389,3406,3406,3412,3414,3423,3425,3450, + 3455,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634, + 3635,3648,3654,3713,3714,3716,3716,3718,3722,3724,3747,3749,3749,3751, + 3760,3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904, + 3911,3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193, + 4193,4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301, + 4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704, + 4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808, + 4822,4824,4880,4882,4885,4888,4954,4992,5007,5024,5109,5112,5117,5121, + 5740,5743,5759,5761,5786,5792,5866,5873,5880,5888,5905,5919,5937,5952, + 5969,5984,5996,5998,6000,6016,6067,6103,6103,6108,6108,6176,6264,6272, + 6276,6279,6312,6314,6314,6320,6389,6400,6430,6480,6509,6512,6516,6528, + 6571,6576,6601,6656,6678,6688,6740,6823,6823,6917,6963,6981,6988,7043, + 7072,7086,7087,7098,7141,7168,7203,7245,7247,7258,7293,7296,7304,7312, + 7354,7357,7359,7401,7404,7406,7411,7413,7414,7418,7418,7424,7615,7680, + 7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029, + 8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144, + 8147,8150,8155,8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336, + 8348,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486, + 8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8579, + 8580,11264,11492,11499,11502,11506,11507,11520,11557,11559,11559,11565, + 11565,11568,11623,11631,11631,11648,11670,11680,11686,11688,11694,11696, + 11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11823, + 11823,12293,12294,12337,12341,12347,12348,12353,12438,12445,12447,12449, + 12538,12540,12543,12549,12591,12593,12686,12704,12735,12784,12799,13312, + 19903,19968,42124,42192,42237,42240,42508,42512,42527,42538,42539,42560, + 42606,42623,42653,42656,42725,42775,42783,42786,42888,42891,42954,42960, + 42961,42963,42963,42965,42969,42994,43009,43011,43013,43015,43018,43020, + 43042,43072,43123,43138,43187,43250,43255,43259,43259,43261,43262,43274, + 43301,43312,43334,43360,43388,43396,43442,43471,43471,43488,43492,43494, + 43503,43514,43518,43520,43560,43584,43586,43588,43595,43616,43638,43642, + 43642,43646,43695,43697,43697,43701,43702,43705,43709,43712,43712,43714, + 43714,43739,43741,43744,43754,43762,43764,43777,43782,43785,43790,43793, + 43798,43808,43814,43816,43822,43824,43866,43868,43881,43888,44002,44032, + 55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275, + 64279,64285,64285,64287,64296,64298,64310,64312,64316,64318,64318,64320, + 64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008, + 65019,65136,65140,65142,65276,65313,65338,65345,65370,65382,65470,65474, + 65479,65482,65487,65490,65495,65498,65500,65536,65547,65549,65574,65576, + 65594,65596,65597,65599,65613,65616,65629,65664,65786,66176,66204,66208, + 66256,66304,66335,66349,66368,66370,66377,66384,66421,66432,66461,66464, + 66499,66504,66511,66560,66717,66736,66771,66776,66811,66816,66855,66864, + 66915,66928,66938,66940,66954,66956,66962,66964,66965,66967,66977,66979, + 66993,66995,67001,67003,67004,67072,67382,67392,67413,67424,67431,67456, + 67461,67463,67504,67506,67514,67584,67589,67592,67592,67594,67637,67639, + 67640,67644,67644,67647,67669,67680,67702,67712,67742,67808,67826,67828, + 67829,67840,67861,67872,67897,67968,68023,68030,68031,68096,68096,68112, + 68115,68117,68119,68121,68149,68192,68220,68224,68252,68288,68295,68297, + 68324,68352,68405,68416,68437,68448,68466,68480,68497,68608,68680,68736, + 68786,68800,68850,68864,68899,69248,69289,69296,69297,69376,69404,69415, + 69415,69424,69445,69488,69505,69552,69572,69600,69622,69635,69687,69745, + 69746,69749,69749,69763,69807,69840,69864,69891,69926,69956,69956,69959, + 69959,69968,70002,70006,70006,70019,70066,70081,70084,70106,70106,70108, + 70108,70144,70161,70163,70187,70207,70208,70272,70278,70280,70280,70282, + 70285,70287,70301,70303,70312,70320,70366,70405,70412,70415,70416,70419, + 70440,70442,70448,70450,70451,70453,70457,70461,70461,70480,70480,70493, + 70497,70656,70708,70727,70730,70751,70753,70784,70831,70852,70853,70855, + 70855,71040,71086,71128,71131,71168,71215,71236,71236,71296,71338,71352, + 71352,71424,71450,71488,71494,71680,71723,71840,71903,71935,71942,71945, + 71945,71948,71955,71957,71958,71960,71983,71999,71999,72001,72001,72096, + 72103,72106,72144,72161,72161,72163,72163,72192,72192,72203,72242,72250, + 72250,72272,72272,72284,72329,72349,72349,72368,72440,72704,72712,72714, + 72750,72768,72768,72818,72847,72960,72966,72968,72969,72971,73008,73030, + 73030,73056,73061,73063,73064,73066,73097,73112,73112,73440,73458,73474, + 73474,73476,73488,73490,73523,73648,73648,73728,74649,74880,75075,77712, + 77808,77824,78895,78913,78918,82944,83526,92160,92728,92736,92766,92784, + 92862,92880,92909,92928,92975,92992,92995,93027,93047,93053,93071,93760, + 93823,93952,94026,94032,94032,94099,94111,94176,94177,94179,94179,94208, + 100343,100352,101589,101632,101640,110576,110579,110581,110587,110589, + 110590,110592,110882,110898,110898,110928,110930,110933,110933,110948, + 110951,110960,111355,113664,113770,113776,113788,113792,113800,113808, + 113817,119808,119892,119894,119964,119966,119967,119970,119970,119973, + 119974,119977,119980,119982,119993,119995,119995,119997,120003,120005, + 120069,120071,120074,120077,120084,120086,120092,120094,120121,120123, + 120126,120128,120132,120134,120134,120138,120144,120146,120485,120488, + 120512,120514,120538,120540,120570,120572,120596,120598,120628,120630, + 120654,120656,120686,120688,120712,120714,120744,120746,120770,120772, + 120779,122624,122654,122661,122666,122928,122989,123136,123180,123191, + 123197,123214,123214,123536,123565,123584,123627,124112,124139,124896, + 124902,124904,124907,124909,124910,124912,124926,124928,125124,125184, + 125251,125259,125259,126464,126467,126469,126495,126497,126498,126500, + 126500,126503,126503,126505,126514,126516,126519,126521,126521,126523, + 126523,126530,126530,126535,126535,126537,126537,126539,126539,126541, + 126543,126545,126546,126548,126548,126551,126551,126553,126553,126555, + 126555,126557,126557,126559,126559,126561,126562,126564,126564,126567, + 126570,126572,126578,126580,126583,126585,126588,126590,126590,126592, + 126601,126603,126619,126625,126627,126629,126633,126635,126651,131072, + 173791,173824,177977,177984,178205,178208,183969,183984,191456,194560, + 195101,196608,201546,201552,205743,804,0,2,1,0,0,0,0,4,1,0,0,0,0,6,1, + 0,0,0,0,8,1,0,0,0,0,10,1,0,0,0,0,12,1,0,0,0,0,14,1,0,0,0,0,16,1,0,0,0, + 0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0,0,0,24,1,0,0,0,0,26,1,0,0,0,0,28, + 1,0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34,1,0,0,0,0,36,1,0,0,0,0,38,1,0, + 0,0,0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0,0,0,46,1,0,0,0,0,48,1,0,0,0, + 0,50,1,0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56,1,0,0,0,0,58,1,0,0,0,0,60, + 1,0,0,0,0,62,1,0,0,0,0,64,1,0,0,0,0,66,1,0,0,0,0,68,1,0,0,0,0,70,1,0, + 0,0,0,72,1,0,0,0,0,74,1,0,0,0,0,76,1,0,0,0,0,78,1,0,0,0,0,80,1,0,0,0, + 0,82,1,0,0,0,0,84,1,0,0,0,0,86,1,0,0,0,0,88,1,0,0,0,0,90,1,0,0,0,0,92, + 1,0,0,0,0,94,1,0,0,0,0,96,1,0,0,0,0,98,1,0,0,0,0,100,1,0,0,0,0,102,1, + 0,0,0,0,104,1,0,0,0,0,106,1,0,0,0,0,108,1,0,0,0,0,110,1,0,0,0,0,112,1, + 0,0,0,0,114,1,0,0,0,0,116,1,0,0,0,0,118,1,0,0,0,0,120,1,0,0,0,0,122,1, + 0,0,0,0,124,1,0,0,0,0,126,1,0,0,0,0,132,1,0,0,0,0,136,1,0,0,0,0,138,1, + 0,0,0,0,140,1,0,0,0,0,142,1,0,0,0,0,144,1,0,0,0,0,146,1,0,0,0,0,148,1, + 0,0,0,0,150,1,0,0,0,0,152,1,0,0,0,0,154,1,0,0,0,0,156,1,0,0,0,0,158,1, + 0,0,0,1,180,1,0,0,0,1,182,1,0,0,0,1,184,1,0,0,0,1,186,1,0,0,0,1,188,1, + 0,0,0,2,190,1,0,0,0,4,193,1,0,0,0,6,199,1,0,0,0,8,207,1,0,0,0,10,212, + 1,0,0,0,12,218,1,0,0,0,14,229,1,0,0,0,16,234,1,0,0,0,18,238,1,0,0,0,20, + 243,1,0,0,0,22,248,1,0,0,0,24,253,1,0,0,0,26,256,1,0,0,0,28,262,1,0,0, + 0,30,271,1,0,0,0,32,276,1,0,0,0,34,283,1,0,0,0,36,288,1,0,0,0,38,292, + 1,0,0,0,40,302,1,0,0,0,42,304,1,0,0,0,44,308,1,0,0,0,46,310,1,0,0,0,48, + 314,1,0,0,0,50,316,1,0,0,0,52,320,1,0,0,0,54,322,1,0,0,0,56,324,1,0,0, + 0,58,326,1,0,0,0,60,328,1,0,0,0,62,330,1,0,0,0,64,335,1,0,0,0,66,340, + 1,0,0,0,68,343,1,0,0,0,70,346,1,0,0,0,72,349,1,0,0,0,74,352,1,0,0,0,76, + 355,1,0,0,0,78,358,1,0,0,0,80,360,1,0,0,0,82,363,1,0,0,0,84,365,1,0,0, + 0,86,368,1,0,0,0,88,370,1,0,0,0,90,372,1,0,0,0,92,374,1,0,0,0,94,377, + 1,0,0,0,96,380,1,0,0,0,98,383,1,0,0,0,100,385,1,0,0,0,102,387,1,0,0,0, + 104,389,1,0,0,0,106,391,1,0,0,0,108,393,1,0,0,0,110,395,1,0,0,0,112,397, + 1,0,0,0,114,411,1,0,0,0,116,415,1,0,0,0,118,427,1,0,0,0,120,441,1,0,0, + 0,122,455,1,0,0,0,124,475,1,0,0,0,126,477,1,0,0,0,128,513,1,0,0,0,130, + 515,1,0,0,0,132,526,1,0,0,0,134,532,1,0,0,0,136,539,1,0,0,0,138,545,1, + 0,0,0,140,547,1,0,0,0,142,552,1,0,0,0,144,557,1,0,0,0,146,564,1,0,0,0, + 148,575,1,0,0,0,150,586,1,0,0,0,152,599,1,0,0,0,154,605,1,0,0,0,156,620, + 1,0,0,0,158,626,1,0,0,0,160,641,1,0,0,0,162,643,1,0,0,0,164,671,1,0,0, + 0,166,681,1,0,0,0,168,683,1,0,0,0,170,685,1,0,0,0,172,687,1,0,0,0,174, + 695,1,0,0,0,176,697,1,0,0,0,178,699,1,0,0,0,180,702,1,0,0,0,182,708,1, + 0,0,0,184,722,1,0,0,0,186,751,1,0,0,0,188,755,1,0,0,0,190,191,5,97,0, + 0,191,192,5,115,0,0,192,3,1,0,0,0,193,194,5,97,0,0,194,195,5,115,0,0, + 195,196,5,121,0,0,196,197,5,110,0,0,197,198,5,99,0,0,198,5,1,0,0,0,199, + 200,5,98,0,0,200,201,5,114,0,0,201,202,5,101,0,0,202,203,5,97,0,0,203, + 204,5,107,0,0,204,205,1,0,0,0,205,206,6,2,0,0,206,7,1,0,0,0,207,208,5, + 99,0,0,208,209,5,97,0,0,209,210,5,115,0,0,210,211,5,101,0,0,211,9,1,0, + 0,0,212,213,5,99,0,0,213,214,5,111,0,0,214,215,5,110,0,0,215,216,5,115, + 0,0,216,217,5,116,0,0,217,11,1,0,0,0,218,219,5,99,0,0,219,220,5,111,0, + 0,220,221,5,110,0,0,221,222,5,116,0,0,222,223,5,105,0,0,223,224,5,110, + 0,0,224,225,5,117,0,0,225,226,5,101,0,0,226,227,1,0,0,0,227,228,6,5,0, + 0,228,13,1,0,0,0,229,230,5,101,0,0,230,231,5,108,0,0,231,232,5,115,0, + 0,232,233,5,101,0,0,233,15,1,0,0,0,234,235,5,102,0,0,235,236,5,111,0, + 0,236,237,5,114,0,0,237,17,1,0,0,0,238,239,5,102,0,0,239,240,5,114,0, + 0,240,241,5,111,0,0,241,242,5,109,0,0,242,19,1,0,0,0,243,244,5,102,0, + 0,244,245,5,117,0,0,245,246,5,110,0,0,246,247,5,99,0,0,247,21,1,0,0,0, + 248,249,5,106,0,0,249,250,5,111,0,0,250,251,5,105,0,0,251,252,5,110,0, + 0,252,23,1,0,0,0,253,254,5,105,0,0,254,255,5,102,0,0,255,25,1,0,0,0,256, + 257,5,110,0,0,257,258,5,105,0,0,258,259,5,108,0,0,259,260,1,0,0,0,260, + 261,6,12,0,0,261,27,1,0,0,0,262,263,5,114,0,0,263,264,5,101,0,0,264,265, + 5,116,0,0,265,266,5,117,0,0,266,267,5,114,0,0,267,268,5,110,0,0,268,269, + 1,0,0,0,269,270,6,13,0,0,270,29,1,0,0,0,271,272,5,115,0,0,272,273,5,121, + 0,0,273,274,5,110,0,0,274,275,5,99,0,0,275,31,1,0,0,0,276,277,5,115,0, + 0,277,278,5,116,0,0,278,279,5,114,0,0,279,280,5,117,0,0,280,281,5,99, + 0,0,281,282,5,116,0,0,282,33,1,0,0,0,283,284,5,116,0,0,284,285,5,121, + 0,0,285,286,5,112,0,0,286,287,5,101,0,0,287,35,1,0,0,0,288,289,5,118, + 0,0,289,290,5,97,0,0,290,291,5,114,0,0,291,37,1,0,0,0,292,297,3,174,86, + 0,293,296,3,174,86,0,294,296,3,176,87,0,295,293,1,0,0,0,295,294,1,0,0, + 0,296,299,1,0,0,0,297,295,1,0,0,0,297,298,1,0,0,0,298,300,1,0,0,0,299, + 297,1,0,0,0,300,301,6,18,0,0,301,39,1,0,0,0,302,303,5,40,0,0,303,41,1, + 0,0,0,304,305,5,41,0,0,305,306,1,0,0,0,306,307,6,20,0,0,307,43,1,0,0, + 0,308,309,5,123,0,0,309,45,1,0,0,0,310,311,5,125,0,0,311,312,1,0,0,0, + 312,313,6,22,0,0,313,47,1,0,0,0,314,315,5,91,0,0,315,49,1,0,0,0,316,317, + 5,93,0,0,317,318,1,0,0,0,318,319,6,24,0,0,319,51,1,0,0,0,320,321,5,61, + 0,0,321,53,1,0,0,0,322,323,5,44,0,0,323,55,1,0,0,0,324,325,5,59,0,0,325, + 57,1,0,0,0,326,327,5,58,0,0,327,59,1,0,0,0,328,329,5,46,0,0,329,61,1, + 0,0,0,330,331,5,43,0,0,331,332,5,43,0,0,332,333,1,0,0,0,333,334,6,30, + 0,0,334,63,1,0,0,0,335,336,5,45,0,0,336,337,5,45,0,0,337,338,1,0,0,0, + 338,339,6,31,0,0,339,65,1,0,0,0,340,341,5,58,0,0,341,342,5,61,0,0,342, + 67,1,0,0,0,343,344,5,124,0,0,344,345,5,124,0,0,345,69,1,0,0,0,346,347, + 5,38,0,0,347,348,5,38,0,0,348,71,1,0,0,0,349,350,5,60,0,0,350,351,5,124, + 0,0,351,73,1,0,0,0,352,353,5,61,0,0,353,354,5,61,0,0,354,75,1,0,0,0,355, + 356,5,33,0,0,356,357,5,61,0,0,357,77,1,0,0,0,358,359,5,60,0,0,359,79, + 1,0,0,0,360,361,5,60,0,0,361,362,5,61,0,0,362,81,1,0,0,0,363,364,5,62, + 0,0,364,83,1,0,0,0,365,366,5,62,0,0,366,367,5,61,0,0,367,85,1,0,0,0,368, + 369,5,124,0,0,369,87,1,0,0,0,370,371,5,47,0,0,371,89,1,0,0,0,372,373, + 5,37,0,0,373,91,1,0,0,0,374,375,5,60,0,0,375,376,5,60,0,0,376,93,1,0, + 0,0,377,378,5,62,0,0,378,379,5,62,0,0,379,95,1,0,0,0,380,381,5,38,0,0, + 381,382,5,94,0,0,382,97,1,0,0,0,383,384,5,126,0,0,384,99,1,0,0,0,385, + 386,5,33,0,0,386,101,1,0,0,0,387,388,5,43,0,0,388,103,1,0,0,0,389,390, + 5,45,0,0,390,105,1,0,0,0,391,392,5,94,0,0,392,107,1,0,0,0,393,394,5,42, + 0,0,394,109,1,0,0,0,395,396,5,38,0,0,396,111,1,0,0,0,397,398,5,60,0,0, + 398,399,5,45,0,0,399,113,1,0,0,0,400,412,5,48,0,0,401,408,7,0,0,0,402, + 404,5,95,0,0,403,402,1,0,0,0,403,404,1,0,0,0,404,405,1,0,0,0,405,407, + 7,1,0,0,406,403,1,0,0,0,407,410,1,0,0,0,408,406,1,0,0,0,408,409,1,0,0, + 0,409,412,1,0,0,0,410,408,1,0,0,0,411,400,1,0,0,0,411,401,1,0,0,0,412, + 413,1,0,0,0,413,414,6,56,0,0,414,115,1,0,0,0,415,416,5,48,0,0,416,421, + 7,2,0,0,417,419,5,95,0,0,418,417,1,0,0,0,418,419,1,0,0,0,419,420,1,0, + 0,0,420,422,3,170,84,0,421,418,1,0,0,0,422,423,1,0,0,0,423,421,1,0,0, + 0,423,424,1,0,0,0,424,425,1,0,0,0,425,426,6,57,0,0,426,117,1,0,0,0,427, + 429,5,48,0,0,428,430,7,3,0,0,429,428,1,0,0,0,429,430,1,0,0,0,430,435, + 1,0,0,0,431,433,5,95,0,0,432,431,1,0,0,0,432,433,1,0,0,0,433,434,1,0, + 0,0,434,436,3,166,82,0,435,432,1,0,0,0,436,437,1,0,0,0,437,435,1,0,0, + 0,437,438,1,0,0,0,438,439,1,0,0,0,439,440,6,58,0,0,440,119,1,0,0,0,441, + 442,5,48,0,0,442,447,7,4,0,0,443,445,5,95,0,0,444,443,1,0,0,0,444,445, + 1,0,0,0,445,446,1,0,0,0,446,448,3,168,83,0,447,444,1,0,0,0,448,449,1, + 0,0,0,449,447,1,0,0,0,449,450,1,0,0,0,450,451,1,0,0,0,451,452,6,59,0, + 0,452,121,1,0,0,0,453,456,3,124,61,0,454,456,3,126,62,0,455,453,1,0,0, + 0,455,454,1,0,0,0,456,457,1,0,0,0,457,458,6,60,0,0,458,123,1,0,0,0,459, + 468,3,164,81,0,460,462,5,46,0,0,461,463,3,164,81,0,462,461,1,0,0,0,462, + 463,1,0,0,0,463,465,1,0,0,0,464,466,3,172,85,0,465,464,1,0,0,0,465,466, + 1,0,0,0,466,469,1,0,0,0,467,469,3,172,85,0,468,460,1,0,0,0,468,467,1, + 0,0,0,469,476,1,0,0,0,470,471,5,46,0,0,471,473,3,164,81,0,472,474,3,172, + 85,0,473,472,1,0,0,0,473,474,1,0,0,0,474,476,1,0,0,0,475,459,1,0,0,0, + 475,470,1,0,0,0,476,125,1,0,0,0,477,478,5,48,0,0,478,479,7,4,0,0,479, + 480,3,128,63,0,480,481,3,130,64,0,481,127,1,0,0,0,482,484,5,95,0,0,483, + 482,1,0,0,0,483,484,1,0,0,0,484,485,1,0,0,0,485,487,3,168,83,0,486,483, + 1,0,0,0,487,488,1,0,0,0,488,486,1,0,0,0,488,489,1,0,0,0,489,500,1,0,0, + 0,490,497,5,46,0,0,491,493,5,95,0,0,492,491,1,0,0,0,492,493,1,0,0,0,493, + 494,1,0,0,0,494,496,3,168,83,0,495,492,1,0,0,0,496,499,1,0,0,0,497,495, + 1,0,0,0,497,498,1,0,0,0,498,501,1,0,0,0,499,497,1,0,0,0,500,490,1,0,0, + 0,500,501,1,0,0,0,501,514,1,0,0,0,502,503,5,46,0,0,503,510,3,168,83,0, + 504,506,5,95,0,0,505,504,1,0,0,0,505,506,1,0,0,0,506,507,1,0,0,0,507, + 509,3,168,83,0,508,505,1,0,0,0,509,512,1,0,0,0,510,508,1,0,0,0,510,511, + 1,0,0,0,511,514,1,0,0,0,512,510,1,0,0,0,513,486,1,0,0,0,513,502,1,0,0, + 0,514,129,1,0,0,0,515,517,7,5,0,0,516,518,7,6,0,0,517,516,1,0,0,0,517, + 518,1,0,0,0,518,519,1,0,0,0,519,520,3,164,81,0,520,131,1,0,0,0,521,527, + 3,114,56,0,522,527,3,116,57,0,523,527,3,118,58,0,524,527,3,120,59,0,525, + 527,3,122,60,0,526,521,1,0,0,0,526,522,1,0,0,0,526,523,1,0,0,0,526,524, + 1,0,0,0,526,525,1,0,0,0,527,528,1,0,0,0,528,529,5,105,0,0,529,530,1,0, + 0,0,530,531,6,65,0,0,531,133,1,0,0,0,532,535,5,39,0,0,533,536,3,160,79, + 0,534,536,3,138,68,0,535,533,1,0,0,0,535,534,1,0,0,0,536,537,1,0,0,0, + 537,538,5,39,0,0,538,135,1,0,0,0,539,540,3,134,66,0,540,541,1,0,0,0,541, + 542,6,67,0,0,542,137,1,0,0,0,543,546,3,140,69,0,544,546,3,142,70,0,545, + 543,1,0,0,0,545,544,1,0,0,0,546,139,1,0,0,0,547,548,5,92,0,0,548,549, + 3,166,82,0,549,550,3,166,82,0,550,551,3,166,82,0,551,141,1,0,0,0,552, + 553,5,92,0,0,553,554,5,120,0,0,554,555,3,168,83,0,555,556,3,168,83,0, + 556,143,1,0,0,0,557,558,5,92,0,0,558,559,5,117,0,0,559,560,3,168,83,0, + 560,561,3,168,83,0,561,562,3,168,83,0,562,563,3,168,83,0,563,145,1,0, + 0,0,564,565,5,92,0,0,565,566,5,85,0,0,566,567,3,168,83,0,567,568,3,168, + 83,0,568,569,3,168,83,0,569,570,3,168,83,0,570,571,3,168,83,0,571,572, + 3,168,83,0,572,573,3,168,83,0,573,574,3,168,83,0,574,147,1,0,0,0,575, + 579,5,96,0,0,576,578,8,7,0,0,577,576,1,0,0,0,578,581,1,0,0,0,579,577, + 1,0,0,0,579,580,1,0,0,0,580,582,1,0,0,0,581,579,1,0,0,0,582,583,5,96, + 0,0,583,584,1,0,0,0,584,585,6,73,0,0,585,149,1,0,0,0,586,591,5,34,0,0, + 587,590,8,8,0,0,588,590,3,162,80,0,589,587,1,0,0,0,589,588,1,0,0,0,590, + 593,1,0,0,0,591,589,1,0,0,0,591,592,1,0,0,0,592,594,1,0,0,0,593,591,1, + 0,0,0,594,595,5,34,0,0,595,596,1,0,0,0,596,597,6,74,0,0,597,151,1,0,0, + 0,598,600,7,9,0,0,599,598,1,0,0,0,600,601,1,0,0,0,601,599,1,0,0,0,601, + 602,1,0,0,0,602,603,1,0,0,0,603,604,6,75,1,0,604,153,1,0,0,0,605,606, + 5,47,0,0,606,607,5,42,0,0,607,611,1,0,0,0,608,610,9,0,0,0,609,608,1,0, + 0,0,610,613,1,0,0,0,611,612,1,0,0,0,611,609,1,0,0,0,612,614,1,0,0,0,613, + 611,1,0,0,0,614,615,5,42,0,0,615,616,5,47,0,0,616,617,1,0,0,0,617,618, + 6,76,1,0,618,155,1,0,0,0,619,621,7,10,0,0,620,619,1,0,0,0,621,622,1,0, + 0,0,622,620,1,0,0,0,622,623,1,0,0,0,623,624,1,0,0,0,624,625,6,77,1,0, + 625,157,1,0,0,0,626,627,5,47,0,0,627,628,5,47,0,0,628,632,1,0,0,0,629, + 631,8,10,0,0,630,629,1,0,0,0,631,634,1,0,0,0,632,630,1,0,0,0,632,633, + 1,0,0,0,633,635,1,0,0,0,634,632,1,0,0,0,635,636,6,78,1,0,636,159,1,0, + 0,0,637,642,8,11,0,0,638,642,3,144,71,0,639,642,3,146,72,0,640,642,3, + 162,80,0,641,637,1,0,0,0,641,638,1,0,0,0,641,639,1,0,0,0,641,640,1,0, + 0,0,642,161,1,0,0,0,643,669,5,92,0,0,644,645,5,117,0,0,645,646,3,168, + 83,0,646,647,3,168,83,0,647,648,3,168,83,0,648,649,3,168,83,0,649,670, + 1,0,0,0,650,651,5,85,0,0,651,652,3,168,83,0,652,653,3,168,83,0,653,654, + 3,168,83,0,654,655,3,168,83,0,655,656,3,168,83,0,656,657,3,168,83,0,657, + 658,3,168,83,0,658,659,3,168,83,0,659,670,1,0,0,0,660,670,7,12,0,0,661, + 662,3,166,82,0,662,663,3,166,82,0,663,664,3,166,82,0,664,670,1,0,0,0, + 665,666,5,120,0,0,666,667,3,168,83,0,667,668,3,168,83,0,668,670,1,0,0, + 0,669,644,1,0,0,0,669,650,1,0,0,0,669,660,1,0,0,0,669,661,1,0,0,0,669, + 665,1,0,0,0,670,163,1,0,0,0,671,678,7,1,0,0,672,674,5,95,0,0,673,672, + 1,0,0,0,673,674,1,0,0,0,674,675,1,0,0,0,675,677,7,1,0,0,676,673,1,0,0, + 0,677,680,1,0,0,0,678,676,1,0,0,0,678,679,1,0,0,0,679,165,1,0,0,0,680, + 678,1,0,0,0,681,682,7,13,0,0,682,167,1,0,0,0,683,684,7,14,0,0,684,169, + 1,0,0,0,685,686,7,15,0,0,686,171,1,0,0,0,687,689,7,16,0,0,688,690,7,6, + 0,0,689,688,1,0,0,0,689,690,1,0,0,0,690,691,1,0,0,0,691,692,3,164,81, + 0,692,173,1,0,0,0,693,696,3,178,88,0,694,696,5,95,0,0,695,693,1,0,0,0, + 695,694,1,0,0,0,696,175,1,0,0,0,697,698,7,17,0,0,698,177,1,0,0,0,699, + 700,7,18,0,0,700,179,1,0,0,0,701,703,7,9,0,0,702,701,1,0,0,0,703,704, + 1,0,0,0,704,702,1,0,0,0,704,705,1,0,0,0,705,706,1,0,0,0,706,707,6,89, + 1,0,707,181,1,0,0,0,708,709,5,47,0,0,709,710,5,42,0,0,710,714,1,0,0,0, + 711,713,8,10,0,0,712,711,1,0,0,0,713,716,1,0,0,0,714,715,1,0,0,0,714, + 712,1,0,0,0,715,717,1,0,0,0,716,714,1,0,0,0,717,718,5,42,0,0,718,719, + 5,47,0,0,719,720,1,0,0,0,720,721,6,90,1,0,721,183,1,0,0,0,722,723,5,47, + 0,0,723,724,5,47,0,0,724,728,1,0,0,0,725,727,8,10,0,0,726,725,1,0,0,0, + 727,730,1,0,0,0,728,726,1,0,0,0,728,729,1,0,0,0,729,731,1,0,0,0,730,728, + 1,0,0,0,731,732,6,91,1,0,732,185,1,0,0,0,733,735,7,10,0,0,734,733,1,0, + 0,0,735,736,1,0,0,0,736,734,1,0,0,0,736,737,1,0,0,0,737,752,1,0,0,0,738, + 752,5,59,0,0,739,740,5,47,0,0,740,741,5,42,0,0,741,745,1,0,0,0,742,744, + 9,0,0,0,743,742,1,0,0,0,744,747,1,0,0,0,745,746,1,0,0,0,745,743,1,0,0, + 0,746,748,1,0,0,0,747,745,1,0,0,0,748,749,5,42,0,0,749,752,5,47,0,0,750, + 752,5,0,0,1,751,734,1,0,0,0,751,738,1,0,0,0,751,739,1,0,0,0,751,750,1, + 0,0,0,752,753,1,0,0,0,753,754,6,92,2,0,754,187,1,0,0,0,755,756,1,0,0, + 0,756,757,1,0,0,0,757,758,6,93,2,0,758,759,6,93,1,0,759,189,1,0,0,0,51, + 0,1,295,297,403,408,411,418,423,429,432,437,444,449,455,462,465,468,473, + 475,483,488,492,497,500,505,510,513,517,526,535,545,579,589,591,601,611, + 622,632,641,669,673,678,689,695,704,714,728,736,745,751,3,2,1,0,0,1,0, + 2,0,0 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); diff --git a/parser/generated/TLexer.h b/parser/generated/TLexer.h index 48a962a..7f02fef 100644 --- a/parser/generated/TLexer.h +++ b/parser/generated/TLexer.h @@ -23,20 +23,20 @@ class TLexer : public antlr4::Lexer { enum { AS = 1, ASYNC = 2, BREAK = 3, CASE = 4, CONST = 5, CONTINUE = 6, ELSE = 7, FOR = 8, FROM = 9, FUNC = 10, JOIN = 11, IF = 12, NIL_LIT = 13, RETURN = 14, - SYNC = 15, VAR = 16, IDENTIFIER = 17, L_PAREN = 18, R_PAREN = 19, L_CURLY = 20, - R_CURLY = 21, L_BRACKET = 22, R_BRACKET = 23, ASSIGN = 24, COMMA = 25, - SEMI = 26, COLON = 27, PLUS_PLUS = 28, MINUS_MINUS = 29, DECLARE_ASSIGN = 30, - LOGICAL_OR = 31, LOGICAL_AND = 32, SYNC_RETURN = 33, EQUALS = 34, NOT_EQUALS = 35, - LESS = 36, LESS_OR_EQUALS = 37, GREATER = 38, GREATER_OR_EQUALS = 39, - OR = 40, DIV = 41, MOD = 42, LSHIFT = 43, RSHIFT = 44, BIT_CLEAR = 45, - UNDERLYING = 46, EXCLAMATION = 47, PLUS = 48, MINUS = 49, CARET = 50, - STAR = 51, AMPERSAND = 52, EMIT = 53, DECIMAL_LIT = 54, BINARY_LIT = 55, - OCTAL_LIT = 56, HEX_LIT = 57, FLOAT_LIT = 58, DECIMAL_FLOAT_LIT = 59, - HEX_FLOAT_LIT = 60, IMAGINARY_LIT = 61, RUNE_LIT = 62, BYTE_VALUE = 63, - OCTAL_BYTE_VALUE = 64, HEX_BYTE_VALUE = 65, LITTLE_U_VALUE = 66, BIG_U_VALUE = 67, - RAW_STRING_LIT = 68, INTERPRETED_STRING_LIT = 69, WS = 70, COMMENT = 71, - TERMINATOR = 72, LINE_COMMENT = 73, WS_NLSEMI = 74, COMMENT_NLSEMI = 75, - LINE_COMMENT_NLSEMI = 76, EOS = 77, OTHER = 78 + SYNC = 15, STRUCT = 16, TYPE = 17, VAR = 18, IDENTIFIER = 19, L_PAREN = 20, + R_PAREN = 21, L_CURLY = 22, R_CURLY = 23, L_BRACKET = 24, R_BRACKET = 25, + ASSIGN = 26, COMMA = 27, SEMI = 28, COLON = 29, DOT = 30, PLUS_PLUS = 31, + MINUS_MINUS = 32, DECLARE_ASSIGN = 33, LOGICAL_OR = 34, LOGICAL_AND = 35, + SYNC_RETURN = 36, EQUALS = 37, NOT_EQUALS = 38, LESS = 39, LESS_OR_EQUALS = 40, + GREATER = 41, GREATER_OR_EQUALS = 42, OR = 43, DIV = 44, MOD = 45, LSHIFT = 46, + RSHIFT = 47, BIT_CLEAR = 48, UNDERLYING = 49, EXCLAMATION = 50, PLUS = 51, + MINUS = 52, CARET = 53, STAR = 54, AMPERSAND = 55, EMIT = 56, DECIMAL_LIT = 57, + BINARY_LIT = 58, OCTAL_LIT = 59, HEX_LIT = 60, FLOAT_LIT = 61, DECIMAL_FLOAT_LIT = 62, + HEX_FLOAT_LIT = 63, IMAGINARY_LIT = 64, RUNE_LIT = 65, BYTE_VALUE = 66, + OCTAL_BYTE_VALUE = 67, HEX_BYTE_VALUE = 68, LITTLE_U_VALUE = 69, BIG_U_VALUE = 70, + RAW_STRING_LIT = 71, INTERPRETED_STRING_LIT = 72, WS = 73, COMMENT = 74, + TERMINATOR = 75, LINE_COMMENT = 76, WS_NLSEMI = 77, COMMENT_NLSEMI = 78, + LINE_COMMENT_NLSEMI = 79, EOS = 80, OTHER = 81 }; enum { diff --git a/parser/generated/TLexer.interp b/parser/generated/TLexer.interp index 1cef801..93e8675 100644 --- a/parser/generated/TLexer.interp +++ b/parser/generated/TLexer.interp @@ -15,6 +15,8 @@ null 'nil' 'return' 'sync' +'struct' +'type' 'var' null '(' @@ -27,6 +29,7 @@ null ',' ';' ':' +'.' '++' '--' ':=' @@ -96,6 +99,8 @@ IF NIL_LIT RETURN SYNC +STRUCT +TYPE VAR IDENTIFIER L_PAREN @@ -108,6 +113,7 @@ ASSIGN COMMA SEMI COLON +DOT PLUS_PLUS MINUS_MINUS DECLARE_ASSIGN @@ -176,6 +182,8 @@ IF NIL_LIT RETURN SYNC +STRUCT +TYPE VAR IDENTIFIER L_PAREN @@ -188,6 +196,7 @@ ASSIGN COMMA SEMI COLON +DOT PLUS_PLUS MINUS_MINUS DECLARE_ASSIGN @@ -262,4 +271,4 @@ DEFAULT_MODE NLSEMI atn: -[4, 0, 78, 740, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 5, 16, 278, 8, 16, 10, 16, 12, 16, 281, 9, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 3, 53, 384, 8, 53, 1, 53, 5, 53, 387, 8, 53, 10, 53, 12, 53, 390, 9, 53, 3, 53, 392, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 3, 54, 399, 8, 54, 1, 54, 4, 54, 402, 8, 54, 11, 54, 12, 54, 403, 1, 54, 1, 54, 1, 55, 1, 55, 3, 55, 410, 8, 55, 1, 55, 3, 55, 413, 8, 55, 1, 55, 4, 55, 416, 8, 55, 11, 55, 12, 55, 417, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 3, 56, 425, 8, 56, 1, 56, 4, 56, 428, 8, 56, 11, 56, 12, 56, 429, 1, 56, 1, 56, 1, 57, 1, 57, 3, 57, 436, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 3, 58, 443, 8, 58, 1, 58, 3, 58, 446, 8, 58, 1, 58, 3, 58, 449, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 454, 8, 58, 3, 58, 456, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 3, 60, 464, 8, 60, 1, 60, 4, 60, 467, 8, 60, 11, 60, 12, 60, 468, 1, 60, 1, 60, 3, 60, 473, 8, 60, 1, 60, 5, 60, 476, 8, 60, 10, 60, 12, 60, 479, 9, 60, 3, 60, 481, 8, 60, 1, 60, 1, 60, 1, 60, 3, 60, 486, 8, 60, 1, 60, 5, 60, 489, 8, 60, 10, 60, 12, 60, 492, 9, 60, 3, 60, 494, 8, 60, 1, 61, 1, 61, 3, 61, 498, 8, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 507, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 3, 63, 516, 8, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 3, 65, 526, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 5, 70, 558, 8, 70, 10, 70, 12, 70, 561, 9, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 5, 71, 570, 8, 71, 10, 71, 12, 71, 573, 9, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 4, 72, 580, 8, 72, 11, 72, 12, 72, 581, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 5, 73, 590, 8, 73, 10, 73, 12, 73, 593, 9, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 4, 74, 601, 8, 74, 11, 74, 12, 74, 602, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 5, 75, 611, 8, 75, 10, 75, 12, 75, 614, 9, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 622, 8, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 650, 8, 77, 1, 78, 1, 78, 3, 78, 654, 8, 78, 1, 78, 5, 78, 657, 8, 78, 10, 78, 12, 78, 660, 9, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 3, 82, 670, 8, 82, 1, 82, 1, 82, 1, 83, 1, 83, 3, 83, 676, 8, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 4, 86, 683, 8, 86, 11, 86, 12, 86, 684, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 5, 87, 693, 8, 87, 10, 87, 12, 87, 696, 9, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 5, 88, 707, 8, 88, 10, 88, 12, 88, 710, 9, 88, 1, 88, 1, 88, 1, 89, 4, 89, 715, 8, 89, 11, 89, 12, 89, 716, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 5, 89, 724, 8, 89, 10, 89, 12, 89, 727, 9, 89, 1, 89, 1, 89, 1, 89, 3, 89, 732, 8, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 3, 591, 694, 725, 0, 91, 2, 1, 4, 2, 6, 3, 8, 4, 10, 5, 12, 6, 14, 7, 16, 8, 18, 9, 20, 10, 22, 11, 24, 12, 26, 13, 28, 14, 30, 15, 32, 16, 34, 17, 36, 18, 38, 19, 40, 20, 42, 21, 44, 22, 46, 23, 48, 24, 50, 25, 52, 26, 54, 27, 56, 28, 58, 29, 60, 30, 62, 31, 64, 32, 66, 33, 68, 34, 70, 35, 72, 36, 74, 37, 76, 38, 78, 39, 80, 40, 82, 41, 84, 42, 86, 43, 88, 44, 90, 45, 92, 46, 94, 47, 96, 48, 98, 49, 100, 50, 102, 51, 104, 52, 106, 53, 108, 54, 110, 55, 112, 56, 114, 57, 116, 58, 118, 59, 120, 60, 122, 0, 124, 0, 126, 61, 128, 0, 130, 62, 132, 63, 134, 64, 136, 65, 138, 66, 140, 67, 142, 68, 144, 69, 146, 70, 148, 71, 150, 72, 152, 73, 154, 0, 156, 0, 158, 0, 160, 0, 162, 0, 164, 0, 166, 0, 168, 0, 170, 0, 172, 0, 174, 74, 176, 75, 178, 76, 180, 77, 182, 78, 2, 0, 1, 19, 1, 0, 49, 57, 1, 0, 48, 57, 2, 0, 66, 66, 98, 98, 2, 0, 79, 79, 111, 111, 2, 0, 88, 88, 120, 120, 2, 0, 80, 80, 112, 112, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 13, 13, 3, 0, 10, 10, 13, 13, 39, 39, 9, 0, 34, 34, 39, 39, 92, 92, 97, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 1, 0, 48, 55, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 49, 2, 0, 69, 69, 101, 101, 64, 0, 48, 57, 1632, 1641, 1776, 1785, 1984, 1993, 2406, 2415, 2534, 2543, 2662, 2671, 2790, 2799, 2918, 2927, 3046, 3055, 3174, 3183, 3302, 3311, 3430, 3439, 3558, 3567, 3664, 3673, 3792, 3801, 3872, 3881, 4160, 4169, 4240, 4249, 6112, 6121, 6160, 6169, 6470, 6479, 6608, 6617, 6784, 6793, 6800, 6809, 6992, 7001, 7088, 7097, 7232, 7241, 7248, 7257, 42528, 42537, 43216, 43225, 43264, 43273, 43472, 43481, 43504, 43513, 43600, 43609, 44016, 44025, 65296, 65305, 66720, 66729, 68912, 68921, 69734, 69743, 69872, 69881, 69942, 69951, 70096, 70105, 70384, 70393, 70736, 70745, 70864, 70873, 71248, 71257, 71360, 71369, 71472, 71481, 71904, 71913, 72016, 72025, 72784, 72793, 73040, 73049, 73120, 73129, 73552, 73561, 92768, 92777, 92864, 92873, 93008, 93017, 120782, 120831, 123200, 123209, 123632, 123641, 124144, 124153, 125264, 125273, 130032, 130041, 659, 0, 65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2160, 2183, 2185, 2190, 2208, 2249, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3165, 3165, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3293, 3294, 3296, 3297, 3313, 3314, 3332, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5873, 5880, 5888, 5905, 5919, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6276, 6279, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6988, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8579, 8580, 11264, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12294, 12337, 12341, 12347, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12735, 12784, 12799, 13312, 19903, 19968, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42725, 42775, 42783, 42786, 42888, 42891, 42954, 42960, 42961, 42963, 42963, 42965, 42969, 42994, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43881, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66368, 66370, 66377, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 66928, 66938, 66940, 66954, 66956, 66962, 66964, 66965, 66967, 66977, 66979, 66993, 66995, 67001, 67003, 67004, 67072, 67382, 67392, 67413, 67424, 67431, 67456, 67461, 67463, 67504, 67506, 67514, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69248, 69289, 69296, 69297, 69376, 69404, 69415, 69415, 69424, 69445, 69488, 69505, 69552, 69572, 69600, 69622, 69635, 69687, 69745, 69746, 69749, 69749, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69959, 69959, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70207, 70208, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70753, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71488, 71494, 71680, 71723, 71840, 71903, 71935, 71942, 71945, 71945, 71948, 71955, 71957, 71958, 71960, 71983, 71999, 71999, 72001, 72001, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72368, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73474, 73474, 73476, 73488, 73490, 73523, 73648, 73648, 73728, 74649, 74880, 75075, 77712, 77808, 77824, 78895, 78913, 78918, 82944, 83526, 92160, 92728, 92736, 92766, 92784, 92862, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101589, 101632, 101640, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 122624, 122654, 122661, 122666, 122928, 122989, 123136, 123180, 123191, 123197, 123214, 123214, 123536, 123565, 123584, 123627, 124112, 124139, 124896, 124902, 124904, 124907, 124909, 124910, 124912, 124926, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173791, 173824, 177977, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101, 196608, 201546, 201552, 205743, 784, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 92, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 98, 1, 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 102, 1, 0, 0, 0, 0, 104, 1, 0, 0, 0, 0, 106, 1, 0, 0, 0, 0, 108, 1, 0, 0, 0, 0, 110, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 0, 134, 1, 0, 0, 0, 0, 136, 1, 0, 0, 0, 0, 138, 1, 0, 0, 0, 0, 140, 1, 0, 0, 0, 0, 142, 1, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 146, 1, 0, 0, 0, 0, 148, 1, 0, 0, 0, 0, 150, 1, 0, 0, 0, 0, 152, 1, 0, 0, 0, 1, 174, 1, 0, 0, 0, 1, 176, 1, 0, 0, 0, 1, 178, 1, 0, 0, 0, 1, 180, 1, 0, 0, 0, 1, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 187, 1, 0, 0, 0, 6, 193, 1, 0, 0, 0, 8, 201, 1, 0, 0, 0, 10, 206, 1, 0, 0, 0, 12, 212, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 228, 1, 0, 0, 0, 18, 232, 1, 0, 0, 0, 20, 237, 1, 0, 0, 0, 22, 242, 1, 0, 0, 0, 24, 247, 1, 0, 0, 0, 26, 250, 1, 0, 0, 0, 28, 256, 1, 0, 0, 0, 30, 265, 1, 0, 0, 0, 32, 270, 1, 0, 0, 0, 34, 274, 1, 0, 0, 0, 36, 284, 1, 0, 0, 0, 38, 286, 1, 0, 0, 0, 40, 290, 1, 0, 0, 0, 42, 292, 1, 0, 0, 0, 44, 296, 1, 0, 0, 0, 46, 298, 1, 0, 0, 0, 48, 302, 1, 0, 0, 0, 50, 304, 1, 0, 0, 0, 52, 306, 1, 0, 0, 0, 54, 308, 1, 0, 0, 0, 56, 310, 1, 0, 0, 0, 58, 315, 1, 0, 0, 0, 60, 320, 1, 0, 0, 0, 62, 323, 1, 0, 0, 0, 64, 326, 1, 0, 0, 0, 66, 329, 1, 0, 0, 0, 68, 332, 1, 0, 0, 0, 70, 335, 1, 0, 0, 0, 72, 338, 1, 0, 0, 0, 74, 340, 1, 0, 0, 0, 76, 343, 1, 0, 0, 0, 78, 345, 1, 0, 0, 0, 80, 348, 1, 0, 0, 0, 82, 350, 1, 0, 0, 0, 84, 352, 1, 0, 0, 0, 86, 354, 1, 0, 0, 0, 88, 357, 1, 0, 0, 0, 90, 360, 1, 0, 0, 0, 92, 363, 1, 0, 0, 0, 94, 365, 1, 0, 0, 0, 96, 367, 1, 0, 0, 0, 98, 369, 1, 0, 0, 0, 100, 371, 1, 0, 0, 0, 102, 373, 1, 0, 0, 0, 104, 375, 1, 0, 0, 0, 106, 377, 1, 0, 0, 0, 108, 391, 1, 0, 0, 0, 110, 395, 1, 0, 0, 0, 112, 407, 1, 0, 0, 0, 114, 421, 1, 0, 0, 0, 116, 435, 1, 0, 0, 0, 118, 455, 1, 0, 0, 0, 120, 457, 1, 0, 0, 0, 122, 493, 1, 0, 0, 0, 124, 495, 1, 0, 0, 0, 126, 506, 1, 0, 0, 0, 128, 512, 1, 0, 0, 0, 130, 519, 1, 0, 0, 0, 132, 525, 1, 0, 0, 0, 134, 527, 1, 0, 0, 0, 136, 532, 1, 0, 0, 0, 138, 537, 1, 0, 0, 0, 140, 544, 1, 0, 0, 0, 142, 555, 1, 0, 0, 0, 144, 566, 1, 0, 0, 0, 146, 579, 1, 0, 0, 0, 148, 585, 1, 0, 0, 0, 150, 600, 1, 0, 0, 0, 152, 606, 1, 0, 0, 0, 154, 621, 1, 0, 0, 0, 156, 623, 1, 0, 0, 0, 158, 651, 1, 0, 0, 0, 160, 661, 1, 0, 0, 0, 162, 663, 1, 0, 0, 0, 164, 665, 1, 0, 0, 0, 166, 667, 1, 0, 0, 0, 168, 675, 1, 0, 0, 0, 170, 677, 1, 0, 0, 0, 172, 679, 1, 0, 0, 0, 174, 682, 1, 0, 0, 0, 176, 688, 1, 0, 0, 0, 178, 702, 1, 0, 0, 0, 180, 731, 1, 0, 0, 0, 182, 735, 1, 0, 0, 0, 184, 185, 5, 97, 0, 0, 185, 186, 5, 115, 0, 0, 186, 3, 1, 0, 0, 0, 187, 188, 5, 97, 0, 0, 188, 189, 5, 115, 0, 0, 189, 190, 5, 121, 0, 0, 190, 191, 5, 110, 0, 0, 191, 192, 5, 99, 0, 0, 192, 5, 1, 0, 0, 0, 193, 194, 5, 98, 0, 0, 194, 195, 5, 114, 0, 0, 195, 196, 5, 101, 0, 0, 196, 197, 5, 97, 0, 0, 197, 198, 5, 107, 0, 0, 198, 199, 1, 0, 0, 0, 199, 200, 6, 2, 0, 0, 200, 7, 1, 0, 0, 0, 201, 202, 5, 99, 0, 0, 202, 203, 5, 97, 0, 0, 203, 204, 5, 115, 0, 0, 204, 205, 5, 101, 0, 0, 205, 9, 1, 0, 0, 0, 206, 207, 5, 99, 0, 0, 207, 208, 5, 111, 0, 0, 208, 209, 5, 110, 0, 0, 209, 210, 5, 115, 0, 0, 210, 211, 5, 116, 0, 0, 211, 11, 1, 0, 0, 0, 212, 213, 5, 99, 0, 0, 213, 214, 5, 111, 0, 0, 214, 215, 5, 110, 0, 0, 215, 216, 5, 116, 0, 0, 216, 217, 5, 105, 0, 0, 217, 218, 5, 110, 0, 0, 218, 219, 5, 117, 0, 0, 219, 220, 5, 101, 0, 0, 220, 221, 1, 0, 0, 0, 221, 222, 6, 5, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 5, 101, 0, 0, 224, 225, 5, 108, 0, 0, 225, 226, 5, 115, 0, 0, 226, 227, 5, 101, 0, 0, 227, 15, 1, 0, 0, 0, 228, 229, 5, 102, 0, 0, 229, 230, 5, 111, 0, 0, 230, 231, 5, 114, 0, 0, 231, 17, 1, 0, 0, 0, 232, 233, 5, 102, 0, 0, 233, 234, 5, 114, 0, 0, 234, 235, 5, 111, 0, 0, 235, 236, 5, 109, 0, 0, 236, 19, 1, 0, 0, 0, 237, 238, 5, 102, 0, 0, 238, 239, 5, 117, 0, 0, 239, 240, 5, 110, 0, 0, 240, 241, 5, 99, 0, 0, 241, 21, 1, 0, 0, 0, 242, 243, 5, 106, 0, 0, 243, 244, 5, 111, 0, 0, 244, 245, 5, 105, 0, 0, 245, 246, 5, 110, 0, 0, 246, 23, 1, 0, 0, 0, 247, 248, 5, 105, 0, 0, 248, 249, 5, 102, 0, 0, 249, 25, 1, 0, 0, 0, 250, 251, 5, 110, 0, 0, 251, 252, 5, 105, 0, 0, 252, 253, 5, 108, 0, 0, 253, 254, 1, 0, 0, 0, 254, 255, 6, 12, 0, 0, 255, 27, 1, 0, 0, 0, 256, 257, 5, 114, 0, 0, 257, 258, 5, 101, 0, 0, 258, 259, 5, 116, 0, 0, 259, 260, 5, 117, 0, 0, 260, 261, 5, 114, 0, 0, 261, 262, 5, 110, 0, 0, 262, 263, 1, 0, 0, 0, 263, 264, 6, 13, 0, 0, 264, 29, 1, 0, 0, 0, 265, 266, 5, 115, 0, 0, 266, 267, 5, 121, 0, 0, 267, 268, 5, 110, 0, 0, 268, 269, 5, 99, 0, 0, 269, 31, 1, 0, 0, 0, 270, 271, 5, 118, 0, 0, 271, 272, 5, 97, 0, 0, 272, 273, 5, 114, 0, 0, 273, 33, 1, 0, 0, 0, 274, 279, 3, 168, 83, 0, 275, 278, 3, 168, 83, 0, 276, 278, 3, 170, 84, 0, 277, 275, 1, 0, 0, 0, 277, 276, 1, 0, 0, 0, 278, 281, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 282, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 282, 283, 6, 16, 0, 0, 283, 35, 1, 0, 0, 0, 284, 285, 5, 40, 0, 0, 285, 37, 1, 0, 0, 0, 286, 287, 5, 41, 0, 0, 287, 288, 1, 0, 0, 0, 288, 289, 6, 18, 0, 0, 289, 39, 1, 0, 0, 0, 290, 291, 5, 123, 0, 0, 291, 41, 1, 0, 0, 0, 292, 293, 5, 125, 0, 0, 293, 294, 1, 0, 0, 0, 294, 295, 6, 20, 0, 0, 295, 43, 1, 0, 0, 0, 296, 297, 5, 91, 0, 0, 297, 45, 1, 0, 0, 0, 298, 299, 5, 93, 0, 0, 299, 300, 1, 0, 0, 0, 300, 301, 6, 22, 0, 0, 301, 47, 1, 0, 0, 0, 302, 303, 5, 61, 0, 0, 303, 49, 1, 0, 0, 0, 304, 305, 5, 44, 0, 0, 305, 51, 1, 0, 0, 0, 306, 307, 5, 59, 0, 0, 307, 53, 1, 0, 0, 0, 308, 309, 5, 58, 0, 0, 309, 55, 1, 0, 0, 0, 310, 311, 5, 43, 0, 0, 311, 312, 5, 43, 0, 0, 312, 313, 1, 0, 0, 0, 313, 314, 6, 27, 0, 0, 314, 57, 1, 0, 0, 0, 315, 316, 5, 45, 0, 0, 316, 317, 5, 45, 0, 0, 317, 318, 1, 0, 0, 0, 318, 319, 6, 28, 0, 0, 319, 59, 1, 0, 0, 0, 320, 321, 5, 58, 0, 0, 321, 322, 5, 61, 0, 0, 322, 61, 1, 0, 0, 0, 323, 324, 5, 124, 0, 0, 324, 325, 5, 124, 0, 0, 325, 63, 1, 0, 0, 0, 326, 327, 5, 38, 0, 0, 327, 328, 5, 38, 0, 0, 328, 65, 1, 0, 0, 0, 329, 330, 5, 60, 0, 0, 330, 331, 5, 124, 0, 0, 331, 67, 1, 0, 0, 0, 332, 333, 5, 61, 0, 0, 333, 334, 5, 61, 0, 0, 334, 69, 1, 0, 0, 0, 335, 336, 5, 33, 0, 0, 336, 337, 5, 61, 0, 0, 337, 71, 1, 0, 0, 0, 338, 339, 5, 60, 0, 0, 339, 73, 1, 0, 0, 0, 340, 341, 5, 60, 0, 0, 341, 342, 5, 61, 0, 0, 342, 75, 1, 0, 0, 0, 343, 344, 5, 62, 0, 0, 344, 77, 1, 0, 0, 0, 345, 346, 5, 62, 0, 0, 346, 347, 5, 61, 0, 0, 347, 79, 1, 0, 0, 0, 348, 349, 5, 124, 0, 0, 349, 81, 1, 0, 0, 0, 350, 351, 5, 47, 0, 0, 351, 83, 1, 0, 0, 0, 352, 353, 5, 37, 0, 0, 353, 85, 1, 0, 0, 0, 354, 355, 5, 60, 0, 0, 355, 356, 5, 60, 0, 0, 356, 87, 1, 0, 0, 0, 357, 358, 5, 62, 0, 0, 358, 359, 5, 62, 0, 0, 359, 89, 1, 0, 0, 0, 360, 361, 5, 38, 0, 0, 361, 362, 5, 94, 0, 0, 362, 91, 1, 0, 0, 0, 363, 364, 5, 126, 0, 0, 364, 93, 1, 0, 0, 0, 365, 366, 5, 33, 0, 0, 366, 95, 1, 0, 0, 0, 367, 368, 5, 43, 0, 0, 368, 97, 1, 0, 0, 0, 369, 370, 5, 45, 0, 0, 370, 99, 1, 0, 0, 0, 371, 372, 5, 94, 0, 0, 372, 101, 1, 0, 0, 0, 373, 374, 5, 42, 0, 0, 374, 103, 1, 0, 0, 0, 375, 376, 5, 38, 0, 0, 376, 105, 1, 0, 0, 0, 377, 378, 5, 60, 0, 0, 378, 379, 5, 45, 0, 0, 379, 107, 1, 0, 0, 0, 380, 392, 5, 48, 0, 0, 381, 388, 7, 0, 0, 0, 382, 384, 5, 95, 0, 0, 383, 382, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 387, 7, 1, 0, 0, 386, 383, 1, 0, 0, 0, 387, 390, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 391, 380, 1, 0, 0, 0, 391, 381, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 394, 6, 53, 0, 0, 394, 109, 1, 0, 0, 0, 395, 396, 5, 48, 0, 0, 396, 401, 7, 2, 0, 0, 397, 399, 5, 95, 0, 0, 398, 397, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 402, 3, 164, 81, 0, 401, 398, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 406, 6, 54, 0, 0, 406, 111, 1, 0, 0, 0, 407, 409, 5, 48, 0, 0, 408, 410, 7, 3, 0, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 415, 1, 0, 0, 0, 411, 413, 5, 95, 0, 0, 412, 411, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 416, 3, 160, 79, 0, 415, 412, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 6, 55, 0, 0, 420, 113, 1, 0, 0, 0, 421, 422, 5, 48, 0, 0, 422, 427, 7, 4, 0, 0, 423, 425, 5, 95, 0, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 428, 3, 162, 80, 0, 427, 424, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 6, 56, 0, 0, 432, 115, 1, 0, 0, 0, 433, 436, 3, 118, 58, 0, 434, 436, 3, 120, 59, 0, 435, 433, 1, 0, 0, 0, 435, 434, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 6, 57, 0, 0, 438, 117, 1, 0, 0, 0, 439, 448, 3, 158, 78, 0, 440, 442, 5, 46, 0, 0, 441, 443, 3, 158, 78, 0, 442, 441, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 445, 1, 0, 0, 0, 444, 446, 3, 166, 82, 0, 445, 444, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 449, 1, 0, 0, 0, 447, 449, 3, 166, 82, 0, 448, 440, 1, 0, 0, 0, 448, 447, 1, 0, 0, 0, 449, 456, 1, 0, 0, 0, 450, 451, 5, 46, 0, 0, 451, 453, 3, 158, 78, 0, 452, 454, 3, 166, 82, 0, 453, 452, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 456, 1, 0, 0, 0, 455, 439, 1, 0, 0, 0, 455, 450, 1, 0, 0, 0, 456, 119, 1, 0, 0, 0, 457, 458, 5, 48, 0, 0, 458, 459, 7, 4, 0, 0, 459, 460, 3, 122, 60, 0, 460, 461, 3, 124, 61, 0, 461, 121, 1, 0, 0, 0, 462, 464, 5, 95, 0, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 467, 3, 162, 80, 0, 466, 463, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 480, 1, 0, 0, 0, 470, 477, 5, 46, 0, 0, 471, 473, 5, 95, 0, 0, 472, 471, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 476, 3, 162, 80, 0, 475, 472, 1, 0, 0, 0, 476, 479, 1, 0, 0, 0, 477, 475, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 481, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 480, 470, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 494, 1, 0, 0, 0, 482, 483, 5, 46, 0, 0, 483, 490, 3, 162, 80, 0, 484, 486, 5, 95, 0, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 489, 3, 162, 80, 0, 488, 485, 1, 0, 0, 0, 489, 492, 1, 0, 0, 0, 490, 488, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 494, 1, 0, 0, 0, 492, 490, 1, 0, 0, 0, 493, 466, 1, 0, 0, 0, 493, 482, 1, 0, 0, 0, 494, 123, 1, 0, 0, 0, 495, 497, 7, 5, 0, 0, 496, 498, 7, 6, 0, 0, 497, 496, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 3, 158, 78, 0, 500, 125, 1, 0, 0, 0, 501, 507, 3, 108, 53, 0, 502, 507, 3, 110, 54, 0, 503, 507, 3, 112, 55, 0, 504, 507, 3, 114, 56, 0, 505, 507, 3, 116, 57, 0, 506, 501, 1, 0, 0, 0, 506, 502, 1, 0, 0, 0, 506, 503, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 506, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 5, 105, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 6, 62, 0, 0, 511, 127, 1, 0, 0, 0, 512, 515, 5, 39, 0, 0, 513, 516, 3, 154, 76, 0, 514, 516, 3, 132, 65, 0, 515, 513, 1, 0, 0, 0, 515, 514, 1, 0, 0, 0, 516, 517, 1, 0, 0, 0, 517, 518, 5, 39, 0, 0, 518, 129, 1, 0, 0, 0, 519, 520, 3, 128, 63, 0, 520, 521, 1, 0, 0, 0, 521, 522, 6, 64, 0, 0, 522, 131, 1, 0, 0, 0, 523, 526, 3, 134, 66, 0, 524, 526, 3, 136, 67, 0, 525, 523, 1, 0, 0, 0, 525, 524, 1, 0, 0, 0, 526, 133, 1, 0, 0, 0, 527, 528, 5, 92, 0, 0, 528, 529, 3, 160, 79, 0, 529, 530, 3, 160, 79, 0, 530, 531, 3, 160, 79, 0, 531, 135, 1, 0, 0, 0, 532, 533, 5, 92, 0, 0, 533, 534, 5, 120, 0, 0, 534, 535, 3, 162, 80, 0, 535, 536, 3, 162, 80, 0, 536, 137, 1, 0, 0, 0, 537, 538, 5, 92, 0, 0, 538, 539, 5, 117, 0, 0, 539, 540, 3, 162, 80, 0, 540, 541, 3, 162, 80, 0, 541, 542, 3, 162, 80, 0, 542, 543, 3, 162, 80, 0, 543, 139, 1, 0, 0, 0, 544, 545, 5, 92, 0, 0, 545, 546, 5, 85, 0, 0, 546, 547, 3, 162, 80, 0, 547, 548, 3, 162, 80, 0, 548, 549, 3, 162, 80, 0, 549, 550, 3, 162, 80, 0, 550, 551, 3, 162, 80, 0, 551, 552, 3, 162, 80, 0, 552, 553, 3, 162, 80, 0, 553, 554, 3, 162, 80, 0, 554, 141, 1, 0, 0, 0, 555, 559, 5, 96, 0, 0, 556, 558, 8, 7, 0, 0, 557, 556, 1, 0, 0, 0, 558, 561, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 562, 1, 0, 0, 0, 561, 559, 1, 0, 0, 0, 562, 563, 5, 96, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 6, 70, 0, 0, 565, 143, 1, 0, 0, 0, 566, 571, 5, 34, 0, 0, 567, 570, 8, 8, 0, 0, 568, 570, 3, 156, 77, 0, 569, 567, 1, 0, 0, 0, 569, 568, 1, 0, 0, 0, 570, 573, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 574, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 574, 575, 5, 34, 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 6, 71, 0, 0, 577, 145, 1, 0, 0, 0, 578, 580, 7, 9, 0, 0, 579, 578, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 579, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 584, 6, 72, 1, 0, 584, 147, 1, 0, 0, 0, 585, 586, 5, 47, 0, 0, 586, 587, 5, 42, 0, 0, 587, 591, 1, 0, 0, 0, 588, 590, 9, 0, 0, 0, 589, 588, 1, 0, 0, 0, 590, 593, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 592, 594, 1, 0, 0, 0, 593, 591, 1, 0, 0, 0, 594, 595, 5, 42, 0, 0, 595, 596, 5, 47, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 6, 73, 1, 0, 598, 149, 1, 0, 0, 0, 599, 601, 7, 10, 0, 0, 600, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 605, 6, 74, 1, 0, 605, 151, 1, 0, 0, 0, 606, 607, 5, 47, 0, 0, 607, 608, 5, 47, 0, 0, 608, 612, 1, 0, 0, 0, 609, 611, 8, 10, 0, 0, 610, 609, 1, 0, 0, 0, 611, 614, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 615, 1, 0, 0, 0, 614, 612, 1, 0, 0, 0, 615, 616, 6, 75, 1, 0, 616, 153, 1, 0, 0, 0, 617, 622, 8, 11, 0, 0, 618, 622, 3, 138, 68, 0, 619, 622, 3, 140, 69, 0, 620, 622, 3, 156, 77, 0, 621, 617, 1, 0, 0, 0, 621, 618, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 620, 1, 0, 0, 0, 622, 155, 1, 0, 0, 0, 623, 649, 5, 92, 0, 0, 624, 625, 5, 117, 0, 0, 625, 626, 3, 162, 80, 0, 626, 627, 3, 162, 80, 0, 627, 628, 3, 162, 80, 0, 628, 629, 3, 162, 80, 0, 629, 650, 1, 0, 0, 0, 630, 631, 5, 85, 0, 0, 631, 632, 3, 162, 80, 0, 632, 633, 3, 162, 80, 0, 633, 634, 3, 162, 80, 0, 634, 635, 3, 162, 80, 0, 635, 636, 3, 162, 80, 0, 636, 637, 3, 162, 80, 0, 637, 638, 3, 162, 80, 0, 638, 639, 3, 162, 80, 0, 639, 650, 1, 0, 0, 0, 640, 650, 7, 12, 0, 0, 641, 642, 3, 160, 79, 0, 642, 643, 3, 160, 79, 0, 643, 644, 3, 160, 79, 0, 644, 650, 1, 0, 0, 0, 645, 646, 5, 120, 0, 0, 646, 647, 3, 162, 80, 0, 647, 648, 3, 162, 80, 0, 648, 650, 1, 0, 0, 0, 649, 624, 1, 0, 0, 0, 649, 630, 1, 0, 0, 0, 649, 640, 1, 0, 0, 0, 649, 641, 1, 0, 0, 0, 649, 645, 1, 0, 0, 0, 650, 157, 1, 0, 0, 0, 651, 658, 7, 1, 0, 0, 652, 654, 5, 95, 0, 0, 653, 652, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 7, 1, 0, 0, 656, 653, 1, 0, 0, 0, 657, 660, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 159, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 661, 662, 7, 13, 0, 0, 662, 161, 1, 0, 0, 0, 663, 664, 7, 14, 0, 0, 664, 163, 1, 0, 0, 0, 665, 666, 7, 15, 0, 0, 666, 165, 1, 0, 0, 0, 667, 669, 7, 16, 0, 0, 668, 670, 7, 6, 0, 0, 669, 668, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 3, 158, 78, 0, 672, 167, 1, 0, 0, 0, 673, 676, 3, 172, 85, 0, 674, 676, 5, 95, 0, 0, 675, 673, 1, 0, 0, 0, 675, 674, 1, 0, 0, 0, 676, 169, 1, 0, 0, 0, 677, 678, 7, 17, 0, 0, 678, 171, 1, 0, 0, 0, 679, 680, 7, 18, 0, 0, 680, 173, 1, 0, 0, 0, 681, 683, 7, 9, 0, 0, 682, 681, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 682, 1, 0, 0, 0, 684, 685, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 687, 6, 86, 1, 0, 687, 175, 1, 0, 0, 0, 688, 689, 5, 47, 0, 0, 689, 690, 5, 42, 0, 0, 690, 694, 1, 0, 0, 0, 691, 693, 8, 10, 0, 0, 692, 691, 1, 0, 0, 0, 693, 696, 1, 0, 0, 0, 694, 695, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 695, 697, 1, 0, 0, 0, 696, 694, 1, 0, 0, 0, 697, 698, 5, 42, 0, 0, 698, 699, 5, 47, 0, 0, 699, 700, 1, 0, 0, 0, 700, 701, 6, 87, 1, 0, 701, 177, 1, 0, 0, 0, 702, 703, 5, 47, 0, 0, 703, 704, 5, 47, 0, 0, 704, 708, 1, 0, 0, 0, 705, 707, 8, 10, 0, 0, 706, 705, 1, 0, 0, 0, 707, 710, 1, 0, 0, 0, 708, 706, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 711, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 711, 712, 6, 88, 1, 0, 712, 179, 1, 0, 0, 0, 713, 715, 7, 10, 0, 0, 714, 713, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 732, 1, 0, 0, 0, 718, 732, 5, 59, 0, 0, 719, 720, 5, 47, 0, 0, 720, 721, 5, 42, 0, 0, 721, 725, 1, 0, 0, 0, 722, 724, 9, 0, 0, 0, 723, 722, 1, 0, 0, 0, 724, 727, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 726, 728, 1, 0, 0, 0, 727, 725, 1, 0, 0, 0, 728, 729, 5, 42, 0, 0, 729, 732, 5, 47, 0, 0, 730, 732, 5, 0, 0, 1, 731, 714, 1, 0, 0, 0, 731, 718, 1, 0, 0, 0, 731, 719, 1, 0, 0, 0, 731, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 734, 6, 89, 2, 0, 734, 181, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 6, 90, 2, 0, 738, 739, 6, 90, 1, 0, 739, 183, 1, 0, 0, 0, 51, 0, 1, 277, 279, 383, 388, 391, 398, 403, 409, 412, 417, 424, 429, 435, 442, 445, 448, 453, 455, 463, 468, 472, 477, 480, 485, 490, 493, 497, 506, 515, 525, 559, 569, 571, 581, 591, 602, 612, 621, 649, 653, 658, 669, 675, 684, 694, 708, 716, 725, 731, 3, 2, 1, 0, 0, 1, 0, 2, 0, 0] \ No newline at end of file +[4, 0, 81, 760, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 5, 18, 296, 8, 18, 10, 18, 12, 18, 299, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 3, 56, 404, 8, 56, 1, 56, 5, 56, 407, 8, 56, 10, 56, 12, 56, 410, 9, 56, 3, 56, 412, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 3, 57, 419, 8, 57, 1, 57, 4, 57, 422, 8, 57, 11, 57, 12, 57, 423, 1, 57, 1, 57, 1, 58, 1, 58, 3, 58, 430, 8, 58, 1, 58, 3, 58, 433, 8, 58, 1, 58, 4, 58, 436, 8, 58, 11, 58, 12, 58, 437, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 3, 59, 445, 8, 59, 1, 59, 4, 59, 448, 8, 59, 11, 59, 12, 59, 449, 1, 59, 1, 59, 1, 60, 1, 60, 3, 60, 456, 8, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 3, 61, 463, 8, 61, 1, 61, 3, 61, 466, 8, 61, 1, 61, 3, 61, 469, 8, 61, 1, 61, 1, 61, 1, 61, 3, 61, 474, 8, 61, 3, 61, 476, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 3, 63, 484, 8, 63, 1, 63, 4, 63, 487, 8, 63, 11, 63, 12, 63, 488, 1, 63, 1, 63, 3, 63, 493, 8, 63, 1, 63, 5, 63, 496, 8, 63, 10, 63, 12, 63, 499, 9, 63, 3, 63, 501, 8, 63, 1, 63, 1, 63, 1, 63, 3, 63, 506, 8, 63, 1, 63, 5, 63, 509, 8, 63, 10, 63, 12, 63, 512, 9, 63, 3, 63, 514, 8, 63, 1, 64, 1, 64, 3, 64, 518, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 527, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 3, 66, 536, 8, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 3, 68, 546, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 5, 73, 578, 8, 73, 10, 73, 12, 73, 581, 9, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 5, 74, 590, 8, 74, 10, 74, 12, 74, 593, 9, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 4, 75, 600, 8, 75, 11, 75, 12, 75, 601, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 610, 8, 76, 10, 76, 12, 76, 613, 9, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 4, 77, 621, 8, 77, 11, 77, 12, 77, 622, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 5, 78, 631, 8, 78, 10, 78, 12, 78, 634, 9, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 642, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, 670, 8, 80, 1, 81, 1, 81, 3, 81, 674, 8, 81, 1, 81, 5, 81, 677, 8, 81, 10, 81, 12, 81, 680, 9, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 3, 85, 690, 8, 85, 1, 85, 1, 85, 1, 86, 1, 86, 3, 86, 696, 8, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 4, 89, 703, 8, 89, 11, 89, 12, 89, 704, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 5, 90, 713, 8, 90, 10, 90, 12, 90, 716, 9, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 5, 91, 727, 8, 91, 10, 91, 12, 91, 730, 9, 91, 1, 91, 1, 91, 1, 92, 4, 92, 735, 8, 92, 11, 92, 12, 92, 736, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 5, 92, 744, 8, 92, 10, 92, 12, 92, 747, 9, 92, 1, 92, 1, 92, 1, 92, 3, 92, 752, 8, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 611, 714, 745, 0, 94, 2, 1, 4, 2, 6, 3, 8, 4, 10, 5, 12, 6, 14, 7, 16, 8, 18, 9, 20, 10, 22, 11, 24, 12, 26, 13, 28, 14, 30, 15, 32, 16, 34, 17, 36, 18, 38, 19, 40, 20, 42, 21, 44, 22, 46, 23, 48, 24, 50, 25, 52, 26, 54, 27, 56, 28, 58, 29, 60, 30, 62, 31, 64, 32, 66, 33, 68, 34, 70, 35, 72, 36, 74, 37, 76, 38, 78, 39, 80, 40, 82, 41, 84, 42, 86, 43, 88, 44, 90, 45, 92, 46, 94, 47, 96, 48, 98, 49, 100, 50, 102, 51, 104, 52, 106, 53, 108, 54, 110, 55, 112, 56, 114, 57, 116, 58, 118, 59, 120, 60, 122, 61, 124, 62, 126, 63, 128, 0, 130, 0, 132, 64, 134, 0, 136, 65, 138, 66, 140, 67, 142, 68, 144, 69, 146, 70, 148, 71, 150, 72, 152, 73, 154, 74, 156, 75, 158, 76, 160, 0, 162, 0, 164, 0, 166, 0, 168, 0, 170, 0, 172, 0, 174, 0, 176, 0, 178, 0, 180, 77, 182, 78, 184, 79, 186, 80, 188, 81, 2, 0, 1, 19, 1, 0, 49, 57, 1, 0, 48, 57, 2, 0, 66, 66, 98, 98, 2, 0, 79, 79, 111, 111, 2, 0, 88, 88, 120, 120, 2, 0, 80, 80, 112, 112, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 13, 13, 3, 0, 10, 10, 13, 13, 39, 39, 9, 0, 34, 34, 39, 39, 92, 92, 97, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 1, 0, 48, 55, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 49, 2, 0, 69, 69, 101, 101, 64, 0, 48, 57, 1632, 1641, 1776, 1785, 1984, 1993, 2406, 2415, 2534, 2543, 2662, 2671, 2790, 2799, 2918, 2927, 3046, 3055, 3174, 3183, 3302, 3311, 3430, 3439, 3558, 3567, 3664, 3673, 3792, 3801, 3872, 3881, 4160, 4169, 4240, 4249, 6112, 6121, 6160, 6169, 6470, 6479, 6608, 6617, 6784, 6793, 6800, 6809, 6992, 7001, 7088, 7097, 7232, 7241, 7248, 7257, 42528, 42537, 43216, 43225, 43264, 43273, 43472, 43481, 43504, 43513, 43600, 43609, 44016, 44025, 65296, 65305, 66720, 66729, 68912, 68921, 69734, 69743, 69872, 69881, 69942, 69951, 70096, 70105, 70384, 70393, 70736, 70745, 70864, 70873, 71248, 71257, 71360, 71369, 71472, 71481, 71904, 71913, 72016, 72025, 72784, 72793, 73040, 73049, 73120, 73129, 73552, 73561, 92768, 92777, 92864, 92873, 93008, 93017, 120782, 120831, 123200, 123209, 123632, 123641, 124144, 124153, 125264, 125273, 130032, 130041, 659, 0, 65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2160, 2183, 2185, 2190, 2208, 2249, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3165, 3165, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3293, 3294, 3296, 3297, 3313, 3314, 3332, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5873, 5880, 5888, 5905, 5919, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6276, 6279, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6988, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8579, 8580, 11264, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12294, 12337, 12341, 12347, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12735, 12784, 12799, 13312, 19903, 19968, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42725, 42775, 42783, 42786, 42888, 42891, 42954, 42960, 42961, 42963, 42963, 42965, 42969, 42994, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43881, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66368, 66370, 66377, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 66928, 66938, 66940, 66954, 66956, 66962, 66964, 66965, 66967, 66977, 66979, 66993, 66995, 67001, 67003, 67004, 67072, 67382, 67392, 67413, 67424, 67431, 67456, 67461, 67463, 67504, 67506, 67514, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69248, 69289, 69296, 69297, 69376, 69404, 69415, 69415, 69424, 69445, 69488, 69505, 69552, 69572, 69600, 69622, 69635, 69687, 69745, 69746, 69749, 69749, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69959, 69959, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70207, 70208, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70753, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71488, 71494, 71680, 71723, 71840, 71903, 71935, 71942, 71945, 71945, 71948, 71955, 71957, 71958, 71960, 71983, 71999, 71999, 72001, 72001, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72368, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73474, 73474, 73476, 73488, 73490, 73523, 73648, 73648, 73728, 74649, 74880, 75075, 77712, 77808, 77824, 78895, 78913, 78918, 82944, 83526, 92160, 92728, 92736, 92766, 92784, 92862, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101589, 101632, 101640, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 122624, 122654, 122661, 122666, 122928, 122989, 123136, 123180, 123191, 123197, 123214, 123214, 123536, 123565, 123584, 123627, 124112, 124139, 124896, 124902, 124904, 124907, 124909, 124910, 124912, 124926, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173791, 173824, 177977, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101, 196608, 201546, 201552, 205743, 804, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 92, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 98, 1, 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 102, 1, 0, 0, 0, 0, 104, 1, 0, 0, 0, 0, 106, 1, 0, 0, 0, 0, 108, 1, 0, 0, 0, 0, 110, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 0, 136, 1, 0, 0, 0, 0, 138, 1, 0, 0, 0, 0, 140, 1, 0, 0, 0, 0, 142, 1, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 146, 1, 0, 0, 0, 0, 148, 1, 0, 0, 0, 0, 150, 1, 0, 0, 0, 0, 152, 1, 0, 0, 0, 0, 154, 1, 0, 0, 0, 0, 156, 1, 0, 0, 0, 0, 158, 1, 0, 0, 0, 1, 180, 1, 0, 0, 0, 1, 182, 1, 0, 0, 0, 1, 184, 1, 0, 0, 0, 1, 186, 1, 0, 0, 0, 1, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 4, 193, 1, 0, 0, 0, 6, 199, 1, 0, 0, 0, 8, 207, 1, 0, 0, 0, 10, 212, 1, 0, 0, 0, 12, 218, 1, 0, 0, 0, 14, 229, 1, 0, 0, 0, 16, 234, 1, 0, 0, 0, 18, 238, 1, 0, 0, 0, 20, 243, 1, 0, 0, 0, 22, 248, 1, 0, 0, 0, 24, 253, 1, 0, 0, 0, 26, 256, 1, 0, 0, 0, 28, 262, 1, 0, 0, 0, 30, 271, 1, 0, 0, 0, 32, 276, 1, 0, 0, 0, 34, 283, 1, 0, 0, 0, 36, 288, 1, 0, 0, 0, 38, 292, 1, 0, 0, 0, 40, 302, 1, 0, 0, 0, 42, 304, 1, 0, 0, 0, 44, 308, 1, 0, 0, 0, 46, 310, 1, 0, 0, 0, 48, 314, 1, 0, 0, 0, 50, 316, 1, 0, 0, 0, 52, 320, 1, 0, 0, 0, 54, 322, 1, 0, 0, 0, 56, 324, 1, 0, 0, 0, 58, 326, 1, 0, 0, 0, 60, 328, 1, 0, 0, 0, 62, 330, 1, 0, 0, 0, 64, 335, 1, 0, 0, 0, 66, 340, 1, 0, 0, 0, 68, 343, 1, 0, 0, 0, 70, 346, 1, 0, 0, 0, 72, 349, 1, 0, 0, 0, 74, 352, 1, 0, 0, 0, 76, 355, 1, 0, 0, 0, 78, 358, 1, 0, 0, 0, 80, 360, 1, 0, 0, 0, 82, 363, 1, 0, 0, 0, 84, 365, 1, 0, 0, 0, 86, 368, 1, 0, 0, 0, 88, 370, 1, 0, 0, 0, 90, 372, 1, 0, 0, 0, 92, 374, 1, 0, 0, 0, 94, 377, 1, 0, 0, 0, 96, 380, 1, 0, 0, 0, 98, 383, 1, 0, 0, 0, 100, 385, 1, 0, 0, 0, 102, 387, 1, 0, 0, 0, 104, 389, 1, 0, 0, 0, 106, 391, 1, 0, 0, 0, 108, 393, 1, 0, 0, 0, 110, 395, 1, 0, 0, 0, 112, 397, 1, 0, 0, 0, 114, 411, 1, 0, 0, 0, 116, 415, 1, 0, 0, 0, 118, 427, 1, 0, 0, 0, 120, 441, 1, 0, 0, 0, 122, 455, 1, 0, 0, 0, 124, 475, 1, 0, 0, 0, 126, 477, 1, 0, 0, 0, 128, 513, 1, 0, 0, 0, 130, 515, 1, 0, 0, 0, 132, 526, 1, 0, 0, 0, 134, 532, 1, 0, 0, 0, 136, 539, 1, 0, 0, 0, 138, 545, 1, 0, 0, 0, 140, 547, 1, 0, 0, 0, 142, 552, 1, 0, 0, 0, 144, 557, 1, 0, 0, 0, 146, 564, 1, 0, 0, 0, 148, 575, 1, 0, 0, 0, 150, 586, 1, 0, 0, 0, 152, 599, 1, 0, 0, 0, 154, 605, 1, 0, 0, 0, 156, 620, 1, 0, 0, 0, 158, 626, 1, 0, 0, 0, 160, 641, 1, 0, 0, 0, 162, 643, 1, 0, 0, 0, 164, 671, 1, 0, 0, 0, 166, 681, 1, 0, 0, 0, 168, 683, 1, 0, 0, 0, 170, 685, 1, 0, 0, 0, 172, 687, 1, 0, 0, 0, 174, 695, 1, 0, 0, 0, 176, 697, 1, 0, 0, 0, 178, 699, 1, 0, 0, 0, 180, 702, 1, 0, 0, 0, 182, 708, 1, 0, 0, 0, 184, 722, 1, 0, 0, 0, 186, 751, 1, 0, 0, 0, 188, 755, 1, 0, 0, 0, 190, 191, 5, 97, 0, 0, 191, 192, 5, 115, 0, 0, 192, 3, 1, 0, 0, 0, 193, 194, 5, 97, 0, 0, 194, 195, 5, 115, 0, 0, 195, 196, 5, 121, 0, 0, 196, 197, 5, 110, 0, 0, 197, 198, 5, 99, 0, 0, 198, 5, 1, 0, 0, 0, 199, 200, 5, 98, 0, 0, 200, 201, 5, 114, 0, 0, 201, 202, 5, 101, 0, 0, 202, 203, 5, 97, 0, 0, 203, 204, 5, 107, 0, 0, 204, 205, 1, 0, 0, 0, 205, 206, 6, 2, 0, 0, 206, 7, 1, 0, 0, 0, 207, 208, 5, 99, 0, 0, 208, 209, 5, 97, 0, 0, 209, 210, 5, 115, 0, 0, 210, 211, 5, 101, 0, 0, 211, 9, 1, 0, 0, 0, 212, 213, 5, 99, 0, 0, 213, 214, 5, 111, 0, 0, 214, 215, 5, 110, 0, 0, 215, 216, 5, 115, 0, 0, 216, 217, 5, 116, 0, 0, 217, 11, 1, 0, 0, 0, 218, 219, 5, 99, 0, 0, 219, 220, 5, 111, 0, 0, 220, 221, 5, 110, 0, 0, 221, 222, 5, 116, 0, 0, 222, 223, 5, 105, 0, 0, 223, 224, 5, 110, 0, 0, 224, 225, 5, 117, 0, 0, 225, 226, 5, 101, 0, 0, 226, 227, 1, 0, 0, 0, 227, 228, 6, 5, 0, 0, 228, 13, 1, 0, 0, 0, 229, 230, 5, 101, 0, 0, 230, 231, 5, 108, 0, 0, 231, 232, 5, 115, 0, 0, 232, 233, 5, 101, 0, 0, 233, 15, 1, 0, 0, 0, 234, 235, 5, 102, 0, 0, 235, 236, 5, 111, 0, 0, 236, 237, 5, 114, 0, 0, 237, 17, 1, 0, 0, 0, 238, 239, 5, 102, 0, 0, 239, 240, 5, 114, 0, 0, 240, 241, 5, 111, 0, 0, 241, 242, 5, 109, 0, 0, 242, 19, 1, 0, 0, 0, 243, 244, 5, 102, 0, 0, 244, 245, 5, 117, 0, 0, 245, 246, 5, 110, 0, 0, 246, 247, 5, 99, 0, 0, 247, 21, 1, 0, 0, 0, 248, 249, 5, 106, 0, 0, 249, 250, 5, 111, 0, 0, 250, 251, 5, 105, 0, 0, 251, 252, 5, 110, 0, 0, 252, 23, 1, 0, 0, 0, 253, 254, 5, 105, 0, 0, 254, 255, 5, 102, 0, 0, 255, 25, 1, 0, 0, 0, 256, 257, 5, 110, 0, 0, 257, 258, 5, 105, 0, 0, 258, 259, 5, 108, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 6, 12, 0, 0, 261, 27, 1, 0, 0, 0, 262, 263, 5, 114, 0, 0, 263, 264, 5, 101, 0, 0, 264, 265, 5, 116, 0, 0, 265, 266, 5, 117, 0, 0, 266, 267, 5, 114, 0, 0, 267, 268, 5, 110, 0, 0, 268, 269, 1, 0, 0, 0, 269, 270, 6, 13, 0, 0, 270, 29, 1, 0, 0, 0, 271, 272, 5, 115, 0, 0, 272, 273, 5, 121, 0, 0, 273, 274, 5, 110, 0, 0, 274, 275, 5, 99, 0, 0, 275, 31, 1, 0, 0, 0, 276, 277, 5, 115, 0, 0, 277, 278, 5, 116, 0, 0, 278, 279, 5, 114, 0, 0, 279, 280, 5, 117, 0, 0, 280, 281, 5, 99, 0, 0, 281, 282, 5, 116, 0, 0, 282, 33, 1, 0, 0, 0, 283, 284, 5, 116, 0, 0, 284, 285, 5, 121, 0, 0, 285, 286, 5, 112, 0, 0, 286, 287, 5, 101, 0, 0, 287, 35, 1, 0, 0, 0, 288, 289, 5, 118, 0, 0, 289, 290, 5, 97, 0, 0, 290, 291, 5, 114, 0, 0, 291, 37, 1, 0, 0, 0, 292, 297, 3, 174, 86, 0, 293, 296, 3, 174, 86, 0, 294, 296, 3, 176, 87, 0, 295, 293, 1, 0, 0, 0, 295, 294, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 300, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 301, 6, 18, 0, 0, 301, 39, 1, 0, 0, 0, 302, 303, 5, 40, 0, 0, 303, 41, 1, 0, 0, 0, 304, 305, 5, 41, 0, 0, 305, 306, 1, 0, 0, 0, 306, 307, 6, 20, 0, 0, 307, 43, 1, 0, 0, 0, 308, 309, 5, 123, 0, 0, 309, 45, 1, 0, 0, 0, 310, 311, 5, 125, 0, 0, 311, 312, 1, 0, 0, 0, 312, 313, 6, 22, 0, 0, 313, 47, 1, 0, 0, 0, 314, 315, 5, 91, 0, 0, 315, 49, 1, 0, 0, 0, 316, 317, 5, 93, 0, 0, 317, 318, 1, 0, 0, 0, 318, 319, 6, 24, 0, 0, 319, 51, 1, 0, 0, 0, 320, 321, 5, 61, 0, 0, 321, 53, 1, 0, 0, 0, 322, 323, 5, 44, 0, 0, 323, 55, 1, 0, 0, 0, 324, 325, 5, 59, 0, 0, 325, 57, 1, 0, 0, 0, 326, 327, 5, 58, 0, 0, 327, 59, 1, 0, 0, 0, 328, 329, 5, 46, 0, 0, 329, 61, 1, 0, 0, 0, 330, 331, 5, 43, 0, 0, 331, 332, 5, 43, 0, 0, 332, 333, 1, 0, 0, 0, 333, 334, 6, 30, 0, 0, 334, 63, 1, 0, 0, 0, 335, 336, 5, 45, 0, 0, 336, 337, 5, 45, 0, 0, 337, 338, 1, 0, 0, 0, 338, 339, 6, 31, 0, 0, 339, 65, 1, 0, 0, 0, 340, 341, 5, 58, 0, 0, 341, 342, 5, 61, 0, 0, 342, 67, 1, 0, 0, 0, 343, 344, 5, 124, 0, 0, 344, 345, 5, 124, 0, 0, 345, 69, 1, 0, 0, 0, 346, 347, 5, 38, 0, 0, 347, 348, 5, 38, 0, 0, 348, 71, 1, 0, 0, 0, 349, 350, 5, 60, 0, 0, 350, 351, 5, 124, 0, 0, 351, 73, 1, 0, 0, 0, 352, 353, 5, 61, 0, 0, 353, 354, 5, 61, 0, 0, 354, 75, 1, 0, 0, 0, 355, 356, 5, 33, 0, 0, 356, 357, 5, 61, 0, 0, 357, 77, 1, 0, 0, 0, 358, 359, 5, 60, 0, 0, 359, 79, 1, 0, 0, 0, 360, 361, 5, 60, 0, 0, 361, 362, 5, 61, 0, 0, 362, 81, 1, 0, 0, 0, 363, 364, 5, 62, 0, 0, 364, 83, 1, 0, 0, 0, 365, 366, 5, 62, 0, 0, 366, 367, 5, 61, 0, 0, 367, 85, 1, 0, 0, 0, 368, 369, 5, 124, 0, 0, 369, 87, 1, 0, 0, 0, 370, 371, 5, 47, 0, 0, 371, 89, 1, 0, 0, 0, 372, 373, 5, 37, 0, 0, 373, 91, 1, 0, 0, 0, 374, 375, 5, 60, 0, 0, 375, 376, 5, 60, 0, 0, 376, 93, 1, 0, 0, 0, 377, 378, 5, 62, 0, 0, 378, 379, 5, 62, 0, 0, 379, 95, 1, 0, 0, 0, 380, 381, 5, 38, 0, 0, 381, 382, 5, 94, 0, 0, 382, 97, 1, 0, 0, 0, 383, 384, 5, 126, 0, 0, 384, 99, 1, 0, 0, 0, 385, 386, 5, 33, 0, 0, 386, 101, 1, 0, 0, 0, 387, 388, 5, 43, 0, 0, 388, 103, 1, 0, 0, 0, 389, 390, 5, 45, 0, 0, 390, 105, 1, 0, 0, 0, 391, 392, 5, 94, 0, 0, 392, 107, 1, 0, 0, 0, 393, 394, 5, 42, 0, 0, 394, 109, 1, 0, 0, 0, 395, 396, 5, 38, 0, 0, 396, 111, 1, 0, 0, 0, 397, 398, 5, 60, 0, 0, 398, 399, 5, 45, 0, 0, 399, 113, 1, 0, 0, 0, 400, 412, 5, 48, 0, 0, 401, 408, 7, 0, 0, 0, 402, 404, 5, 95, 0, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 407, 7, 1, 0, 0, 406, 403, 1, 0, 0, 0, 407, 410, 1, 0, 0, 0, 408, 406, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 412, 1, 0, 0, 0, 410, 408, 1, 0, 0, 0, 411, 400, 1, 0, 0, 0, 411, 401, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 6, 56, 0, 0, 414, 115, 1, 0, 0, 0, 415, 416, 5, 48, 0, 0, 416, 421, 7, 2, 0, 0, 417, 419, 5, 95, 0, 0, 418, 417, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 3, 170, 84, 0, 421, 418, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 6, 57, 0, 0, 426, 117, 1, 0, 0, 0, 427, 429, 5, 48, 0, 0, 428, 430, 7, 3, 0, 0, 429, 428, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 435, 1, 0, 0, 0, 431, 433, 5, 95, 0, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 436, 3, 166, 82, 0, 435, 432, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 435, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 6, 58, 0, 0, 440, 119, 1, 0, 0, 0, 441, 442, 5, 48, 0, 0, 442, 447, 7, 4, 0, 0, 443, 445, 5, 95, 0, 0, 444, 443, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 448, 3, 168, 83, 0, 447, 444, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 6, 59, 0, 0, 452, 121, 1, 0, 0, 0, 453, 456, 3, 124, 61, 0, 454, 456, 3, 126, 62, 0, 455, 453, 1, 0, 0, 0, 455, 454, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 458, 6, 60, 0, 0, 458, 123, 1, 0, 0, 0, 459, 468, 3, 164, 81, 0, 460, 462, 5, 46, 0, 0, 461, 463, 3, 164, 81, 0, 462, 461, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 465, 1, 0, 0, 0, 464, 466, 3, 172, 85, 0, 465, 464, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 469, 1, 0, 0, 0, 467, 469, 3, 172, 85, 0, 468, 460, 1, 0, 0, 0, 468, 467, 1, 0, 0, 0, 469, 476, 1, 0, 0, 0, 470, 471, 5, 46, 0, 0, 471, 473, 3, 164, 81, 0, 472, 474, 3, 172, 85, 0, 473, 472, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 476, 1, 0, 0, 0, 475, 459, 1, 0, 0, 0, 475, 470, 1, 0, 0, 0, 476, 125, 1, 0, 0, 0, 477, 478, 5, 48, 0, 0, 478, 479, 7, 4, 0, 0, 479, 480, 3, 128, 63, 0, 480, 481, 3, 130, 64, 0, 481, 127, 1, 0, 0, 0, 482, 484, 5, 95, 0, 0, 483, 482, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 487, 3, 168, 83, 0, 486, 483, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 486, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 500, 1, 0, 0, 0, 490, 497, 5, 46, 0, 0, 491, 493, 5, 95, 0, 0, 492, 491, 1, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 496, 3, 168, 83, 0, 495, 492, 1, 0, 0, 0, 496, 499, 1, 0, 0, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 501, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 490, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 514, 1, 0, 0, 0, 502, 503, 5, 46, 0, 0, 503, 510, 3, 168, 83, 0, 504, 506, 5, 95, 0, 0, 505, 504, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 509, 3, 168, 83, 0, 508, 505, 1, 0, 0, 0, 509, 512, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 514, 1, 0, 0, 0, 512, 510, 1, 0, 0, 0, 513, 486, 1, 0, 0, 0, 513, 502, 1, 0, 0, 0, 514, 129, 1, 0, 0, 0, 515, 517, 7, 5, 0, 0, 516, 518, 7, 6, 0, 0, 517, 516, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 3, 164, 81, 0, 520, 131, 1, 0, 0, 0, 521, 527, 3, 114, 56, 0, 522, 527, 3, 116, 57, 0, 523, 527, 3, 118, 58, 0, 524, 527, 3, 120, 59, 0, 525, 527, 3, 122, 60, 0, 526, 521, 1, 0, 0, 0, 526, 522, 1, 0, 0, 0, 526, 523, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 526, 525, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 5, 105, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 6, 65, 0, 0, 531, 133, 1, 0, 0, 0, 532, 535, 5, 39, 0, 0, 533, 536, 3, 160, 79, 0, 534, 536, 3, 138, 68, 0, 535, 533, 1, 0, 0, 0, 535, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 538, 5, 39, 0, 0, 538, 135, 1, 0, 0, 0, 539, 540, 3, 134, 66, 0, 540, 541, 1, 0, 0, 0, 541, 542, 6, 67, 0, 0, 542, 137, 1, 0, 0, 0, 543, 546, 3, 140, 69, 0, 544, 546, 3, 142, 70, 0, 545, 543, 1, 0, 0, 0, 545, 544, 1, 0, 0, 0, 546, 139, 1, 0, 0, 0, 547, 548, 5, 92, 0, 0, 548, 549, 3, 166, 82, 0, 549, 550, 3, 166, 82, 0, 550, 551, 3, 166, 82, 0, 551, 141, 1, 0, 0, 0, 552, 553, 5, 92, 0, 0, 553, 554, 5, 120, 0, 0, 554, 555, 3, 168, 83, 0, 555, 556, 3, 168, 83, 0, 556, 143, 1, 0, 0, 0, 557, 558, 5, 92, 0, 0, 558, 559, 5, 117, 0, 0, 559, 560, 3, 168, 83, 0, 560, 561, 3, 168, 83, 0, 561, 562, 3, 168, 83, 0, 562, 563, 3, 168, 83, 0, 563, 145, 1, 0, 0, 0, 564, 565, 5, 92, 0, 0, 565, 566, 5, 85, 0, 0, 566, 567, 3, 168, 83, 0, 567, 568, 3, 168, 83, 0, 568, 569, 3, 168, 83, 0, 569, 570, 3, 168, 83, 0, 570, 571, 3, 168, 83, 0, 571, 572, 3, 168, 83, 0, 572, 573, 3, 168, 83, 0, 573, 574, 3, 168, 83, 0, 574, 147, 1, 0, 0, 0, 575, 579, 5, 96, 0, 0, 576, 578, 8, 7, 0, 0, 577, 576, 1, 0, 0, 0, 578, 581, 1, 0, 0, 0, 579, 577, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 582, 1, 0, 0, 0, 581, 579, 1, 0, 0, 0, 582, 583, 5, 96, 0, 0, 583, 584, 1, 0, 0, 0, 584, 585, 6, 73, 0, 0, 585, 149, 1, 0, 0, 0, 586, 591, 5, 34, 0, 0, 587, 590, 8, 8, 0, 0, 588, 590, 3, 162, 80, 0, 589, 587, 1, 0, 0, 0, 589, 588, 1, 0, 0, 0, 590, 593, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 594, 1, 0, 0, 0, 593, 591, 1, 0, 0, 0, 594, 595, 5, 34, 0, 0, 595, 596, 1, 0, 0, 0, 596, 597, 6, 74, 0, 0, 597, 151, 1, 0, 0, 0, 598, 600, 7, 9, 0, 0, 599, 598, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 6, 75, 1, 0, 604, 153, 1, 0, 0, 0, 605, 606, 5, 47, 0, 0, 606, 607, 5, 42, 0, 0, 607, 611, 1, 0, 0, 0, 608, 610, 9, 0, 0, 0, 609, 608, 1, 0, 0, 0, 610, 613, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 614, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 614, 615, 5, 42, 0, 0, 615, 616, 5, 47, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 6, 76, 1, 0, 618, 155, 1, 0, 0, 0, 619, 621, 7, 10, 0, 0, 620, 619, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 625, 6, 77, 1, 0, 625, 157, 1, 0, 0, 0, 626, 627, 5, 47, 0, 0, 627, 628, 5, 47, 0, 0, 628, 632, 1, 0, 0, 0, 629, 631, 8, 10, 0, 0, 630, 629, 1, 0, 0, 0, 631, 634, 1, 0, 0, 0, 632, 630, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 635, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 635, 636, 6, 78, 1, 0, 636, 159, 1, 0, 0, 0, 637, 642, 8, 11, 0, 0, 638, 642, 3, 144, 71, 0, 639, 642, 3, 146, 72, 0, 640, 642, 3, 162, 80, 0, 641, 637, 1, 0, 0, 0, 641, 638, 1, 0, 0, 0, 641, 639, 1, 0, 0, 0, 641, 640, 1, 0, 0, 0, 642, 161, 1, 0, 0, 0, 643, 669, 5, 92, 0, 0, 644, 645, 5, 117, 0, 0, 645, 646, 3, 168, 83, 0, 646, 647, 3, 168, 83, 0, 647, 648, 3, 168, 83, 0, 648, 649, 3, 168, 83, 0, 649, 670, 1, 0, 0, 0, 650, 651, 5, 85, 0, 0, 651, 652, 3, 168, 83, 0, 652, 653, 3, 168, 83, 0, 653, 654, 3, 168, 83, 0, 654, 655, 3, 168, 83, 0, 655, 656, 3, 168, 83, 0, 656, 657, 3, 168, 83, 0, 657, 658, 3, 168, 83, 0, 658, 659, 3, 168, 83, 0, 659, 670, 1, 0, 0, 0, 660, 670, 7, 12, 0, 0, 661, 662, 3, 166, 82, 0, 662, 663, 3, 166, 82, 0, 663, 664, 3, 166, 82, 0, 664, 670, 1, 0, 0, 0, 665, 666, 5, 120, 0, 0, 666, 667, 3, 168, 83, 0, 667, 668, 3, 168, 83, 0, 668, 670, 1, 0, 0, 0, 669, 644, 1, 0, 0, 0, 669, 650, 1, 0, 0, 0, 669, 660, 1, 0, 0, 0, 669, 661, 1, 0, 0, 0, 669, 665, 1, 0, 0, 0, 670, 163, 1, 0, 0, 0, 671, 678, 7, 1, 0, 0, 672, 674, 5, 95, 0, 0, 673, 672, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 677, 7, 1, 0, 0, 676, 673, 1, 0, 0, 0, 677, 680, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 165, 1, 0, 0, 0, 680, 678, 1, 0, 0, 0, 681, 682, 7, 13, 0, 0, 682, 167, 1, 0, 0, 0, 683, 684, 7, 14, 0, 0, 684, 169, 1, 0, 0, 0, 685, 686, 7, 15, 0, 0, 686, 171, 1, 0, 0, 0, 687, 689, 7, 16, 0, 0, 688, 690, 7, 6, 0, 0, 689, 688, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 691, 1, 0, 0, 0, 691, 692, 3, 164, 81, 0, 692, 173, 1, 0, 0, 0, 693, 696, 3, 178, 88, 0, 694, 696, 5, 95, 0, 0, 695, 693, 1, 0, 0, 0, 695, 694, 1, 0, 0, 0, 696, 175, 1, 0, 0, 0, 697, 698, 7, 17, 0, 0, 698, 177, 1, 0, 0, 0, 699, 700, 7, 18, 0, 0, 700, 179, 1, 0, 0, 0, 701, 703, 7, 9, 0, 0, 702, 701, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 702, 1, 0, 0, 0, 704, 705, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 707, 6, 89, 1, 0, 707, 181, 1, 0, 0, 0, 708, 709, 5, 47, 0, 0, 709, 710, 5, 42, 0, 0, 710, 714, 1, 0, 0, 0, 711, 713, 8, 10, 0, 0, 712, 711, 1, 0, 0, 0, 713, 716, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 715, 717, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 717, 718, 5, 42, 0, 0, 718, 719, 5, 47, 0, 0, 719, 720, 1, 0, 0, 0, 720, 721, 6, 90, 1, 0, 721, 183, 1, 0, 0, 0, 722, 723, 5, 47, 0, 0, 723, 724, 5, 47, 0, 0, 724, 728, 1, 0, 0, 0, 725, 727, 8, 10, 0, 0, 726, 725, 1, 0, 0, 0, 727, 730, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 731, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 731, 732, 6, 91, 1, 0, 732, 185, 1, 0, 0, 0, 733, 735, 7, 10, 0, 0, 734, 733, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 752, 1, 0, 0, 0, 738, 752, 5, 59, 0, 0, 739, 740, 5, 47, 0, 0, 740, 741, 5, 42, 0, 0, 741, 745, 1, 0, 0, 0, 742, 744, 9, 0, 0, 0, 743, 742, 1, 0, 0, 0, 744, 747, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 745, 743, 1, 0, 0, 0, 746, 748, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 748, 749, 5, 42, 0, 0, 749, 752, 5, 47, 0, 0, 750, 752, 5, 0, 0, 1, 751, 734, 1, 0, 0, 0, 751, 738, 1, 0, 0, 0, 751, 739, 1, 0, 0, 0, 751, 750, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 6, 92, 2, 0, 754, 187, 1, 0, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 1, 0, 0, 0, 757, 758, 6, 93, 2, 0, 758, 759, 6, 93, 1, 0, 759, 189, 1, 0, 0, 0, 51, 0, 1, 295, 297, 403, 408, 411, 418, 423, 429, 432, 437, 444, 449, 455, 462, 465, 468, 473, 475, 483, 488, 492, 497, 500, 505, 510, 513, 517, 526, 535, 545, 579, 589, 591, 601, 611, 622, 632, 641, 669, 673, 678, 689, 695, 704, 714, 728, 736, 745, 751, 3, 2, 1, 0, 0, 1, 0, 2, 0, 0] \ No newline at end of file diff --git a/parser/generated/TLexer.tokens b/parser/generated/TLexer.tokens index 1c64c62..70f824b 100644 --- a/parser/generated/TLexer.tokens +++ b/parser/generated/TLexer.tokens @@ -13,69 +13,72 @@ IF=12 NIL_LIT=13 RETURN=14 SYNC=15 -VAR=16 -IDENTIFIER=17 -L_PAREN=18 -R_PAREN=19 -L_CURLY=20 -R_CURLY=21 -L_BRACKET=22 -R_BRACKET=23 -ASSIGN=24 -COMMA=25 -SEMI=26 -COLON=27 -PLUS_PLUS=28 -MINUS_MINUS=29 -DECLARE_ASSIGN=30 -LOGICAL_OR=31 -LOGICAL_AND=32 -SYNC_RETURN=33 -EQUALS=34 -NOT_EQUALS=35 -LESS=36 -LESS_OR_EQUALS=37 -GREATER=38 -GREATER_OR_EQUALS=39 -OR=40 -DIV=41 -MOD=42 -LSHIFT=43 -RSHIFT=44 -BIT_CLEAR=45 -UNDERLYING=46 -EXCLAMATION=47 -PLUS=48 -MINUS=49 -CARET=50 -STAR=51 -AMPERSAND=52 -EMIT=53 -DECIMAL_LIT=54 -BINARY_LIT=55 -OCTAL_LIT=56 -HEX_LIT=57 -FLOAT_LIT=58 -DECIMAL_FLOAT_LIT=59 -HEX_FLOAT_LIT=60 -IMAGINARY_LIT=61 -RUNE_LIT=62 -BYTE_VALUE=63 -OCTAL_BYTE_VALUE=64 -HEX_BYTE_VALUE=65 -LITTLE_U_VALUE=66 -BIG_U_VALUE=67 -RAW_STRING_LIT=68 -INTERPRETED_STRING_LIT=69 -WS=70 -COMMENT=71 -TERMINATOR=72 -LINE_COMMENT=73 -WS_NLSEMI=74 -COMMENT_NLSEMI=75 -LINE_COMMENT_NLSEMI=76 -EOS=77 -OTHER=78 +STRUCT=16 +TYPE=17 +VAR=18 +IDENTIFIER=19 +L_PAREN=20 +R_PAREN=21 +L_CURLY=22 +R_CURLY=23 +L_BRACKET=24 +R_BRACKET=25 +ASSIGN=26 +COMMA=27 +SEMI=28 +COLON=29 +DOT=30 +PLUS_PLUS=31 +MINUS_MINUS=32 +DECLARE_ASSIGN=33 +LOGICAL_OR=34 +LOGICAL_AND=35 +SYNC_RETURN=36 +EQUALS=37 +NOT_EQUALS=38 +LESS=39 +LESS_OR_EQUALS=40 +GREATER=41 +GREATER_OR_EQUALS=42 +OR=43 +DIV=44 +MOD=45 +LSHIFT=46 +RSHIFT=47 +BIT_CLEAR=48 +UNDERLYING=49 +EXCLAMATION=50 +PLUS=51 +MINUS=52 +CARET=53 +STAR=54 +AMPERSAND=55 +EMIT=56 +DECIMAL_LIT=57 +BINARY_LIT=58 +OCTAL_LIT=59 +HEX_LIT=60 +FLOAT_LIT=61 +DECIMAL_FLOAT_LIT=62 +HEX_FLOAT_LIT=63 +IMAGINARY_LIT=64 +RUNE_LIT=65 +BYTE_VALUE=66 +OCTAL_BYTE_VALUE=67 +HEX_BYTE_VALUE=68 +LITTLE_U_VALUE=69 +BIG_U_VALUE=70 +RAW_STRING_LIT=71 +INTERPRETED_STRING_LIT=72 +WS=73 +COMMENT=74 +TERMINATOR=75 +LINE_COMMENT=76 +WS_NLSEMI=77 +COMMENT_NLSEMI=78 +LINE_COMMENT_NLSEMI=79 +EOS=80 +OTHER=81 'as'=1 'async'=2 'break'=3 @@ -91,40 +94,43 @@ OTHER=78 'nil'=13 'return'=14 'sync'=15 -'var'=16 -'('=18 -')'=19 -'{'=20 -'}'=21 -'['=22 -']'=23 -'='=24 -','=25 -';'=26 -':'=27 -'++'=28 -'--'=29 -':='=30 -'||'=31 -'&&'=32 -'<|'=33 -'=='=34 -'!='=35 -'<'=36 -'<='=37 -'>'=38 -'>='=39 -'|'=40 -'/'=41 -'%'=42 -'<<'=43 -'>>'=44 -'&^'=45 -'~'=46 -'!'=47 -'+'=48 -'-'=49 -'^'=50 -'*'=51 -'&'=52 -'<-'=53 +'struct'=16 +'type'=17 +'var'=18 +'('=20 +')'=21 +'{'=22 +'}'=23 +'['=24 +']'=25 +'='=26 +','=27 +';'=28 +':'=29 +'.'=30 +'++'=31 +'--'=32 +':='=33 +'||'=34 +'&&'=35 +'<|'=36 +'=='=37 +'!='=38 +'<'=39 +'<='=40 +'>'=41 +'>='=42 +'|'=43 +'/'=44 +'%'=45 +'<<'=46 +'>>'=47 +'&^'=48 +'~'=49 +'!'=50 +'+'=51 +'-'=52 +'^'=53 +'*'=54 +'&'=55 +'<-'=56 diff --git a/parser/generated/TParser.cpp b/parser/generated/TParser.cpp index 853e5f0..3cfa09f 100644 --- a/parser/generated/TParser.cpp +++ b/parser/generated/TParser.cpp @@ -61,40 +61,41 @@ void tparserParserInitialize() { auto staticData = std::make_unique( std::vector{ "sourceFile", "identifier", "declaration", "constDecl", "constSpec", - "identifierList", "expressionList", "typeSpec", "aliasDecl", "typeDef", - "typeParameters", "typeParameterDecl", "typeElement", "typeTerm", + "identifierList", "expressionList", "typeDecl", "typeSpec", "aliasDecl", + "typeDef", "typeParameters", "typeParameterDecl", "typeElement", "typeTerm", "functionDecl", "varDecl", "varSpec", "block", "statementList", "statement", "simpleStmt", "expressionStmt", "syncReturnStmt", "emitStmt", "incDecStmt", "assignment", "assign_op", "shortVarDecl", "returnStmt", "breakStmt", "continueStmt", "ifStmt", "typeList", "joinStmt", "matchClause", "matchCase", "fromChanAs", "forStmt", "condition", "forClause", "type_", "typeArgs", "typeName", "typeLit", "arrayType", "arrayLength", "elementType", - "asyncChannelType", "syncChannelType", "functionType", "signature", - "result", "parameters", "parameterDecl", "expression", "primaryExpr", - "conversion", "operand", "literal", "basicLit", "integer", "operandName", - "compositeLit", "literalType", "literalValue", "elementList", "keyedElement", - "key", "element", "string_", "functionLit", "index", "arguments", + "sliceType", "asyncChannelType", "syncChannelType", "functionType", + "signature", "result", "parameters", "parameterDecl", "expression", + "primaryExpr", "conversion", "operand", "literal", "basicLit", "integer", + "operandName", "qualifiedIdent", "compositeLit", "literalType", "literalValue", + "elementList", "keyedElement", "key", "element", "structType", "fieldDecl", + "string_", "embeddedField", "functionLit", "index", "slice_", "arguments", "eos" }, std::vector{ "", "'as'", "'async'", "'break'", "'case'", "'const'", "'continue'", "'else'", "'for'", "'from'", "'func'", "'join'", "'if'", "'nil'", - "'return'", "'sync'", "'var'", "", "'('", "')'", "'{'", "'}'", "'['", - "']'", "'='", "','", "';'", "':'", "'++'", "'--'", "':='", "'||'", - "'&&'", "'<|'", "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", - "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'~'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'return'", "'sync'", "'struct'", "'type'", "'var'", "", "'('", "')'", + "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", + "'--'", "':='", "'||'", "'&&'", "'<|'", "'=='", "'!='", "'<'", "'<='", + "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'~'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }, std::vector{ "", "AS", "ASYNC", "BREAK", "CASE", "CONST", "CONTINUE", "ELSE", "FOR", - "FROM", "FUNC", "JOIN", "IF", "NIL_LIT", "RETURN", "SYNC", "VAR", - "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", - "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "PLUS_PLUS", "MINUS_MINUS", - "DECLARE_ASSIGN", "LOGICAL_OR", "LOGICAL_AND", "SYNC_RETURN", "EQUALS", - "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", - "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", "UNDERLYING", - "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "EMIT", - "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", + "FROM", "FUNC", "JOIN", "IF", "NIL_LIT", "RETURN", "SYNC", "STRUCT", + "TYPE", "VAR", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", + "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", + "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "LOGICAL_OR", "LOGICAL_AND", + "SYNC_RETURN", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", + "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", + "UNDERLYING", "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", + "EMIT", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", @@ -103,7 +104,7 @@ void tparserParserInitialize() { } ); static const int32_t serializedATNSegment[] = { - 4,1,78,654,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2, + 4,1,81,758,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2, 7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7, 14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7, 21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7, @@ -113,216 +114,255 @@ void tparserParserInitialize() { 49,2,50,7,50,2,51,7,51,2,52,7,52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7, 56,2,57,7,57,2,58,7,58,2,59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63,7, 63,2,64,7,64,2,65,7,65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70,7, - 70,2,71,7,71,2,72,7,72,2,73,7,73,1,0,1,0,1,0,3,0,152,8,0,1,0,1,0,5,0, - 156,8,0,10,0,12,0,159,9,0,1,0,1,0,1,1,1,1,1,2,1,2,3,2,167,8,2,1,3,1,3, - 1,3,1,3,1,3,1,3,5,3,175,8,3,10,3,12,3,178,9,3,1,3,3,3,181,8,3,1,4,1,4, - 3,4,185,8,4,1,4,1,4,3,4,189,8,4,1,5,1,5,1,5,5,5,194,8,5,10,5,12,5,197, - 9,5,1,6,1,6,1,6,5,6,202,8,6,10,6,12,6,205,9,6,1,7,1,7,3,7,209,8,7,1,8, - 1,8,3,8,213,8,8,1,8,1,8,1,8,1,9,1,9,3,9,220,8,9,1,9,1,9,1,10,1,10,1,10, - 1,10,5,10,228,8,10,10,10,12,10,231,9,10,1,10,1,10,1,11,1,11,1,11,1,12, - 1,12,1,12,5,12,241,8,12,10,12,12,12,244,9,12,1,13,3,13,247,8,13,1,13, - 1,13,1,14,1,14,1,14,3,14,254,8,14,1,14,1,14,3,14,258,8,14,1,15,1,15,1, - 15,1,15,1,15,1,15,5,15,266,8,15,10,15,12,15,269,9,15,1,15,3,15,272,8, - 15,1,16,1,16,1,16,1,16,3,16,278,8,16,1,16,1,16,3,16,282,8,16,1,17,1,17, - 1,17,1,17,1,18,1,18,1,18,3,18,291,8,18,1,18,1,18,1,18,5,18,296,8,18,10, - 18,12,18,299,9,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19,310, - 8,19,1,20,1,20,1,20,1,20,1,20,1,20,3,20,318,8,20,1,21,1,21,1,22,1,22, - 1,22,1,22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,26, - 3,26,338,8,26,1,26,1,26,1,27,1,27,1,27,1,27,1,28,1,28,3,28,348,8,28,1, - 29,1,29,3,29,352,8,29,1,30,1,30,3,30,356,8,30,1,31,1,31,1,31,1,31,1,31, - 1,31,1,31,1,31,3,31,366,8,31,1,31,1,31,1,31,1,31,3,31,372,8,31,3,31,374, - 8,31,1,32,1,32,3,32,378,8,32,1,32,1,32,1,32,3,32,383,8,32,5,32,385,8, - 32,10,32,12,32,388,9,32,1,33,1,33,1,33,5,33,393,8,33,10,33,12,33,396, - 9,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,5,35,408,8,35, - 10,35,12,35,411,9,35,1,35,1,35,1,36,1,36,1,36,1,36,3,36,419,8,36,1,37, - 1,37,1,37,3,37,424,8,37,1,37,1,37,1,38,1,38,1,39,3,39,431,8,39,1,39,1, - 39,3,39,435,8,39,1,39,1,39,3,39,439,8,39,1,40,1,40,3,40,443,8,40,1,40, - 1,40,1,40,1,40,1,40,3,40,450,8,40,1,41,1,41,1,41,3,41,455,8,41,1,41,1, - 41,1,42,1,42,1,43,1,43,1,43,1,43,3,43,465,8,43,1,44,1,44,1,44,1,44,1, - 44,1,45,1,45,1,46,1,46,1,47,1,47,1,47,1,48,1,48,1,48,1,49,1,49,1,49,1, - 50,1,50,3,50,487,8,50,1,51,1,51,3,51,491,8,51,1,52,1,52,1,52,1,52,5,52, - 497,8,52,10,52,12,52,500,9,52,1,52,3,52,503,8,52,3,52,505,8,52,1,52,1, - 52,1,53,3,53,510,8,53,1,53,1,53,1,54,1,54,1,54,1,54,3,54,518,8,54,1,54, - 1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54, - 1,54,1,54,1,54,5,54,538,8,54,10,54,12,54,541,9,54,1,55,1,55,5,55,545, - 8,55,10,55,12,55,548,9,55,1,56,1,56,1,56,1,56,3,56,554,8,56,1,56,1,56, - 1,57,1,57,1,57,3,57,561,8,57,1,57,1,57,1,57,1,57,3,57,567,8,57,1,58,1, - 58,1,58,3,58,572,8,58,1,59,1,59,1,59,1,59,3,59,578,8,59,1,60,1,60,1,61, - 1,61,1,62,1,62,1,62,1,63,1,63,1,63,3,63,590,8,63,3,63,592,8,63,1,64,1, - 64,1,64,3,64,597,8,64,3,64,599,8,64,1,64,1,64,1,65,1,65,1,65,5,65,606, - 8,65,10,65,12,65,609,9,65,1,66,1,66,1,66,3,66,614,8,66,1,66,1,66,1,67, - 1,67,3,67,620,8,67,1,68,1,68,3,68,624,8,68,1,69,1,69,1,70,1,70,1,70,1, - 70,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,3,72,641,8,72,3,72,643, - 8,72,1,72,3,72,646,8,72,3,72,648,8,72,1,72,1,72,1,73,1,73,1,73,0,1,108, - 74,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46, - 48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92, - 94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128, - 130,132,134,136,138,140,142,144,146,0,10,1,0,28,29,2,0,40,45,48,52,2, - 0,26,26,77,77,1,0,47,52,2,0,41,45,51,52,2,0,40,40,48,50,1,0,34,39,2,0, - 54,57,61,62,1,0,68,69,2,1,26,26,77,77,678,0,157,1,0,0,0,2,162,1,0,0,0, - 4,166,1,0,0,0,6,168,1,0,0,0,8,182,1,0,0,0,10,190,1,0,0,0,12,198,1,0,0, - 0,14,208,1,0,0,0,16,210,1,0,0,0,18,217,1,0,0,0,20,223,1,0,0,0,22,234, - 1,0,0,0,24,237,1,0,0,0,26,246,1,0,0,0,28,250,1,0,0,0,30,259,1,0,0,0,32, - 273,1,0,0,0,34,283,1,0,0,0,36,297,1,0,0,0,38,309,1,0,0,0,40,317,1,0,0, - 0,42,319,1,0,0,0,44,321,1,0,0,0,46,325,1,0,0,0,48,329,1,0,0,0,50,332, - 1,0,0,0,52,337,1,0,0,0,54,341,1,0,0,0,56,345,1,0,0,0,58,349,1,0,0,0,60, - 353,1,0,0,0,62,357,1,0,0,0,64,377,1,0,0,0,66,389,1,0,0,0,68,399,1,0,0, - 0,70,403,1,0,0,0,72,414,1,0,0,0,74,420,1,0,0,0,76,427,1,0,0,0,78,430, - 1,0,0,0,80,449,1,0,0,0,82,451,1,0,0,0,84,458,1,0,0,0,86,464,1,0,0,0,88, - 466,1,0,0,0,90,471,1,0,0,0,92,473,1,0,0,0,94,475,1,0,0,0,96,478,1,0,0, - 0,98,481,1,0,0,0,100,484,1,0,0,0,102,490,1,0,0,0,104,492,1,0,0,0,106, - 509,1,0,0,0,108,517,1,0,0,0,110,542,1,0,0,0,112,549,1,0,0,0,114,566,1, - 0,0,0,116,571,1,0,0,0,118,577,1,0,0,0,120,579,1,0,0,0,122,581,1,0,0,0, - 124,583,1,0,0,0,126,591,1,0,0,0,128,593,1,0,0,0,130,602,1,0,0,0,132,613, - 1,0,0,0,134,619,1,0,0,0,136,623,1,0,0,0,138,625,1,0,0,0,140,627,1,0,0, - 0,142,631,1,0,0,0,144,635,1,0,0,0,146,651,1,0,0,0,148,152,3,28,14,0,149, - 152,3,4,2,0,150,152,3,38,19,0,151,148,1,0,0,0,151,149,1,0,0,0,151,150, - 1,0,0,0,152,153,1,0,0,0,153,154,3,146,73,0,154,156,1,0,0,0,155,151,1, - 0,0,0,156,159,1,0,0,0,157,155,1,0,0,0,157,158,1,0,0,0,158,160,1,0,0,0, - 159,157,1,0,0,0,160,161,5,0,0,1,161,1,1,0,0,0,162,163,5,17,0,0,163,3, - 1,0,0,0,164,167,3,6,3,0,165,167,3,30,15,0,166,164,1,0,0,0,166,165,1,0, - 0,0,167,5,1,0,0,0,168,180,5,5,0,0,169,181,3,8,4,0,170,176,5,18,0,0,171, - 172,3,8,4,0,172,173,3,146,73,0,173,175,1,0,0,0,174,171,1,0,0,0,175,178, - 1,0,0,0,176,174,1,0,0,0,176,177,1,0,0,0,177,179,1,0,0,0,178,176,1,0,0, - 0,179,181,5,19,0,0,180,169,1,0,0,0,180,170,1,0,0,0,181,7,1,0,0,0,182, - 188,3,10,5,0,183,185,3,80,40,0,184,183,1,0,0,0,184,185,1,0,0,0,185,186, - 1,0,0,0,186,187,5,24,0,0,187,189,3,12,6,0,188,184,1,0,0,0,188,189,1,0, - 0,0,189,9,1,0,0,0,190,195,5,17,0,0,191,192,5,25,0,0,192,194,5,17,0,0, - 193,191,1,0,0,0,194,197,1,0,0,0,195,193,1,0,0,0,195,196,1,0,0,0,196,11, - 1,0,0,0,197,195,1,0,0,0,198,203,3,108,54,0,199,200,5,25,0,0,200,202,3, - 108,54,0,201,199,1,0,0,0,202,205,1,0,0,0,203,201,1,0,0,0,203,204,1,0, - 0,0,204,13,1,0,0,0,205,203,1,0,0,0,206,209,3,16,8,0,207,209,3,18,9,0, - 208,206,1,0,0,0,208,207,1,0,0,0,209,15,1,0,0,0,210,212,5,17,0,0,211,213, - 3,20,10,0,212,211,1,0,0,0,212,213,1,0,0,0,213,214,1,0,0,0,214,215,5,24, - 0,0,215,216,3,80,40,0,216,17,1,0,0,0,217,219,5,17,0,0,218,220,3,20,10, - 0,219,218,1,0,0,0,219,220,1,0,0,0,220,221,1,0,0,0,221,222,3,80,40,0,222, - 19,1,0,0,0,223,224,5,22,0,0,224,229,3,22,11,0,225,226,5,25,0,0,226,228, - 3,22,11,0,227,225,1,0,0,0,228,231,1,0,0,0,229,227,1,0,0,0,229,230,1,0, - 0,0,230,232,1,0,0,0,231,229,1,0,0,0,232,233,5,23,0,0,233,21,1,0,0,0,234, - 235,3,10,5,0,235,236,3,24,12,0,236,23,1,0,0,0,237,242,3,26,13,0,238,239, - 5,40,0,0,239,241,3,26,13,0,240,238,1,0,0,0,241,244,1,0,0,0,242,240,1, - 0,0,0,242,243,1,0,0,0,243,25,1,0,0,0,244,242,1,0,0,0,245,247,5,46,0,0, - 246,245,1,0,0,0,246,247,1,0,0,0,247,248,1,0,0,0,248,249,3,80,40,0,249, - 27,1,0,0,0,250,251,5,10,0,0,251,253,5,17,0,0,252,254,3,20,10,0,253,252, - 1,0,0,0,253,254,1,0,0,0,254,255,1,0,0,0,255,257,3,100,50,0,256,258,3, - 34,17,0,257,256,1,0,0,0,257,258,1,0,0,0,258,29,1,0,0,0,259,271,5,16,0, - 0,260,272,3,32,16,0,261,267,5,18,0,0,262,263,3,32,16,0,263,264,3,146, - 73,0,264,266,1,0,0,0,265,262,1,0,0,0,266,269,1,0,0,0,267,265,1,0,0,0, - 267,268,1,0,0,0,268,270,1,0,0,0,269,267,1,0,0,0,270,272,5,19,0,0,271, - 260,1,0,0,0,271,261,1,0,0,0,272,31,1,0,0,0,273,281,3,10,5,0,274,277,3, - 80,40,0,275,276,5,24,0,0,276,278,3,12,6,0,277,275,1,0,0,0,277,278,1,0, - 0,0,278,282,1,0,0,0,279,280,5,24,0,0,280,282,3,12,6,0,281,274,1,0,0,0, - 281,279,1,0,0,0,282,33,1,0,0,0,283,284,5,20,0,0,284,285,3,36,18,0,285, - 286,5,21,0,0,286,35,1,0,0,0,287,291,5,26,0,0,288,291,5,77,0,0,289,291, - 1,0,0,0,290,287,1,0,0,0,290,288,1,0,0,0,290,289,1,0,0,0,291,292,1,0,0, - 0,292,293,3,38,19,0,293,294,3,146,73,0,294,296,1,0,0,0,295,290,1,0,0, - 0,296,299,1,0,0,0,297,295,1,0,0,0,297,298,1,0,0,0,298,37,1,0,0,0,299, - 297,1,0,0,0,300,310,3,4,2,0,301,310,3,40,20,0,302,310,3,56,28,0,303,310, - 3,58,29,0,304,310,3,60,30,0,305,310,3,34,17,0,306,310,3,62,31,0,307,310, - 3,66,33,0,308,310,3,74,37,0,309,300,1,0,0,0,309,301,1,0,0,0,309,302,1, - 0,0,0,309,303,1,0,0,0,309,304,1,0,0,0,309,305,1,0,0,0,309,306,1,0,0,0, - 309,307,1,0,0,0,309,308,1,0,0,0,310,39,1,0,0,0,311,318,3,46,23,0,312, - 318,3,44,22,0,313,318,3,48,24,0,314,318,3,50,25,0,315,318,3,42,21,0,316, - 318,3,54,27,0,317,311,1,0,0,0,317,312,1,0,0,0,317,313,1,0,0,0,317,314, - 1,0,0,0,317,315,1,0,0,0,317,316,1,0,0,0,318,41,1,0,0,0,319,320,3,108, - 54,0,320,43,1,0,0,0,321,322,3,108,54,0,322,323,5,33,0,0,323,324,3,108, - 54,0,324,45,1,0,0,0,325,326,3,108,54,0,326,327,5,53,0,0,327,328,3,108, - 54,0,328,47,1,0,0,0,329,330,3,108,54,0,330,331,7,0,0,0,331,49,1,0,0,0, - 332,333,3,12,6,0,333,334,3,52,26,0,334,335,3,12,6,0,335,51,1,0,0,0,336, - 338,7,1,0,0,337,336,1,0,0,0,337,338,1,0,0,0,338,339,1,0,0,0,339,340,5, - 24,0,0,340,53,1,0,0,0,341,342,3,10,5,0,342,343,5,30,0,0,343,344,3,12, - 6,0,344,55,1,0,0,0,345,347,5,14,0,0,346,348,3,12,6,0,347,346,1,0,0,0, - 347,348,1,0,0,0,348,57,1,0,0,0,349,351,5,3,0,0,350,352,5,17,0,0,351,350, - 1,0,0,0,351,352,1,0,0,0,352,59,1,0,0,0,353,355,5,6,0,0,354,356,5,17,0, - 0,355,354,1,0,0,0,355,356,1,0,0,0,356,61,1,0,0,0,357,365,5,12,0,0,358, - 366,3,108,54,0,359,360,7,2,0,0,360,366,3,108,54,0,361,362,3,40,20,0,362, - 363,7,2,0,0,363,364,3,108,54,0,364,366,1,0,0,0,365,358,1,0,0,0,365,359, - 1,0,0,0,365,361,1,0,0,0,366,367,1,0,0,0,367,373,3,34,17,0,368,371,5,7, - 0,0,369,372,3,62,31,0,370,372,3,34,17,0,371,369,1,0,0,0,371,370,1,0,0, - 0,372,374,1,0,0,0,373,368,1,0,0,0,373,374,1,0,0,0,374,63,1,0,0,0,375, - 378,3,80,40,0,376,378,5,13,0,0,377,375,1,0,0,0,377,376,1,0,0,0,378,386, - 1,0,0,0,379,382,5,25,0,0,380,383,3,80,40,0,381,383,5,13,0,0,382,380,1, - 0,0,0,382,381,1,0,0,0,383,385,1,0,0,0,384,379,1,0,0,0,385,388,1,0,0,0, - 386,384,1,0,0,0,386,387,1,0,0,0,387,65,1,0,0,0,388,386,1,0,0,0,389,390, - 5,11,0,0,390,394,5,20,0,0,391,393,3,68,34,0,392,391,1,0,0,0,393,396,1, - 0,0,0,394,392,1,0,0,0,394,395,1,0,0,0,395,397,1,0,0,0,396,394,1,0,0,0, - 397,398,5,21,0,0,398,67,1,0,0,0,399,400,3,70,35,0,400,401,5,27,0,0,401, - 402,3,36,18,0,402,69,1,0,0,0,403,409,5,4,0,0,404,405,3,72,36,0,405,406, - 5,25,0,0,406,408,1,0,0,0,407,404,1,0,0,0,408,411,1,0,0,0,409,407,1,0, - 0,0,409,410,1,0,0,0,410,412,1,0,0,0,411,409,1,0,0,0,412,413,3,72,36,0, - 413,71,1,0,0,0,414,415,5,9,0,0,415,418,5,17,0,0,416,417,5,1,0,0,417,419, - 5,17,0,0,418,416,1,0,0,0,418,419,1,0,0,0,419,73,1,0,0,0,420,423,5,8,0, - 0,421,424,3,76,38,0,422,424,3,78,39,0,423,421,1,0,0,0,423,422,1,0,0,0, - 423,424,1,0,0,0,424,425,1,0,0,0,425,426,3,34,17,0,426,75,1,0,0,0,427, - 428,3,108,54,0,428,77,1,0,0,0,429,431,3,40,20,0,430,429,1,0,0,0,430,431, - 1,0,0,0,431,432,1,0,0,0,432,434,3,146,73,0,433,435,3,108,54,0,434,433, - 1,0,0,0,434,435,1,0,0,0,435,436,1,0,0,0,436,438,3,146,73,0,437,439,3, - 40,20,0,438,437,1,0,0,0,438,439,1,0,0,0,439,79,1,0,0,0,440,442,3,84,42, - 0,441,443,3,82,41,0,442,441,1,0,0,0,442,443,1,0,0,0,443,450,1,0,0,0,444, - 450,3,86,43,0,445,446,5,18,0,0,446,447,3,80,40,0,447,448,5,19,0,0,448, - 450,1,0,0,0,449,440,1,0,0,0,449,444,1,0,0,0,449,445,1,0,0,0,450,81,1, - 0,0,0,451,452,5,22,0,0,452,454,3,64,32,0,453,455,5,25,0,0,454,453,1,0, - 0,0,454,455,1,0,0,0,455,456,1,0,0,0,456,457,5,23,0,0,457,83,1,0,0,0,458, - 459,5,17,0,0,459,85,1,0,0,0,460,465,3,88,44,0,461,465,3,98,49,0,462,465, - 3,96,48,0,463,465,3,94,47,0,464,460,1,0,0,0,464,461,1,0,0,0,464,462,1, - 0,0,0,464,463,1,0,0,0,465,87,1,0,0,0,466,467,5,22,0,0,467,468,3,90,45, - 0,468,469,5,23,0,0,469,470,3,92,46,0,470,89,1,0,0,0,471,472,3,108,54, - 0,472,91,1,0,0,0,473,474,3,80,40,0,474,93,1,0,0,0,475,476,5,2,0,0,476, - 477,3,92,46,0,477,95,1,0,0,0,478,479,5,15,0,0,479,480,3,100,50,0,480, - 97,1,0,0,0,481,482,5,10,0,0,482,483,3,100,50,0,483,99,1,0,0,0,484,486, - 3,104,52,0,485,487,3,102,51,0,486,485,1,0,0,0,486,487,1,0,0,0,487,101, - 1,0,0,0,488,491,3,104,52,0,489,491,3,80,40,0,490,488,1,0,0,0,490,489, - 1,0,0,0,491,103,1,0,0,0,492,504,5,18,0,0,493,498,3,106,53,0,494,495,5, - 25,0,0,495,497,3,106,53,0,496,494,1,0,0,0,497,500,1,0,0,0,498,496,1,0, - 0,0,498,499,1,0,0,0,499,502,1,0,0,0,500,498,1,0,0,0,501,503,5,25,0,0, - 502,501,1,0,0,0,502,503,1,0,0,0,503,505,1,0,0,0,504,493,1,0,0,0,504,505, - 1,0,0,0,505,506,1,0,0,0,506,507,5,19,0,0,507,105,1,0,0,0,508,510,3,10, - 5,0,509,508,1,0,0,0,509,510,1,0,0,0,510,511,1,0,0,0,511,512,3,80,40,0, - 512,107,1,0,0,0,513,514,6,54,-1,0,514,518,3,110,55,0,515,516,7,3,0,0, - 516,518,3,108,54,7,517,513,1,0,0,0,517,515,1,0,0,0,518,539,1,0,0,0,519, - 520,10,6,0,0,520,521,5,53,0,0,521,538,3,108,54,7,522,523,10,5,0,0,523, - 524,7,4,0,0,524,538,3,108,54,6,525,526,10,4,0,0,526,527,7,5,0,0,527,538, - 3,108,54,5,528,529,10,3,0,0,529,530,7,6,0,0,530,538,3,108,54,4,531,532, - 10,2,0,0,532,533,5,32,0,0,533,538,3,108,54,3,534,535,10,1,0,0,535,536, - 5,31,0,0,536,538,3,108,54,2,537,519,1,0,0,0,537,522,1,0,0,0,537,525,1, - 0,0,0,537,528,1,0,0,0,537,531,1,0,0,0,537,534,1,0,0,0,538,541,1,0,0,0, - 539,537,1,0,0,0,539,540,1,0,0,0,540,109,1,0,0,0,541,539,1,0,0,0,542,546, - 3,114,57,0,543,545,3,144,72,0,544,543,1,0,0,0,545,548,1,0,0,0,546,544, - 1,0,0,0,546,547,1,0,0,0,547,111,1,0,0,0,548,546,1,0,0,0,549,550,3,80, - 40,0,550,551,5,18,0,0,551,553,3,108,54,0,552,554,5,25,0,0,553,552,1,0, - 0,0,553,554,1,0,0,0,554,555,1,0,0,0,555,556,5,19,0,0,556,113,1,0,0,0, - 557,567,3,116,58,0,558,560,3,122,61,0,559,561,3,82,41,0,560,559,1,0,0, - 0,560,561,1,0,0,0,561,567,1,0,0,0,562,563,5,18,0,0,563,564,3,108,54,0, - 564,565,5,19,0,0,565,567,1,0,0,0,566,557,1,0,0,0,566,558,1,0,0,0,566, - 562,1,0,0,0,567,115,1,0,0,0,568,572,3,118,59,0,569,572,3,124,62,0,570, - 572,3,140,70,0,571,568,1,0,0,0,571,569,1,0,0,0,571,570,1,0,0,0,572,117, - 1,0,0,0,573,578,5,13,0,0,574,578,3,120,60,0,575,578,3,138,69,0,576,578, - 5,58,0,0,577,573,1,0,0,0,577,574,1,0,0,0,577,575,1,0,0,0,577,576,1,0, - 0,0,578,119,1,0,0,0,579,580,7,7,0,0,580,121,1,0,0,0,581,582,5,17,0,0, - 582,123,1,0,0,0,583,584,3,126,63,0,584,585,3,128,64,0,585,125,1,0,0,0, - 586,592,3,88,44,0,587,589,3,84,42,0,588,590,3,82,41,0,589,588,1,0,0,0, - 589,590,1,0,0,0,590,592,1,0,0,0,591,586,1,0,0,0,591,587,1,0,0,0,592,127, - 1,0,0,0,593,598,5,20,0,0,594,596,3,130,65,0,595,597,5,25,0,0,596,595, - 1,0,0,0,596,597,1,0,0,0,597,599,1,0,0,0,598,594,1,0,0,0,598,599,1,0,0, - 0,599,600,1,0,0,0,600,601,5,21,0,0,601,129,1,0,0,0,602,607,3,132,66,0, - 603,604,5,25,0,0,604,606,3,132,66,0,605,603,1,0,0,0,606,609,1,0,0,0,607, - 605,1,0,0,0,607,608,1,0,0,0,608,131,1,0,0,0,609,607,1,0,0,0,610,611,3, - 134,67,0,611,612,5,27,0,0,612,614,1,0,0,0,613,610,1,0,0,0,613,614,1,0, - 0,0,614,615,1,0,0,0,615,616,3,136,68,0,616,133,1,0,0,0,617,620,3,108, - 54,0,618,620,3,128,64,0,619,617,1,0,0,0,619,618,1,0,0,0,620,135,1,0,0, - 0,621,624,3,108,54,0,622,624,3,128,64,0,623,621,1,0,0,0,623,622,1,0,0, - 0,624,137,1,0,0,0,625,626,7,8,0,0,626,139,1,0,0,0,627,628,5,10,0,0,628, - 629,3,100,50,0,629,630,3,34,17,0,630,141,1,0,0,0,631,632,5,22,0,0,632, - 633,3,108,54,0,633,634,5,23,0,0,634,143,1,0,0,0,635,647,5,18,0,0,636, - 643,3,12,6,0,637,640,3,80,40,0,638,639,5,25,0,0,639,641,3,12,6,0,640, - 638,1,0,0,0,640,641,1,0,0,0,641,643,1,0,0,0,642,636,1,0,0,0,642,637,1, - 0,0,0,643,645,1,0,0,0,644,646,5,25,0,0,645,644,1,0,0,0,645,646,1,0,0, - 0,646,648,1,0,0,0,647,642,1,0,0,0,647,648,1,0,0,0,648,649,1,0,0,0,649, - 650,5,19,0,0,650,145,1,0,0,0,651,652,7,9,0,0,652,147,1,0,0,0,73,151,157, - 166,176,180,184,188,195,203,208,212,219,229,242,246,253,257,267,271,277, - 281,290,297,309,317,337,347,351,355,365,371,373,377,382,386,394,409,418, - 423,430,434,438,442,449,454,464,486,490,498,502,504,509,517,537,539,546, - 553,560,566,571,577,589,591,596,598,607,613,619,623,640,642,645,647 + 70,2,71,7,71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7, + 77,2,78,7,78,2,79,7,79,2,80,7,80,1,0,1,0,1,0,3,0,166,8,0,1,0,1,0,5,0, + 170,8,0,10,0,12,0,173,9,0,1,0,1,0,1,1,1,1,1,2,1,2,1,2,3,2,182,8,2,1,3, + 1,3,1,3,1,3,1,3,1,3,5,3,190,8,3,10,3,12,3,193,9,3,1,3,3,3,196,8,3,1,4, + 1,4,3,4,200,8,4,1,4,1,4,3,4,204,8,4,1,5,1,5,1,5,5,5,209,8,5,10,5,12,5, + 212,9,5,1,6,1,6,1,6,5,6,217,8,6,10,6,12,6,220,9,6,1,7,1,7,1,7,1,7,1,7, + 1,7,5,7,228,8,7,10,7,12,7,231,9,7,1,7,3,7,234,8,7,1,8,1,8,3,8,238,8,8, + 1,9,1,9,3,9,242,8,9,1,9,1,9,1,9,1,10,1,10,3,10,249,8,10,1,10,1,10,1,11, + 1,11,1,11,1,11,5,11,257,8,11,10,11,12,11,260,9,11,1,11,1,11,1,12,1,12, + 1,12,1,13,1,13,1,13,5,13,270,8,13,10,13,12,13,273,9,13,1,14,3,14,276, + 8,14,1,14,1,14,1,15,1,15,1,15,3,15,283,8,15,1,15,1,15,3,15,287,8,15,1, + 16,1,16,1,16,1,16,1,16,1,16,5,16,295,8,16,10,16,12,16,298,9,16,1,16,3, + 16,301,8,16,1,17,1,17,1,17,1,17,3,17,307,8,17,1,17,1,17,3,17,311,8,17, + 1,18,1,18,1,18,1,18,1,19,1,19,1,19,3,19,320,8,19,1,19,1,19,1,19,5,19, + 325,8,19,10,19,12,19,328,9,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,3,20,339,8,20,1,21,1,21,1,21,1,21,1,21,1,21,3,21,347,8,21,1,22,1, + 22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,26,1,26,1, + 26,1,26,1,27,3,27,367,8,27,1,27,1,27,1,28,1,28,1,28,1,28,1,29,1,29,3, + 29,377,8,29,1,30,1,30,3,30,381,8,30,1,31,1,31,3,31,385,8,31,1,32,1,32, + 1,32,1,32,1,32,1,32,1,32,1,32,3,32,395,8,32,1,32,1,32,1,32,1,32,3,32, + 401,8,32,3,32,403,8,32,1,33,1,33,3,33,407,8,33,1,33,1,33,1,33,3,33,412, + 8,33,5,33,414,8,33,10,33,12,33,417,9,33,1,34,1,34,1,34,5,34,422,8,34, + 10,34,12,34,425,9,34,1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36, + 5,36,437,8,36,10,36,12,36,440,9,36,1,36,1,36,1,37,1,37,1,37,1,37,3,37, + 448,8,37,1,38,1,38,1,38,3,38,453,8,38,1,38,1,38,1,39,1,39,1,40,3,40,460, + 8,40,1,40,1,40,3,40,464,8,40,1,40,1,40,3,40,468,8,40,1,41,1,41,3,41,472, + 8,41,1,41,1,41,1,41,1,41,1,41,3,41,479,8,41,1,42,1,42,1,42,3,42,484,8, + 42,1,42,1,42,1,43,1,43,3,43,490,8,43,1,44,1,44,1,44,1,44,1,44,1,44,3, + 44,498,8,44,1,45,1,45,3,45,502,8,45,1,45,1,45,1,45,1,46,1,46,1,47,1,47, + 1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,50,1,51,1,51,1,51,1,52, + 1,52,3,52,526,8,52,1,53,1,53,3,53,530,8,53,1,54,1,54,1,54,1,54,5,54,536, + 8,54,10,54,12,54,539,9,54,1,54,3,54,542,8,54,3,54,544,8,54,1,54,1,54, + 1,55,3,55,549,8,55,1,55,1,55,1,56,1,56,1,56,1,56,3,56,557,8,56,1,56,1, + 56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1, + 56,1,56,1,56,5,56,577,8,56,10,56,12,56,580,9,56,1,57,1,57,1,57,5,57,585, + 8,57,10,57,12,57,588,9,57,1,57,1,57,1,57,5,57,593,8,57,10,57,12,57,596, + 9,57,1,58,1,58,1,58,1,58,3,58,602,8,58,1,58,1,58,1,59,1,59,1,59,3,59, + 609,8,59,1,59,1,59,1,59,1,59,3,59,615,8,59,1,60,1,60,1,60,3,60,620,8, + 60,1,61,1,61,1,61,1,61,3,61,626,8,61,1,62,1,62,1,63,1,63,3,63,632,8,63, + 1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,3,66,646, + 8,66,3,66,648,8,66,1,67,1,67,1,67,3,67,653,8,67,3,67,655,8,67,1,67,1, + 67,1,68,1,68,1,68,5,68,662,8,68,10,68,12,68,665,9,68,1,69,1,69,1,69,3, + 69,670,8,69,1,69,1,69,1,70,1,70,3,70,676,8,70,1,71,1,71,3,71,680,8,71, + 1,72,1,72,1,72,1,72,1,72,5,72,687,8,72,10,72,12,72,690,9,72,1,72,1,72, + 1,73,1,73,1,73,1,73,3,73,698,8,73,1,73,3,73,701,8,73,1,74,1,74,1,75,3, + 75,706,8,75,1,75,1,75,3,75,710,8,75,1,76,1,76,1,76,1,76,1,77,1,77,1,77, + 1,77,1,78,1,78,3,78,722,8,78,1,78,1,78,3,78,726,8,78,1,78,3,78,729,8, + 78,1,78,1,78,1,78,1,78,1,78,3,78,736,8,78,1,78,1,78,1,79,1,79,1,79,1, + 79,1,79,3,79,745,8,79,3,79,747,8,79,1,79,3,79,750,8,79,3,79,752,8,79, + 1,79,1,79,1,80,1,80,1,80,0,1,112,81,0,2,4,6,8,10,12,14,16,18,20,22,24, + 26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70, + 72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112, + 114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148, + 150,152,154,156,158,160,0,10,1,0,31,32,2,0,43,48,51,55,2,0,28,28,80,80, + 1,0,50,55,2,0,44,48,54,55,2,0,43,43,51,53,1,0,37,42,2,0,57,60,64,65,1, + 0,71,72,2,1,28,28,80,80,798,0,171,1,0,0,0,2,176,1,0,0,0,4,181,1,0,0,0, + 6,183,1,0,0,0,8,197,1,0,0,0,10,205,1,0,0,0,12,213,1,0,0,0,14,221,1,0, + 0,0,16,237,1,0,0,0,18,239,1,0,0,0,20,246,1,0,0,0,22,252,1,0,0,0,24,263, + 1,0,0,0,26,266,1,0,0,0,28,275,1,0,0,0,30,279,1,0,0,0,32,288,1,0,0,0,34, + 302,1,0,0,0,36,312,1,0,0,0,38,326,1,0,0,0,40,338,1,0,0,0,42,346,1,0,0, + 0,44,348,1,0,0,0,46,350,1,0,0,0,48,354,1,0,0,0,50,358,1,0,0,0,52,361, + 1,0,0,0,54,366,1,0,0,0,56,370,1,0,0,0,58,374,1,0,0,0,60,378,1,0,0,0,62, + 382,1,0,0,0,64,386,1,0,0,0,66,406,1,0,0,0,68,418,1,0,0,0,70,428,1,0,0, + 0,72,432,1,0,0,0,74,443,1,0,0,0,76,449,1,0,0,0,78,456,1,0,0,0,80,459, + 1,0,0,0,82,478,1,0,0,0,84,480,1,0,0,0,86,489,1,0,0,0,88,497,1,0,0,0,90, + 499,1,0,0,0,92,506,1,0,0,0,94,508,1,0,0,0,96,510,1,0,0,0,98,514,1,0,0, + 0,100,517,1,0,0,0,102,520,1,0,0,0,104,523,1,0,0,0,106,529,1,0,0,0,108, + 531,1,0,0,0,110,548,1,0,0,0,112,556,1,0,0,0,114,581,1,0,0,0,116,597,1, + 0,0,0,118,614,1,0,0,0,120,619,1,0,0,0,122,625,1,0,0,0,124,627,1,0,0,0, + 126,631,1,0,0,0,128,633,1,0,0,0,130,637,1,0,0,0,132,647,1,0,0,0,134,649, + 1,0,0,0,136,658,1,0,0,0,138,669,1,0,0,0,140,675,1,0,0,0,142,679,1,0,0, + 0,144,681,1,0,0,0,146,697,1,0,0,0,148,702,1,0,0,0,150,705,1,0,0,0,152, + 711,1,0,0,0,154,715,1,0,0,0,156,719,1,0,0,0,158,739,1,0,0,0,160,755,1, + 0,0,0,162,166,3,30,15,0,163,166,3,4,2,0,164,166,3,40,20,0,165,162,1,0, + 0,0,165,163,1,0,0,0,165,164,1,0,0,0,166,167,1,0,0,0,167,168,3,160,80, + 0,168,170,1,0,0,0,169,165,1,0,0,0,170,173,1,0,0,0,171,169,1,0,0,0,171, + 172,1,0,0,0,172,174,1,0,0,0,173,171,1,0,0,0,174,175,5,0,0,1,175,1,1,0, + 0,0,176,177,5,19,0,0,177,3,1,0,0,0,178,182,3,6,3,0,179,182,3,14,7,0,180, + 182,3,32,16,0,181,178,1,0,0,0,181,179,1,0,0,0,181,180,1,0,0,0,182,5,1, + 0,0,0,183,195,5,5,0,0,184,196,3,8,4,0,185,191,5,20,0,0,186,187,3,8,4, + 0,187,188,3,160,80,0,188,190,1,0,0,0,189,186,1,0,0,0,190,193,1,0,0,0, + 191,189,1,0,0,0,191,192,1,0,0,0,192,194,1,0,0,0,193,191,1,0,0,0,194,196, + 5,21,0,0,195,184,1,0,0,0,195,185,1,0,0,0,196,7,1,0,0,0,197,203,3,10,5, + 0,198,200,3,82,41,0,199,198,1,0,0,0,199,200,1,0,0,0,200,201,1,0,0,0,201, + 202,5,26,0,0,202,204,3,12,6,0,203,199,1,0,0,0,203,204,1,0,0,0,204,9,1, + 0,0,0,205,210,5,19,0,0,206,207,5,27,0,0,207,209,5,19,0,0,208,206,1,0, + 0,0,209,212,1,0,0,0,210,208,1,0,0,0,210,211,1,0,0,0,211,11,1,0,0,0,212, + 210,1,0,0,0,213,218,3,112,56,0,214,215,5,27,0,0,215,217,3,112,56,0,216, + 214,1,0,0,0,217,220,1,0,0,0,218,216,1,0,0,0,218,219,1,0,0,0,219,13,1, + 0,0,0,220,218,1,0,0,0,221,233,5,17,0,0,222,234,3,16,8,0,223,229,5,20, + 0,0,224,225,3,16,8,0,225,226,3,160,80,0,226,228,1,0,0,0,227,224,1,0,0, + 0,228,231,1,0,0,0,229,227,1,0,0,0,229,230,1,0,0,0,230,232,1,0,0,0,231, + 229,1,0,0,0,232,234,5,21,0,0,233,222,1,0,0,0,233,223,1,0,0,0,234,15,1, + 0,0,0,235,238,3,18,9,0,236,238,3,20,10,0,237,235,1,0,0,0,237,236,1,0, + 0,0,238,17,1,0,0,0,239,241,5,19,0,0,240,242,3,22,11,0,241,240,1,0,0,0, + 241,242,1,0,0,0,242,243,1,0,0,0,243,244,5,26,0,0,244,245,3,82,41,0,245, + 19,1,0,0,0,246,248,5,19,0,0,247,249,3,22,11,0,248,247,1,0,0,0,248,249, + 1,0,0,0,249,250,1,0,0,0,250,251,3,82,41,0,251,21,1,0,0,0,252,253,5,24, + 0,0,253,258,3,24,12,0,254,255,5,27,0,0,255,257,3,24,12,0,256,254,1,0, + 0,0,257,260,1,0,0,0,258,256,1,0,0,0,258,259,1,0,0,0,259,261,1,0,0,0,260, + 258,1,0,0,0,261,262,5,25,0,0,262,23,1,0,0,0,263,264,3,10,5,0,264,265, + 3,26,13,0,265,25,1,0,0,0,266,271,3,28,14,0,267,268,5,43,0,0,268,270,3, + 28,14,0,269,267,1,0,0,0,270,273,1,0,0,0,271,269,1,0,0,0,271,272,1,0,0, + 0,272,27,1,0,0,0,273,271,1,0,0,0,274,276,5,49,0,0,275,274,1,0,0,0,275, + 276,1,0,0,0,276,277,1,0,0,0,277,278,3,82,41,0,278,29,1,0,0,0,279,280, + 5,10,0,0,280,282,5,19,0,0,281,283,3,22,11,0,282,281,1,0,0,0,282,283,1, + 0,0,0,283,284,1,0,0,0,284,286,3,104,52,0,285,287,3,36,18,0,286,285,1, + 0,0,0,286,287,1,0,0,0,287,31,1,0,0,0,288,300,5,18,0,0,289,301,3,34,17, + 0,290,296,5,20,0,0,291,292,3,34,17,0,292,293,3,160,80,0,293,295,1,0,0, + 0,294,291,1,0,0,0,295,298,1,0,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297, + 299,1,0,0,0,298,296,1,0,0,0,299,301,5,21,0,0,300,289,1,0,0,0,300,290, + 1,0,0,0,301,33,1,0,0,0,302,310,3,10,5,0,303,306,3,82,41,0,304,305,5,26, + 0,0,305,307,3,12,6,0,306,304,1,0,0,0,306,307,1,0,0,0,307,311,1,0,0,0, + 308,309,5,26,0,0,309,311,3,12,6,0,310,303,1,0,0,0,310,308,1,0,0,0,311, + 35,1,0,0,0,312,313,5,22,0,0,313,314,3,38,19,0,314,315,5,23,0,0,315,37, + 1,0,0,0,316,320,5,28,0,0,317,320,5,80,0,0,318,320,1,0,0,0,319,316,1,0, + 0,0,319,317,1,0,0,0,319,318,1,0,0,0,320,321,1,0,0,0,321,322,3,40,20,0, + 322,323,3,160,80,0,323,325,1,0,0,0,324,319,1,0,0,0,325,328,1,0,0,0,326, + 324,1,0,0,0,326,327,1,0,0,0,327,39,1,0,0,0,328,326,1,0,0,0,329,339,3, + 4,2,0,330,339,3,42,21,0,331,339,3,58,29,0,332,339,3,60,30,0,333,339,3, + 62,31,0,334,339,3,36,18,0,335,339,3,64,32,0,336,339,3,68,34,0,337,339, + 3,76,38,0,338,329,1,0,0,0,338,330,1,0,0,0,338,331,1,0,0,0,338,332,1,0, + 0,0,338,333,1,0,0,0,338,334,1,0,0,0,338,335,1,0,0,0,338,336,1,0,0,0,338, + 337,1,0,0,0,339,41,1,0,0,0,340,347,3,48,24,0,341,347,3,46,23,0,342,347, + 3,50,25,0,343,347,3,52,26,0,344,347,3,44,22,0,345,347,3,56,28,0,346,340, + 1,0,0,0,346,341,1,0,0,0,346,342,1,0,0,0,346,343,1,0,0,0,346,344,1,0,0, + 0,346,345,1,0,0,0,347,43,1,0,0,0,348,349,3,112,56,0,349,45,1,0,0,0,350, + 351,3,112,56,0,351,352,5,36,0,0,352,353,3,112,56,0,353,47,1,0,0,0,354, + 355,3,112,56,0,355,356,5,56,0,0,356,357,3,112,56,0,357,49,1,0,0,0,358, + 359,3,112,56,0,359,360,7,0,0,0,360,51,1,0,0,0,361,362,3,12,6,0,362,363, + 3,54,27,0,363,364,3,12,6,0,364,53,1,0,0,0,365,367,7,1,0,0,366,365,1,0, + 0,0,366,367,1,0,0,0,367,368,1,0,0,0,368,369,5,26,0,0,369,55,1,0,0,0,370, + 371,3,10,5,0,371,372,5,33,0,0,372,373,3,12,6,0,373,57,1,0,0,0,374,376, + 5,14,0,0,375,377,3,12,6,0,376,375,1,0,0,0,376,377,1,0,0,0,377,59,1,0, + 0,0,378,380,5,3,0,0,379,381,5,19,0,0,380,379,1,0,0,0,380,381,1,0,0,0, + 381,61,1,0,0,0,382,384,5,6,0,0,383,385,5,19,0,0,384,383,1,0,0,0,384,385, + 1,0,0,0,385,63,1,0,0,0,386,394,5,12,0,0,387,395,3,112,56,0,388,389,7, + 2,0,0,389,395,3,112,56,0,390,391,3,42,21,0,391,392,7,2,0,0,392,393,3, + 112,56,0,393,395,1,0,0,0,394,387,1,0,0,0,394,388,1,0,0,0,394,390,1,0, + 0,0,395,396,1,0,0,0,396,402,3,36,18,0,397,400,5,7,0,0,398,401,3,64,32, + 0,399,401,3,36,18,0,400,398,1,0,0,0,400,399,1,0,0,0,401,403,1,0,0,0,402, + 397,1,0,0,0,402,403,1,0,0,0,403,65,1,0,0,0,404,407,3,82,41,0,405,407, + 5,13,0,0,406,404,1,0,0,0,406,405,1,0,0,0,407,415,1,0,0,0,408,411,5,27, + 0,0,409,412,3,82,41,0,410,412,5,13,0,0,411,409,1,0,0,0,411,410,1,0,0, + 0,412,414,1,0,0,0,413,408,1,0,0,0,414,417,1,0,0,0,415,413,1,0,0,0,415, + 416,1,0,0,0,416,67,1,0,0,0,417,415,1,0,0,0,418,419,5,11,0,0,419,423,5, + 22,0,0,420,422,3,70,35,0,421,420,1,0,0,0,422,425,1,0,0,0,423,421,1,0, + 0,0,423,424,1,0,0,0,424,426,1,0,0,0,425,423,1,0,0,0,426,427,5,23,0,0, + 427,69,1,0,0,0,428,429,3,72,36,0,429,430,5,29,0,0,430,431,3,38,19,0,431, + 71,1,0,0,0,432,438,5,4,0,0,433,434,3,74,37,0,434,435,5,27,0,0,435,437, + 1,0,0,0,436,433,1,0,0,0,437,440,1,0,0,0,438,436,1,0,0,0,438,439,1,0,0, + 0,439,441,1,0,0,0,440,438,1,0,0,0,441,442,3,74,37,0,442,73,1,0,0,0,443, + 444,5,9,0,0,444,447,5,19,0,0,445,446,5,1,0,0,446,448,5,19,0,0,447,445, + 1,0,0,0,447,448,1,0,0,0,448,75,1,0,0,0,449,452,5,8,0,0,450,453,3,78,39, + 0,451,453,3,80,40,0,452,450,1,0,0,0,452,451,1,0,0,0,452,453,1,0,0,0,453, + 454,1,0,0,0,454,455,3,36,18,0,455,77,1,0,0,0,456,457,3,112,56,0,457,79, + 1,0,0,0,458,460,3,42,21,0,459,458,1,0,0,0,459,460,1,0,0,0,460,461,1,0, + 0,0,461,463,3,160,80,0,462,464,3,112,56,0,463,462,1,0,0,0,463,464,1,0, + 0,0,464,465,1,0,0,0,465,467,3,160,80,0,466,468,3,42,21,0,467,466,1,0, + 0,0,467,468,1,0,0,0,468,81,1,0,0,0,469,471,3,86,43,0,470,472,3,84,42, + 0,471,470,1,0,0,0,471,472,1,0,0,0,472,479,1,0,0,0,473,479,3,88,44,0,474, + 475,5,20,0,0,475,476,3,82,41,0,476,477,5,21,0,0,477,479,1,0,0,0,478,469, + 1,0,0,0,478,473,1,0,0,0,478,474,1,0,0,0,479,83,1,0,0,0,480,481,5,24,0, + 0,481,483,3,66,33,0,482,484,5,27,0,0,483,482,1,0,0,0,483,484,1,0,0,0, + 484,485,1,0,0,0,485,486,5,25,0,0,486,85,1,0,0,0,487,490,3,128,64,0,488, + 490,5,19,0,0,489,487,1,0,0,0,489,488,1,0,0,0,490,87,1,0,0,0,491,498,3, + 90,45,0,492,498,3,144,72,0,493,498,3,102,51,0,494,498,3,96,48,0,495,498, + 3,100,50,0,496,498,3,98,49,0,497,491,1,0,0,0,497,492,1,0,0,0,497,493, + 1,0,0,0,497,494,1,0,0,0,497,495,1,0,0,0,497,496,1,0,0,0,498,89,1,0,0, + 0,499,501,5,24,0,0,500,502,3,92,46,0,501,500,1,0,0,0,501,502,1,0,0,0, + 502,503,1,0,0,0,503,504,5,25,0,0,504,505,3,94,47,0,505,91,1,0,0,0,506, + 507,3,112,56,0,507,93,1,0,0,0,508,509,3,82,41,0,509,95,1,0,0,0,510,511, + 5,24,0,0,511,512,5,25,0,0,512,513,3,94,47,0,513,97,1,0,0,0,514,515,5, + 2,0,0,515,516,3,94,47,0,516,99,1,0,0,0,517,518,5,15,0,0,518,519,3,104, + 52,0,519,101,1,0,0,0,520,521,5,10,0,0,521,522,3,104,52,0,522,103,1,0, + 0,0,523,525,3,108,54,0,524,526,3,106,53,0,525,524,1,0,0,0,525,526,1,0, + 0,0,526,105,1,0,0,0,527,530,3,108,54,0,528,530,3,82,41,0,529,527,1,0, + 0,0,529,528,1,0,0,0,530,107,1,0,0,0,531,543,5,20,0,0,532,537,3,110,55, + 0,533,534,5,27,0,0,534,536,3,110,55,0,535,533,1,0,0,0,536,539,1,0,0,0, + 537,535,1,0,0,0,537,538,1,0,0,0,538,541,1,0,0,0,539,537,1,0,0,0,540,542, + 5,27,0,0,541,540,1,0,0,0,541,542,1,0,0,0,542,544,1,0,0,0,543,532,1,0, + 0,0,543,544,1,0,0,0,544,545,1,0,0,0,545,546,5,21,0,0,546,109,1,0,0,0, + 547,549,3,10,5,0,548,547,1,0,0,0,548,549,1,0,0,0,549,550,1,0,0,0,550, + 551,3,82,41,0,551,111,1,0,0,0,552,553,6,56,-1,0,553,557,3,114,57,0,554, + 555,7,3,0,0,555,557,3,112,56,7,556,552,1,0,0,0,556,554,1,0,0,0,557,578, + 1,0,0,0,558,559,10,6,0,0,559,560,5,56,0,0,560,577,3,112,56,7,561,562, + 10,5,0,0,562,563,7,4,0,0,563,577,3,112,56,6,564,565,10,4,0,0,565,566, + 7,5,0,0,566,577,3,112,56,5,567,568,10,3,0,0,568,569,7,6,0,0,569,577,3, + 112,56,4,570,571,10,2,0,0,571,572,5,35,0,0,572,577,3,112,56,3,573,574, + 10,1,0,0,574,575,5,34,0,0,575,577,3,112,56,2,576,558,1,0,0,0,576,561, + 1,0,0,0,576,564,1,0,0,0,576,567,1,0,0,0,576,570,1,0,0,0,576,573,1,0,0, + 0,577,580,1,0,0,0,578,576,1,0,0,0,578,579,1,0,0,0,579,113,1,0,0,0,580, + 578,1,0,0,0,581,594,3,118,59,0,582,586,5,30,0,0,583,585,5,19,0,0,584, + 583,1,0,0,0,585,588,1,0,0,0,586,584,1,0,0,0,586,587,1,0,0,0,587,593,1, + 0,0,0,588,586,1,0,0,0,589,593,3,154,77,0,590,593,3,156,78,0,591,593,3, + 158,79,0,592,582,1,0,0,0,592,589,1,0,0,0,592,590,1,0,0,0,592,591,1,0, + 0,0,593,596,1,0,0,0,594,592,1,0,0,0,594,595,1,0,0,0,595,115,1,0,0,0,596, + 594,1,0,0,0,597,598,3,82,41,0,598,599,5,20,0,0,599,601,3,112,56,0,600, + 602,5,27,0,0,601,600,1,0,0,0,601,602,1,0,0,0,602,603,1,0,0,0,603,604, + 5,21,0,0,604,117,1,0,0,0,605,615,3,120,60,0,606,608,3,126,63,0,607,609, + 3,84,42,0,608,607,1,0,0,0,608,609,1,0,0,0,609,615,1,0,0,0,610,611,5,20, + 0,0,611,612,3,112,56,0,612,613,5,21,0,0,613,615,1,0,0,0,614,605,1,0,0, + 0,614,606,1,0,0,0,614,610,1,0,0,0,615,119,1,0,0,0,616,620,3,122,61,0, + 617,620,3,130,65,0,618,620,3,152,76,0,619,616,1,0,0,0,619,617,1,0,0,0, + 619,618,1,0,0,0,620,121,1,0,0,0,621,626,5,13,0,0,622,626,3,124,62,0,623, + 626,3,148,74,0,624,626,5,61,0,0,625,621,1,0,0,0,625,622,1,0,0,0,625,623, + 1,0,0,0,625,624,1,0,0,0,626,123,1,0,0,0,627,628,7,7,0,0,628,125,1,0,0, + 0,629,632,5,19,0,0,630,632,3,128,64,0,631,629,1,0,0,0,631,630,1,0,0,0, + 632,127,1,0,0,0,633,634,5,19,0,0,634,635,5,30,0,0,635,636,5,19,0,0,636, + 129,1,0,0,0,637,638,3,132,66,0,638,639,3,134,67,0,639,131,1,0,0,0,640, + 648,3,144,72,0,641,648,3,90,45,0,642,648,3,96,48,0,643,645,3,86,43,0, + 644,646,3,84,42,0,645,644,1,0,0,0,645,646,1,0,0,0,646,648,1,0,0,0,647, + 640,1,0,0,0,647,641,1,0,0,0,647,642,1,0,0,0,647,643,1,0,0,0,648,133,1, + 0,0,0,649,654,5,22,0,0,650,652,3,136,68,0,651,653,5,27,0,0,652,651,1, + 0,0,0,652,653,1,0,0,0,653,655,1,0,0,0,654,650,1,0,0,0,654,655,1,0,0,0, + 655,656,1,0,0,0,656,657,5,23,0,0,657,135,1,0,0,0,658,663,3,138,69,0,659, + 660,5,27,0,0,660,662,3,138,69,0,661,659,1,0,0,0,662,665,1,0,0,0,663,661, + 1,0,0,0,663,664,1,0,0,0,664,137,1,0,0,0,665,663,1,0,0,0,666,667,3,140, + 70,0,667,668,5,29,0,0,668,670,1,0,0,0,669,666,1,0,0,0,669,670,1,0,0,0, + 670,671,1,0,0,0,671,672,3,142,71,0,672,139,1,0,0,0,673,676,3,112,56,0, + 674,676,3,134,67,0,675,673,1,0,0,0,675,674,1,0,0,0,676,141,1,0,0,0,677, + 680,3,112,56,0,678,680,3,134,67,0,679,677,1,0,0,0,679,678,1,0,0,0,680, + 143,1,0,0,0,681,682,5,16,0,0,682,688,5,22,0,0,683,684,3,146,73,0,684, + 685,3,160,80,0,685,687,1,0,0,0,686,683,1,0,0,0,687,690,1,0,0,0,688,686, + 1,0,0,0,688,689,1,0,0,0,689,691,1,0,0,0,690,688,1,0,0,0,691,692,5,23, + 0,0,692,145,1,0,0,0,693,694,3,10,5,0,694,695,3,82,41,0,695,698,1,0,0, + 0,696,698,3,150,75,0,697,693,1,0,0,0,697,696,1,0,0,0,698,700,1,0,0,0, + 699,701,3,148,74,0,700,699,1,0,0,0,700,701,1,0,0,0,701,147,1,0,0,0,702, + 703,7,8,0,0,703,149,1,0,0,0,704,706,5,54,0,0,705,704,1,0,0,0,705,706, + 1,0,0,0,706,707,1,0,0,0,707,709,3,86,43,0,708,710,3,84,42,0,709,708,1, + 0,0,0,709,710,1,0,0,0,710,151,1,0,0,0,711,712,5,10,0,0,712,713,3,104, + 52,0,713,714,3,36,18,0,714,153,1,0,0,0,715,716,5,24,0,0,716,717,3,112, + 56,0,717,718,5,25,0,0,718,155,1,0,0,0,719,735,5,24,0,0,720,722,3,112, + 56,0,721,720,1,0,0,0,721,722,1,0,0,0,722,723,1,0,0,0,723,725,5,29,0,0, + 724,726,3,112,56,0,725,724,1,0,0,0,725,726,1,0,0,0,726,736,1,0,0,0,727, + 729,3,112,56,0,728,727,1,0,0,0,728,729,1,0,0,0,729,730,1,0,0,0,730,731, + 5,29,0,0,731,732,3,112,56,0,732,733,5,29,0,0,733,734,3,112,56,0,734,736, + 1,0,0,0,735,721,1,0,0,0,735,728,1,0,0,0,736,737,1,0,0,0,737,738,5,25, + 0,0,738,157,1,0,0,0,739,751,5,20,0,0,740,747,3,12,6,0,741,744,3,82,41, + 0,742,743,5,27,0,0,743,745,3,12,6,0,744,742,1,0,0,0,744,745,1,0,0,0,745, + 747,1,0,0,0,746,740,1,0,0,0,746,741,1,0,0,0,747,749,1,0,0,0,748,750,5, + 27,0,0,749,748,1,0,0,0,749,750,1,0,0,0,750,752,1,0,0,0,751,746,1,0,0, + 0,751,752,1,0,0,0,752,753,1,0,0,0,753,754,5,21,0,0,754,159,1,0,0,0,755, + 756,7,9,0,0,756,161,1,0,0,0,89,165,171,181,191,195,199,203,210,218,229, + 233,237,241,248,258,271,275,282,286,296,300,306,310,319,326,338,346,366, + 376,380,384,394,400,402,406,411,415,423,438,447,452,459,463,467,471,478, + 483,489,497,501,525,529,537,541,543,548,556,576,578,586,592,594,601,608, + 614,619,625,631,645,647,652,654,663,669,675,679,688,697,700,705,709,721, + 725,728,735,744,746,749,751 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); @@ -441,30 +481,29 @@ TParser::SourceFileContext* TParser::sourceFile() { }); try { enterOuterAlt(_localctx, 1); - setState(157); + setState(171); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 7484841843207142760) != 0) || _la == TParser::RAW_STRING_LIT - - || _la == TParser::INTERPRETED_STRING_LIT) { - setState(151); + ((1ULL << _la) & 4538502524505652584) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 387) != 0)) { + setState(165); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 0, _ctx)) { case 1: { - setState(148); + setState(162); functionDecl(); break; } case 2: { - setState(149); + setState(163); declaration(); break; } case 3: { - setState(150); + setState(164); statement(); break; } @@ -472,13 +511,13 @@ TParser::SourceFileContext* TParser::sourceFile() { default: break; } - setState(153); + setState(167); eos(); - setState(159); + setState(173); _errHandler->sync(this); _la = _input->LA(1); } - setState(160); + setState(174); match(TParser::EOF); } @@ -527,7 +566,7 @@ TParser::IdentifierContext* TParser::identifier() { }); try { enterOuterAlt(_localctx, 1); - setState(162); + setState(176); match(TParser::IDENTIFIER); } @@ -550,6 +589,10 @@ TParser::ConstDeclContext* TParser::DeclarationContext::constDecl() { return getRuleContext(0); } +TParser::TypeDeclContext* TParser::DeclarationContext::typeDecl() { + return getRuleContext(0); +} + TParser::VarDeclContext* TParser::DeclarationContext::varDecl() { return getRuleContext(0); } @@ -579,19 +622,26 @@ TParser::DeclarationContext* TParser::declaration() { exitRule(); }); try { - setState(166); + setState(181); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::CONST: { enterOuterAlt(_localctx, 1); - setState(164); + setState(178); constDecl(); break; } - case TParser::VAR: { + case TParser::TYPE: { enterOuterAlt(_localctx, 2); - setState(165); + setState(179); + typeDecl(); + break; + } + + case TParser::VAR: { + enterOuterAlt(_localctx, 3); + setState(180); varDecl(); break; } @@ -671,33 +721,33 @@ TParser::ConstDeclContext* TParser::constDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(168); + setState(183); match(TParser::CONST); - setState(180); + setState(195); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::IDENTIFIER: { - setState(169); + setState(184); constSpec(); break; } case TParser::L_PAREN: { - setState(170); + setState(185); match(TParser::L_PAREN); - setState(176); + setState(191); _errHandler->sync(this); _la = _input->LA(1); while (_la == TParser::IDENTIFIER) { - setState(171); + setState(186); constSpec(); - setState(172); + setState(187); eos(); - setState(178); + setState(193); _errHandler->sync(this); _la = _input->LA(1); } - setState(179); + setState(194); match(TParser::R_PAREN); break; } @@ -765,26 +815,26 @@ TParser::ConstSpecContext* TParser::constSpec() { }); try { enterOuterAlt(_localctx, 1); - setState(182); + setState(197); identifierList(); - setState(188); + setState(203); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 21398532) != 0)) { - setState(184); + ((1ULL << _la) & 85558276) != 0)) { + setState(199); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 4621316) != 0)) { - setState(183); + ((1ULL << _la) & 18449412) != 0)) { + setState(198); type_(); } - setState(186); + setState(201); match(TParser::ASSIGN); - setState(187); + setState(202); expressionList(); } @@ -847,17 +897,17 @@ TParser::IdentifierListContext* TParser::identifierList() { }); try { enterOuterAlt(_localctx, 1); - setState(190); + setState(205); match(TParser::IDENTIFIER); - setState(195); + setState(210); _errHandler->sync(this); _la = _input->LA(1); while (_la == TParser::COMMA) { - setState(191); + setState(206); match(TParser::COMMA); - setState(192); + setState(207); match(TParser::IDENTIFIER); - setState(197); + setState(212); _errHandler->sync(this); _la = _input->LA(1); } @@ -921,19 +971,19 @@ TParser::ExpressionListContext* TParser::expressionList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(198); + setState(213); expression(0); - setState(203); + setState(218); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 8, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(199); + setState(214); match(TParser::COMMA); - setState(200); + setState(215); expression(0); } - setState(205); + setState(220); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 8, _ctx); } @@ -948,6 +998,112 @@ TParser::ExpressionListContext* TParser::expressionList() { return _localctx; } +//----------------- TypeDeclContext ------------------------------------------------------------------ + +TParser::TypeDeclContext::TypeDeclContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* TParser::TypeDeclContext::TYPE() { + return getToken(TParser::TYPE, 0); +} + +std::vector TParser::TypeDeclContext::typeSpec() { + return getRuleContexts(); +} + +TParser::TypeSpecContext* TParser::TypeDeclContext::typeSpec(size_t i) { + return getRuleContext(i); +} + +tree::TerminalNode* TParser::TypeDeclContext::L_PAREN() { + return getToken(TParser::L_PAREN, 0); +} + +tree::TerminalNode* TParser::TypeDeclContext::R_PAREN() { + return getToken(TParser::R_PAREN, 0); +} + +std::vector TParser::TypeDeclContext::eos() { + return getRuleContexts(); +} + +TParser::EosContext* TParser::TypeDeclContext::eos(size_t i) { + return getRuleContext(i); +} + + +size_t TParser::TypeDeclContext::getRuleIndex() const { + return TParser::RuleTypeDecl; +} + + +std::any TParser::TypeDeclContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitTypeDecl(this); + else + return visitor->visitChildren(this); +} + +TParser::TypeDeclContext* TParser::typeDecl() { + TypeDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 14, TParser::RuleTypeDecl); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(221); + match(TParser::TYPE); + setState(233); + _errHandler->sync(this); + switch (_input->LA(1)) { + case TParser::IDENTIFIER: { + setState(222); + typeSpec(); + break; + } + + case TParser::L_PAREN: { + setState(223); + match(TParser::L_PAREN); + setState(229); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == TParser::IDENTIFIER) { + setState(224); + typeSpec(); + setState(225); + eos(); + setState(231); + _errHandler->sync(this); + _la = _input->LA(1); + } + setState(232); + match(TParser::R_PAREN); + break; + } + + default: + throw NoViableAltException(this); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + //----------------- TypeSpecContext ------------------------------------------------------------------ TParser::TypeSpecContext::TypeSpecContext(ParserRuleContext *parent, size_t invokingState) @@ -977,7 +1133,7 @@ std::any TParser::TypeSpecContext::accept(tree::ParseTreeVisitor *visitor) { TParser::TypeSpecContext* TParser::typeSpec() { TypeSpecContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 14, TParser::RuleTypeSpec); + enterRule(_localctx, 16, TParser::RuleTypeSpec); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -987,19 +1143,19 @@ TParser::TypeSpecContext* TParser::typeSpec() { exitRule(); }); try { - setState(208); + setState(237); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 9, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 11, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(206); + setState(235); aliasDecl(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(207); + setState(236); typeDef(); break; } @@ -1055,7 +1211,7 @@ std::any TParser::AliasDeclContext::accept(tree::ParseTreeVisitor *visitor) { TParser::AliasDeclContext* TParser::aliasDecl() { AliasDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 16, TParser::RuleAliasDecl); + enterRule(_localctx, 18, TParser::RuleAliasDecl); size_t _la = 0; #if __cplusplus > 201703L @@ -1067,19 +1223,19 @@ TParser::AliasDeclContext* TParser::aliasDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(210); + setState(239); match(TParser::IDENTIFIER); - setState(212); + setState(241); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::L_BRACKET) { - setState(211); + setState(240); typeParameters(); } - setState(214); + setState(243); match(TParser::ASSIGN); - setState(215); + setState(244); type_(); } @@ -1125,7 +1281,7 @@ std::any TParser::TypeDefContext::accept(tree::ParseTreeVisitor *visitor) { TParser::TypeDefContext* TParser::typeDef() { TypeDefContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 18, TParser::RuleTypeDef); + enterRule(_localctx, 20, TParser::RuleTypeDef); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1136,14 +1292,14 @@ TParser::TypeDefContext* TParser::typeDef() { }); try { enterOuterAlt(_localctx, 1); - setState(217); + setState(246); match(TParser::IDENTIFIER); - setState(219); + setState(248); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 11, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 13, _ctx)) { case 1: { - setState(218); + setState(247); typeParameters(); break; } @@ -1151,7 +1307,7 @@ TParser::TypeDefContext* TParser::typeDef() { default: break; } - setState(221); + setState(250); type_(); } @@ -1209,7 +1365,7 @@ std::any TParser::TypeParametersContext::accept(tree::ParseTreeVisitor *visitor) TParser::TypeParametersContext* TParser::typeParameters() { TypeParametersContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 20, TParser::RuleTypeParameters); + enterRule(_localctx, 22, TParser::RuleTypeParameters); size_t _la = 0; #if __cplusplus > 201703L @@ -1221,23 +1377,23 @@ TParser::TypeParametersContext* TParser::typeParameters() { }); try { enterOuterAlt(_localctx, 1); - setState(223); + setState(252); match(TParser::L_BRACKET); - setState(224); + setState(253); typeParameterDecl(); - setState(229); + setState(258); _errHandler->sync(this); _la = _input->LA(1); while (_la == TParser::COMMA) { - setState(225); + setState(254); match(TParser::COMMA); - setState(226); + setState(255); typeParameterDecl(); - setState(231); + setState(260); _errHandler->sync(this); _la = _input->LA(1); } - setState(232); + setState(261); match(TParser::R_BRACKET); } @@ -1279,7 +1435,7 @@ std::any TParser::TypeParameterDeclContext::accept(tree::ParseTreeVisitor *visit TParser::TypeParameterDeclContext* TParser::typeParameterDecl() { TypeParameterDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 22, TParser::RuleTypeParameterDecl); + enterRule(_localctx, 24, TParser::RuleTypeParameterDecl); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1290,9 +1446,9 @@ TParser::TypeParameterDeclContext* TParser::typeParameterDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(234); + setState(263); identifierList(); - setState(235); + setState(264); typeElement(); } @@ -1342,7 +1498,7 @@ std::any TParser::TypeElementContext::accept(tree::ParseTreeVisitor *visitor) { TParser::TypeElementContext* TParser::typeElement() { TypeElementContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 24, TParser::RuleTypeElement); + enterRule(_localctx, 26, TParser::RuleTypeElement); size_t _la = 0; #if __cplusplus > 201703L @@ -1354,17 +1510,17 @@ TParser::TypeElementContext* TParser::typeElement() { }); try { enterOuterAlt(_localctx, 1); - setState(237); + setState(266); typeTerm(); - setState(242); + setState(271); _errHandler->sync(this); _la = _input->LA(1); while (_la == TParser::OR) { - setState(238); + setState(267); match(TParser::OR); - setState(239); + setState(268); typeTerm(); - setState(244); + setState(273); _errHandler->sync(this); _la = _input->LA(1); } @@ -1408,7 +1564,7 @@ std::any TParser::TypeTermContext::accept(tree::ParseTreeVisitor *visitor) { TParser::TypeTermContext* TParser::typeTerm() { TypeTermContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 26, TParser::RuleTypeTerm); + enterRule(_localctx, 28, TParser::RuleTypeTerm); size_t _la = 0; #if __cplusplus > 201703L @@ -1420,15 +1576,15 @@ TParser::TypeTermContext* TParser::typeTerm() { }); try { enterOuterAlt(_localctx, 1); - setState(246); + setState(275); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::UNDERLYING) { - setState(245); + setState(274); match(TParser::UNDERLYING); } - setState(248); + setState(277); type_(); } @@ -1482,7 +1638,7 @@ std::any TParser::FunctionDeclContext::accept(tree::ParseTreeVisitor *visitor) { TParser::FunctionDeclContext* TParser::functionDecl() { FunctionDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 28, TParser::RuleFunctionDecl); + enterRule(_localctx, 30, TParser::RuleFunctionDecl); size_t _la = 0; #if __cplusplus > 201703L @@ -1494,26 +1650,26 @@ TParser::FunctionDeclContext* TParser::functionDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(250); + setState(279); match(TParser::FUNC); - setState(251); + setState(280); match(TParser::IDENTIFIER); - setState(253); + setState(282); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::L_BRACKET) { - setState(252); + setState(281); typeParameters(); } - setState(255); + setState(284); signature(); - setState(257); + setState(286); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::L_CURLY) { - setState(256); + setState(285); block(); } @@ -1576,7 +1732,7 @@ std::any TParser::VarDeclContext::accept(tree::ParseTreeVisitor *visitor) { TParser::VarDeclContext* TParser::varDecl() { VarDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 30, TParser::RuleVarDecl); + enterRule(_localctx, 32, TParser::RuleVarDecl); size_t _la = 0; #if __cplusplus > 201703L @@ -1588,33 +1744,33 @@ TParser::VarDeclContext* TParser::varDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(259); + setState(288); match(TParser::VAR); - setState(271); + setState(300); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::IDENTIFIER: { - setState(260); + setState(289); varSpec(); break; } case TParser::L_PAREN: { - setState(261); + setState(290); match(TParser::L_PAREN); - setState(267); + setState(296); _errHandler->sync(this); _la = _input->LA(1); while (_la == TParser::IDENTIFIER) { - setState(262); + setState(291); varSpec(); - setState(263); + setState(292); eos(); - setState(269); + setState(298); _errHandler->sync(this); _la = _input->LA(1); } - setState(270); + setState(299); match(TParser::R_PAREN); break; } @@ -1670,7 +1826,7 @@ std::any TParser::VarSpecContext::accept(tree::ParseTreeVisitor *visitor) { TParser::VarSpecContext* TParser::varSpec() { VarSpecContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 32, TParser::RuleVarSpec); + enterRule(_localctx, 34, TParser::RuleVarSpec); size_t _la = 0; #if __cplusplus > 201703L @@ -1682,36 +1838,37 @@ TParser::VarSpecContext* TParser::varSpec() { }); try { enterOuterAlt(_localctx, 1); - setState(273); + setState(302); identifierList(); - setState(281); + setState(310); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::ASYNC: case TParser::FUNC: case TParser::SYNC: + case TParser::STRUCT: case TParser::IDENTIFIER: case TParser::L_PAREN: case TParser::L_BRACKET: { - setState(274); + setState(303); type_(); - setState(277); + setState(306); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::ASSIGN) { - setState(275); + setState(304); match(TParser::ASSIGN); - setState(276); + setState(305); expressionList(); } break; } case TParser::ASSIGN: { - setState(279); + setState(308); match(TParser::ASSIGN); - setState(280); + setState(309); expressionList(); break; } @@ -1763,7 +1920,7 @@ std::any TParser::BlockContext::accept(tree::ParseTreeVisitor *visitor) { TParser::BlockContext* TParser::block() { BlockContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 34, TParser::RuleBlock); + enterRule(_localctx, 36, TParser::RuleBlock); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1774,11 +1931,11 @@ TParser::BlockContext* TParser::block() { }); try { enterOuterAlt(_localctx, 1); - setState(283); + setState(312); match(TParser::L_CURLY); - setState(284); + setState(313); statementList(); - setState(285); + setState(314); match(TParser::R_CURLY); } @@ -1844,7 +2001,7 @@ std::any TParser::StatementListContext::accept(tree::ParseTreeVisitor *visitor) TParser::StatementListContext* TParser::statementList() { StatementListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 36, TParser::RuleStatementList); + enterRule(_localctx, 38, TParser::RuleStatementList); size_t _la = 0; #if __cplusplus > 201703L @@ -1856,23 +2013,23 @@ TParser::StatementListContext* TParser::statementList() { }); try { enterOuterAlt(_localctx, 1); - setState(297); + setState(326); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 7484841843274251624) != 0) || ((((_la - 68) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 68)) & 515) != 0)) { - setState(290); + ((1ULL << _la) & 4538502524774088040) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 65923) != 0)) { + setState(319); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::SEMI: { - setState(287); + setState(316); match(TParser::SEMI); break; } case TParser::EOS: { - setState(288); + setState(317); match(TParser::EOS); break; } @@ -1886,6 +2043,8 @@ TParser::StatementListContext* TParser::statementList() { case TParser::IF: case TParser::NIL_LIT: case TParser::RETURN: + case TParser::STRUCT: + case TParser::TYPE: case TParser::VAR: case TParser::IDENTIFIER: case TParser::L_PAREN: @@ -1912,11 +2071,11 @@ TParser::StatementListContext* TParser::statementList() { default: throw NoViableAltException(this); } - setState(292); + setState(321); statement(); - setState(293); + setState(322); eos(); - setState(299); + setState(328); _errHandler->sync(this); _la = _input->LA(1); } @@ -1988,7 +2147,7 @@ std::any TParser::StatementContext::accept(tree::ParseTreeVisitor *visitor) { TParser::StatementContext* TParser::statement() { StatementContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 38, TParser::RuleStatement); + enterRule(_localctx, 40, TParser::RuleStatement); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1998,19 +2157,21 @@ TParser::StatementContext* TParser::statement() { exitRule(); }); try { - setState(309); + setState(338); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::CONST: + case TParser::TYPE: case TParser::VAR: { enterOuterAlt(_localctx, 1); - setState(300); + setState(329); declaration(); break; } case TParser::FUNC: case TParser::NIL_LIT: + case TParser::STRUCT: case TParser::IDENTIFIER: case TParser::L_PAREN: case TParser::L_BRACKET: @@ -2030,56 +2191,56 @@ TParser::StatementContext* TParser::statement() { case TParser::RAW_STRING_LIT: case TParser::INTERPRETED_STRING_LIT: { enterOuterAlt(_localctx, 2); - setState(301); + setState(330); simpleStmt(); break; } case TParser::RETURN: { enterOuterAlt(_localctx, 3); - setState(302); + setState(331); returnStmt(); break; } case TParser::BREAK: { enterOuterAlt(_localctx, 4); - setState(303); + setState(332); breakStmt(); break; } case TParser::CONTINUE: { enterOuterAlt(_localctx, 5); - setState(304); + setState(333); continueStmt(); break; } case TParser::L_CURLY: { enterOuterAlt(_localctx, 6); - setState(305); + setState(334); block(); break; } case TParser::IF: { enterOuterAlt(_localctx, 7); - setState(306); + setState(335); ifStmt(); break; } case TParser::JOIN: { enterOuterAlt(_localctx, 8); - setState(307); + setState(336); joinStmt(); break; } case TParser::FOR: { enterOuterAlt(_localctx, 9); - setState(308); + setState(337); forStmt(); break; } @@ -2143,7 +2304,7 @@ std::any TParser::SimpleStmtContext::accept(tree::ParseTreeVisitor *visitor) { TParser::SimpleStmtContext* TParser::simpleStmt() { SimpleStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 40, TParser::RuleSimpleStmt); + enterRule(_localctx, 42, TParser::RuleSimpleStmt); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2153,47 +2314,47 @@ TParser::SimpleStmtContext* TParser::simpleStmt() { exitRule(); }); try { - setState(317); + setState(346); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 24, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 26, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(311); + setState(340); emitStmt(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(312); + setState(341); syncReturnStmt(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(313); + setState(342); incDecStmt(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(314); + setState(343); assignment(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(315); + setState(344); expressionStmt(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(316); + setState(345); shortVarDecl(); break; } @@ -2237,7 +2398,7 @@ std::any TParser::ExpressionStmtContext::accept(tree::ParseTreeVisitor *visitor) TParser::ExpressionStmtContext* TParser::expressionStmt() { ExpressionStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 42, TParser::RuleExpressionStmt); + enterRule(_localctx, 44, TParser::RuleExpressionStmt); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2248,7 +2409,7 @@ TParser::ExpressionStmtContext* TParser::expressionStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(319); + setState(348); expression(0); } @@ -2294,7 +2455,7 @@ std::any TParser::SyncReturnStmtContext::accept(tree::ParseTreeVisitor *visitor) TParser::SyncReturnStmtContext* TParser::syncReturnStmt() { SyncReturnStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 44, TParser::RuleSyncReturnStmt); + enterRule(_localctx, 46, TParser::RuleSyncReturnStmt); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2305,11 +2466,11 @@ TParser::SyncReturnStmtContext* TParser::syncReturnStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(321); + setState(350); antlrcpp::downCast(_localctx)->channel = expression(0); - setState(322); + setState(351); match(TParser::SYNC_RETURN); - setState(323); + setState(352); expression(0); } @@ -2355,7 +2516,7 @@ std::any TParser::EmitStmtContext::accept(tree::ParseTreeVisitor *visitor) { TParser::EmitStmtContext* TParser::emitStmt() { EmitStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 46, TParser::RuleEmitStmt); + enterRule(_localctx, 48, TParser::RuleEmitStmt); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2366,11 +2527,11 @@ TParser::EmitStmtContext* TParser::emitStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(325); + setState(354); antlrcpp::downCast(_localctx)->channel = expression(0); - setState(326); + setState(355); match(TParser::EMIT); - setState(327); + setState(356); expression(0); } @@ -2416,7 +2577,7 @@ std::any TParser::IncDecStmtContext::accept(tree::ParseTreeVisitor *visitor) { TParser::IncDecStmtContext* TParser::incDecStmt() { IncDecStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 48, TParser::RuleIncDecStmt); + enterRule(_localctx, 50, TParser::RuleIncDecStmt); size_t _la = 0; #if __cplusplus > 201703L @@ -2428,9 +2589,9 @@ TParser::IncDecStmtContext* TParser::incDecStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(329); + setState(358); expression(0); - setState(330); + setState(359); _la = _input->LA(1); if (!(_la == TParser::PLUS_PLUS @@ -2485,7 +2646,7 @@ std::any TParser::AssignmentContext::accept(tree::ParseTreeVisitor *visitor) { TParser::AssignmentContext* TParser::assignment() { AssignmentContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 50, TParser::RuleAssignment); + enterRule(_localctx, 52, TParser::RuleAssignment); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2496,11 +2657,11 @@ TParser::AssignmentContext* TParser::assignment() { }); try { enterOuterAlt(_localctx, 1); - setState(332); + setState(361); expressionList(); - setState(333); + setState(362); assign_op(); - setState(334); + setState(363); expressionList(); } @@ -2582,7 +2743,7 @@ std::any TParser::Assign_opContext::accept(tree::ParseTreeVisitor *visitor) { TParser::Assign_opContext* TParser::assign_op() { Assign_opContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 52, TParser::RuleAssign_op); + enterRule(_localctx, 54, TParser::RuleAssign_op); size_t _la = 0; #if __cplusplus > 201703L @@ -2594,16 +2755,16 @@ TParser::Assign_opContext* TParser::assign_op() { }); try { enterOuterAlt(_localctx, 1); - setState(337); + setState(366); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 8794993510580224) != 0)) { - setState(336); + ((1ULL << _la) & 70359948084641792) != 0)) { + setState(365); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 8794993510580224) != 0))) { + ((1ULL << _la) & 70359948084641792) != 0))) { _errHandler->recoverInline(this); } else { @@ -2611,7 +2772,7 @@ TParser::Assign_opContext* TParser::assign_op() { consume(); } } - setState(339); + setState(368); match(TParser::ASSIGN); } @@ -2657,7 +2818,7 @@ std::any TParser::ShortVarDeclContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ShortVarDeclContext* TParser::shortVarDecl() { ShortVarDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 54, TParser::RuleShortVarDecl); + enterRule(_localctx, 56, TParser::RuleShortVarDecl); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2668,11 +2829,11 @@ TParser::ShortVarDeclContext* TParser::shortVarDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(341); + setState(370); identifierList(); - setState(342); + setState(371); match(TParser::DECLARE_ASSIGN); - setState(343); + setState(372); expressionList(); } @@ -2714,7 +2875,7 @@ std::any TParser::ReturnStmtContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ReturnStmtContext* TParser::returnStmt() { ReturnStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 56, TParser::RuleReturnStmt); + enterRule(_localctx, 58, TParser::RuleReturnStmt); size_t _la = 0; #if __cplusplus > 201703L @@ -2726,15 +2887,15 @@ TParser::ReturnStmtContext* TParser::returnStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(345); + setState(374); match(TParser::RETURN); - setState(347); + setState(376); _errHandler->sync(this); _la = _input->LA(1); if (((((_la - 10) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 10)) & 872000544317641097) != 0)) { - setState(346); + ((1ULL << (_la - 10)) & 6976004354541110857) != 0)) { + setState(375); expressionList(); } @@ -2777,7 +2938,7 @@ std::any TParser::BreakStmtContext::accept(tree::ParseTreeVisitor *visitor) { TParser::BreakStmtContext* TParser::breakStmt() { BreakStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 58, TParser::RuleBreakStmt); + enterRule(_localctx, 60, TParser::RuleBreakStmt); size_t _la = 0; #if __cplusplus > 201703L @@ -2789,14 +2950,14 @@ TParser::BreakStmtContext* TParser::breakStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(349); + setState(378); match(TParser::BREAK); - setState(351); + setState(380); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::IDENTIFIER) { - setState(350); + setState(379); match(TParser::IDENTIFIER); } @@ -2839,7 +3000,7 @@ std::any TParser::ContinueStmtContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ContinueStmtContext* TParser::continueStmt() { ContinueStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 60, TParser::RuleContinueStmt); + enterRule(_localctx, 62, TParser::RuleContinueStmt); size_t _la = 0; #if __cplusplus > 201703L @@ -2851,14 +3012,14 @@ TParser::ContinueStmtContext* TParser::continueStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(353); + setState(382); match(TParser::CONTINUE); - setState(355); + setState(384); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::IDENTIFIER) { - setState(354); + setState(383); match(TParser::IDENTIFIER); } @@ -2929,7 +3090,7 @@ std::any TParser::IfStmtContext::accept(tree::ParseTreeVisitor *visitor) { TParser::IfStmtContext* TParser::ifStmt() { IfStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 62, TParser::RuleIfStmt); + enterRule(_localctx, 64, TParser::RuleIfStmt); size_t _la = 0; #if __cplusplus > 201703L @@ -2941,19 +3102,19 @@ TParser::IfStmtContext* TParser::ifStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(357); + setState(386); match(TParser::IF); - setState(365); + setState(394); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 29, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 31, _ctx)) { case 1: { - setState(358); + setState(387); expression(0); break; } case 2: { - setState(359); + setState(388); _la = _input->LA(1); if (!(_la == TParser::SEMI @@ -2964,15 +3125,15 @@ TParser::IfStmtContext* TParser::ifStmt() { _errHandler->reportMatch(this); consume(); } - setState(360); + setState(389); expression(0); break; } case 3: { - setState(361); + setState(390); simpleStmt(); - setState(362); + setState(391); _la = _input->LA(1); if (!(_la == TParser::SEMI @@ -2983,7 +3144,7 @@ TParser::IfStmtContext* TParser::ifStmt() { _errHandler->reportMatch(this); consume(); } - setState(363); + setState(392); expression(0); break; } @@ -2991,26 +3152,26 @@ TParser::IfStmtContext* TParser::ifStmt() { default: break; } - setState(367); + setState(396); block(); - setState(373); + setState(402); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::ELSE) { - setState(368); + setState(397); match(TParser::ELSE); - setState(371); + setState(400); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::IF: { - setState(369); + setState(398); ifStmt(); break; } case TParser::L_CURLY: { - setState(370); + setState(399); block(); break; } @@ -3075,7 +3236,7 @@ std::any TParser::TypeListContext::accept(tree::ParseTreeVisitor *visitor) { TParser::TypeListContext* TParser::typeList() { TypeListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 64, TParser::RuleTypeList); + enterRule(_localctx, 66, TParser::RuleTypeList); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3087,22 +3248,23 @@ TParser::TypeListContext* TParser::typeList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(377); + setState(406); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::ASYNC: case TParser::FUNC: case TParser::SYNC: + case TParser::STRUCT: case TParser::IDENTIFIER: case TParser::L_PAREN: case TParser::L_BRACKET: { - setState(375); + setState(404); type_(); break; } case TParser::NIL_LIT: { - setState(376); + setState(405); match(TParser::NIL_LIT); break; } @@ -3110,29 +3272,30 @@ TParser::TypeListContext* TParser::typeList() { default: throw NoViableAltException(this); } - setState(386); + setState(415); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 34, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 36, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(379); + setState(408); match(TParser::COMMA); - setState(382); + setState(411); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::ASYNC: case TParser::FUNC: case TParser::SYNC: + case TParser::STRUCT: case TParser::IDENTIFIER: case TParser::L_PAREN: case TParser::L_BRACKET: { - setState(380); + setState(409); type_(); break; } case TParser::NIL_LIT: { - setState(381); + setState(410); match(TParser::NIL_LIT); break; } @@ -3141,9 +3304,9 @@ TParser::TypeListContext* TParser::typeList() { throw NoViableAltException(this); } } - setState(388); + setState(417); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 34, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 36, _ctx); } } @@ -3197,7 +3360,7 @@ std::any TParser::JoinStmtContext::accept(tree::ParseTreeVisitor *visitor) { TParser::JoinStmtContext* TParser::joinStmt() { JoinStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 66, TParser::RuleJoinStmt); + enterRule(_localctx, 68, TParser::RuleJoinStmt); size_t _la = 0; #if __cplusplus > 201703L @@ -3209,21 +3372,21 @@ TParser::JoinStmtContext* TParser::joinStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(389); + setState(418); match(TParser::JOIN); - setState(390); + setState(419); match(TParser::L_CURLY); - setState(394); + setState(423); _errHandler->sync(this); _la = _input->LA(1); while (_la == TParser::CASE) { - setState(391); + setState(420); matchClause(); - setState(396); + setState(425); _errHandler->sync(this); _la = _input->LA(1); } - setState(397); + setState(426); match(TParser::R_CURLY); } @@ -3269,7 +3432,7 @@ std::any TParser::MatchClauseContext::accept(tree::ParseTreeVisitor *visitor) { TParser::MatchClauseContext* TParser::matchClause() { MatchClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 68, TParser::RuleMatchClause); + enterRule(_localctx, 70, TParser::RuleMatchClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3280,11 +3443,11 @@ TParser::MatchClauseContext* TParser::matchClause() { }); try { enterOuterAlt(_localctx, 1); - setState(399); + setState(428); matchCase(); - setState(400); + setState(429); match(TParser::COLON); - setState(401); + setState(430); statementList(); } @@ -3338,7 +3501,7 @@ std::any TParser::MatchCaseContext::accept(tree::ParseTreeVisitor *visitor) { TParser::MatchCaseContext* TParser::matchCase() { MatchCaseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 70, TParser::RuleMatchCase); + enterRule(_localctx, 72, TParser::RuleMatchCase); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3350,23 +3513,23 @@ TParser::MatchCaseContext* TParser::matchCase() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(403); + setState(432); match(TParser::CASE); - setState(409); + setState(438); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 36, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 38, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(404); + setState(433); fromChanAs(); - setState(405); + setState(434); match(TParser::COMMA); } - setState(411); + setState(440); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 36, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 38, _ctx); } - setState(412); + setState(441); fromChanAs(); } @@ -3416,7 +3579,7 @@ std::any TParser::FromChanAsContext::accept(tree::ParseTreeVisitor *visitor) { TParser::FromChanAsContext* TParser::fromChanAs() { FromChanAsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 72, TParser::RuleFromChanAs); + enterRule(_localctx, 74, TParser::RuleFromChanAs); size_t _la = 0; #if __cplusplus > 201703L @@ -3428,18 +3591,18 @@ TParser::FromChanAsContext* TParser::fromChanAs() { }); try { enterOuterAlt(_localctx, 1); - setState(414); + setState(443); match(TParser::FROM); - setState(415); + setState(444); antlrcpp::downCast(_localctx)->chanName = match(TParser::IDENTIFIER); - setState(418); + setState(447); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::AS) { - setState(416); + setState(445); match(TParser::AS); - setState(417); + setState(446); antlrcpp::downCast(_localctx)->varName = match(TParser::IDENTIFIER); } @@ -3490,7 +3653,7 @@ std::any TParser::ForStmtContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ForStmtContext* TParser::forStmt() { ForStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 74, TParser::RuleForStmt); + enterRule(_localctx, 76, TParser::RuleForStmt); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3501,20 +3664,20 @@ TParser::ForStmtContext* TParser::forStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(420); + setState(449); match(TParser::FOR); - setState(423); + setState(452); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 38, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 40, _ctx)) { case 1: { - setState(421); + setState(450); condition(); break; } case 2: { - setState(422); + setState(451); forClause(); break; } @@ -3522,7 +3685,7 @@ TParser::ForStmtContext* TParser::forStmt() { default: break; } - setState(425); + setState(454); block(); } @@ -3560,7 +3723,7 @@ std::any TParser::ConditionContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ConditionContext* TParser::condition() { ConditionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 76, TParser::RuleCondition); + enterRule(_localctx, 78, TParser::RuleCondition); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3571,7 +3734,7 @@ TParser::ConditionContext* TParser::condition() { }); try { enterOuterAlt(_localctx, 1); - setState(427); + setState(456); expression(0); } @@ -3625,7 +3788,7 @@ std::any TParser::ForClauseContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ForClauseContext* TParser::forClause() { ForClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 78, TParser::RuleForClause); + enterRule(_localctx, 80, TParser::RuleForClause); size_t _la = 0; #if __cplusplus > 201703L @@ -3637,35 +3800,35 @@ TParser::ForClauseContext* TParser::forClause() { }); try { enterOuterAlt(_localctx, 1); - setState(430); + setState(459); _errHandler->sync(this); _la = _input->LA(1); if (((((_la - 10) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 10)) & 872000544317641097) != 0)) { - setState(429); + ((1ULL << (_la - 10)) & 6976004354541110857) != 0)) { + setState(458); antlrcpp::downCast(_localctx)->initStmt = simpleStmt(); } - setState(432); + setState(461); eos(); - setState(434); + setState(463); _errHandler->sync(this); _la = _input->LA(1); if (((((_la - 10) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 10)) & 872000544317641097) != 0)) { - setState(433); + ((1ULL << (_la - 10)) & 6976004354541110857) != 0)) { + setState(462); expression(0); } - setState(436); + setState(465); eos(); - setState(438); + setState(467); _errHandler->sync(this); _la = _input->LA(1); if (((((_la - 10) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 10)) & 872000544317641097) != 0)) { - setState(437); + ((1ULL << (_la - 10)) & 6976004354541110857) != 0)) { + setState(466); antlrcpp::downCast(_localctx)->postStmt = simpleStmt(); } @@ -3724,7 +3887,7 @@ std::any TParser::Type_Context::accept(tree::ParseTreeVisitor *visitor) { TParser::Type_Context* TParser::type_() { Type_Context *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 80, TParser::RuleType_); + enterRule(_localctx, 82, TParser::RuleType_); size_t _la = 0; #if __cplusplus > 201703L @@ -3735,19 +3898,19 @@ TParser::Type_Context* TParser::type_() { exitRule(); }); try { - setState(449); + setState(478); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::IDENTIFIER: { enterOuterAlt(_localctx, 1); - setState(440); + setState(469); typeName(); - setState(442); + setState(471); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::L_BRACKET) { - setState(441); + setState(470); typeArgs(); } break; @@ -3756,20 +3919,21 @@ TParser::Type_Context* TParser::type_() { case TParser::ASYNC: case TParser::FUNC: case TParser::SYNC: + case TParser::STRUCT: case TParser::L_BRACKET: { enterOuterAlt(_localctx, 2); - setState(444); + setState(473); typeLit(); break; } case TParser::L_PAREN: { enterOuterAlt(_localctx, 3); - setState(445); + setState(474); match(TParser::L_PAREN); - setState(446); + setState(475); type_(); - setState(447); + setState(476); match(TParser::R_PAREN); break; } @@ -3825,7 +3989,7 @@ std::any TParser::TypeArgsContext::accept(tree::ParseTreeVisitor *visitor) { TParser::TypeArgsContext* TParser::typeArgs() { TypeArgsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 82, TParser::RuleTypeArgs); + enterRule(_localctx, 84, TParser::RuleTypeArgs); size_t _la = 0; #if __cplusplus > 201703L @@ -3837,19 +4001,19 @@ TParser::TypeArgsContext* TParser::typeArgs() { }); try { enterOuterAlt(_localctx, 1); - setState(451); + setState(480); match(TParser::L_BRACKET); - setState(452); + setState(481); typeList(); - setState(454); + setState(483); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::COMMA) { - setState(453); + setState(482); match(TParser::COMMA); } - setState(456); + setState(485); match(TParser::R_BRACKET); } @@ -3868,6 +4032,10 @@ TParser::TypeNameContext::TypeNameContext(ParserRuleContext *parent, size_t invo : ParserRuleContext(parent, invokingState) { } +TParser::QualifiedIdentContext* TParser::TypeNameContext::qualifiedIdent() { + return getRuleContext(0); +} + tree::TerminalNode* TParser::TypeNameContext::IDENTIFIER() { return getToken(TParser::IDENTIFIER, 0); } @@ -3887,7 +4055,7 @@ std::any TParser::TypeNameContext::accept(tree::ParseTreeVisitor *visitor) { TParser::TypeNameContext* TParser::typeName() { TypeNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 84, TParser::RuleTypeName); + enterRule(_localctx, 86, TParser::RuleTypeName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3897,9 +4065,26 @@ TParser::TypeNameContext* TParser::typeName() { exitRule(); }); try { - enterOuterAlt(_localctx, 1); - setState(458); - match(TParser::IDENTIFIER); + setState(489); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 47, _ctx)) { + case 1: { + enterOuterAlt(_localctx, 1); + setState(487); + qualifiedIdent(); + break; + } + + case 2: { + enterOuterAlt(_localctx, 2); + setState(488); + match(TParser::IDENTIFIER); + break; + } + + default: + break; + } } catch (RecognitionException &e) { @@ -3921,10 +4106,18 @@ TParser::ArrayTypeContext* TParser::TypeLitContext::arrayType() { return getRuleContext(0); } +TParser::StructTypeContext* TParser::TypeLitContext::structType() { + return getRuleContext(0); +} + TParser::FunctionTypeContext* TParser::TypeLitContext::functionType() { return getRuleContext(0); } +TParser::SliceTypeContext* TParser::TypeLitContext::sliceType() { + return getRuleContext(0); +} + TParser::SyncChannelTypeContext* TParser::TypeLitContext::syncChannelType() { return getRuleContext(0); } @@ -3948,7 +4141,7 @@ std::any TParser::TypeLitContext::accept(tree::ParseTreeVisitor *visitor) { TParser::TypeLitContext* TParser::typeLit() { TypeLitContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 86, TParser::RuleTypeLit); + enterRule(_localctx, 88, TParser::RuleTypeLit); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3958,39 +4151,53 @@ TParser::TypeLitContext* TParser::typeLit() { exitRule(); }); try { - setState(464); + setState(497); _errHandler->sync(this); - switch (_input->LA(1)) { - case TParser::L_BRACKET: { - enterOuterAlt(_localctx, 1); - setState(460); - arrayType(); - break; - } + switch (getInterpreter()->adaptivePredict(_input, 48, _ctx)) { + case 1: { + enterOuterAlt(_localctx, 1); + setState(491); + arrayType(); + break; + } - case TParser::FUNC: { - enterOuterAlt(_localctx, 2); - setState(461); - functionType(); - break; - } + case 2: { + enterOuterAlt(_localctx, 2); + setState(492); + structType(); + break; + } - case TParser::SYNC: { - enterOuterAlt(_localctx, 3); - setState(462); - syncChannelType(); - break; - } + case 3: { + enterOuterAlt(_localctx, 3); + setState(493); + functionType(); + break; + } - case TParser::ASYNC: { - enterOuterAlt(_localctx, 4); - setState(463); - asyncChannelType(); - break; - } + case 4: { + enterOuterAlt(_localctx, 4); + setState(494); + sliceType(); + break; + } + + case 5: { + enterOuterAlt(_localctx, 5); + setState(495); + syncChannelType(); + break; + } + + case 6: { + enterOuterAlt(_localctx, 6); + setState(496); + asyncChannelType(); + break; + } default: - throw NoViableAltException(this); + break; } } @@ -4013,10 +4220,6 @@ tree::TerminalNode* TParser::ArrayTypeContext::L_BRACKET() { return getToken(TParser::L_BRACKET, 0); } -TParser::ArrayLengthContext* TParser::ArrayTypeContext::arrayLength() { - return getRuleContext(0); -} - tree::TerminalNode* TParser::ArrayTypeContext::R_BRACKET() { return getToken(TParser::R_BRACKET, 0); } @@ -4025,6 +4228,10 @@ TParser::ElementTypeContext* TParser::ArrayTypeContext::elementType() { return getRuleContext(0); } +TParser::ArrayLengthContext* TParser::ArrayTypeContext::arrayLength() { + return getRuleContext(0); +} + size_t TParser::ArrayTypeContext::getRuleIndex() const { return TParser::RuleArrayType; @@ -4040,7 +4247,8 @@ std::any TParser::ArrayTypeContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ArrayTypeContext* TParser::arrayType() { ArrayTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 88, TParser::RuleArrayType); + enterRule(_localctx, 90, TParser::RuleArrayType); + size_t _la = 0; #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4051,13 +4259,20 @@ TParser::ArrayTypeContext* TParser::arrayType() { }); try { enterOuterAlt(_localctx, 1); - setState(466); + setState(499); match(TParser::L_BRACKET); - setState(467); - arrayLength(); - setState(468); + setState(501); + _errHandler->sync(this); + + _la = _input->LA(1); + if (((((_la - 10) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 10)) & 6976004354541110857) != 0)) { + setState(500); + arrayLength(); + } + setState(503); match(TParser::R_BRACKET); - setState(469); + setState(504); elementType(); } @@ -4095,7 +4310,7 @@ std::any TParser::ArrayLengthContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ArrayLengthContext* TParser::arrayLength() { ArrayLengthContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 90, TParser::RuleArrayLength); + enterRule(_localctx, 92, TParser::RuleArrayLength); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4106,7 +4321,7 @@ TParser::ArrayLengthContext* TParser::arrayLength() { }); try { enterOuterAlt(_localctx, 1); - setState(471); + setState(506); expression(0); } @@ -4144,7 +4359,7 @@ std::any TParser::ElementTypeContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ElementTypeContext* TParser::elementType() { ElementTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 92, TParser::RuleElementType); + enterRule(_localctx, 94, TParser::RuleElementType); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4155,7 +4370,7 @@ TParser::ElementTypeContext* TParser::elementType() { }); try { enterOuterAlt(_localctx, 1); - setState(473); + setState(508); type_(); } @@ -4168,6 +4383,67 @@ TParser::ElementTypeContext* TParser::elementType() { return _localctx; } +//----------------- SliceTypeContext ------------------------------------------------------------------ + +TParser::SliceTypeContext::SliceTypeContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* TParser::SliceTypeContext::L_BRACKET() { + return getToken(TParser::L_BRACKET, 0); +} + +tree::TerminalNode* TParser::SliceTypeContext::R_BRACKET() { + return getToken(TParser::R_BRACKET, 0); +} + +TParser::ElementTypeContext* TParser::SliceTypeContext::elementType() { + return getRuleContext(0); +} + + +size_t TParser::SliceTypeContext::getRuleIndex() const { + return TParser::RuleSliceType; +} + + +std::any TParser::SliceTypeContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitSliceType(this); + else + return visitor->visitChildren(this); +} + +TParser::SliceTypeContext* TParser::sliceType() { + SliceTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 96, TParser::RuleSliceType); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(510); + match(TParser::L_BRACKET); + setState(511); + match(TParser::R_BRACKET); + setState(512); + elementType(); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + //----------------- AsyncChannelTypeContext ------------------------------------------------------------------ TParser::AsyncChannelTypeContext::AsyncChannelTypeContext(ParserRuleContext *parent, size_t invokingState) @@ -4197,7 +4473,7 @@ std::any TParser::AsyncChannelTypeContext::accept(tree::ParseTreeVisitor *visito TParser::AsyncChannelTypeContext* TParser::asyncChannelType() { AsyncChannelTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 94, TParser::RuleAsyncChannelType); + enterRule(_localctx, 98, TParser::RuleAsyncChannelType); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4208,9 +4484,9 @@ TParser::AsyncChannelTypeContext* TParser::asyncChannelType() { }); try { enterOuterAlt(_localctx, 1); - setState(475); + setState(514); match(TParser::ASYNC); - setState(476); + setState(515); elementType(); } @@ -4252,7 +4528,7 @@ std::any TParser::SyncChannelTypeContext::accept(tree::ParseTreeVisitor *visitor TParser::SyncChannelTypeContext* TParser::syncChannelType() { SyncChannelTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 96, TParser::RuleSyncChannelType); + enterRule(_localctx, 100, TParser::RuleSyncChannelType); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4263,9 +4539,9 @@ TParser::SyncChannelTypeContext* TParser::syncChannelType() { }); try { enterOuterAlt(_localctx, 1); - setState(478); + setState(517); match(TParser::SYNC); - setState(479); + setState(518); signature(); } @@ -4307,7 +4583,7 @@ std::any TParser::FunctionTypeContext::accept(tree::ParseTreeVisitor *visitor) { TParser::FunctionTypeContext* TParser::functionType() { FunctionTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 98, TParser::RuleFunctionType); + enterRule(_localctx, 102, TParser::RuleFunctionType); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4318,9 +4594,9 @@ TParser::FunctionTypeContext* TParser::functionType() { }); try { enterOuterAlt(_localctx, 1); - setState(481); + setState(520); match(TParser::FUNC); - setState(482); + setState(521); signature(); } @@ -4362,7 +4638,7 @@ std::any TParser::SignatureContext::accept(tree::ParseTreeVisitor *visitor) { TParser::SignatureContext* TParser::signature() { SignatureContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 100, TParser::RuleSignature); + enterRule(_localctx, 104, TParser::RuleSignature); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4373,14 +4649,14 @@ TParser::SignatureContext* TParser::signature() { }); try { enterOuterAlt(_localctx, 1); - setState(484); + setState(523); parameters(); - setState(486); + setState(525); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 46, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 50, _ctx)) { case 1: { - setState(485); + setState(524); result(); break; } @@ -4428,7 +4704,7 @@ std::any TParser::ResultContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ResultContext* TParser::result() { ResultContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 102, TParser::RuleResult); + enterRule(_localctx, 106, TParser::RuleResult); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4438,19 +4714,19 @@ TParser::ResultContext* TParser::result() { exitRule(); }); try { - setState(490); + setState(529); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 47, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 51, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(488); + setState(527); parameters(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(489); + setState(528); type_(); break; } @@ -4514,7 +4790,7 @@ std::any TParser::ParametersContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ParametersContext* TParser::parameters() { ParametersContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 104, TParser::RuleParameters); + enterRule(_localctx, 108, TParser::RuleParameters); size_t _la = 0; #if __cplusplus > 201703L @@ -4527,40 +4803,40 @@ TParser::ParametersContext* TParser::parameters() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(492); + setState(531); match(TParser::L_PAREN); - setState(504); + setState(543); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 4621316) != 0)) { - setState(493); + ((1ULL << _la) & 18449412) != 0)) { + setState(532); parameterDecl(); - setState(498); + setState(537); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 48, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 52, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(494); + setState(533); match(TParser::COMMA); - setState(495); + setState(534); parameterDecl(); } - setState(500); + setState(539); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 48, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 52, _ctx); } - setState(502); + setState(541); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::COMMA) { - setState(501); + setState(540); match(TParser::COMMA); } } - setState(506); + setState(545); match(TParser::R_PAREN); } @@ -4602,7 +4878,7 @@ std::any TParser::ParameterDeclContext::accept(tree::ParseTreeVisitor *visitor) TParser::ParameterDeclContext* TParser::parameterDecl() { ParameterDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 106, TParser::RuleParameterDecl); + enterRule(_localctx, 110, TParser::RuleParameterDecl); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4613,12 +4889,12 @@ TParser::ParameterDeclContext* TParser::parameterDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(509); + setState(548); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 51, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 55, _ctx)) { case 1: { - setState(508); + setState(547); identifierList(); break; } @@ -4626,7 +4902,7 @@ TParser::ParameterDeclContext* TParser::parameterDecl() { default: break; } - setState(511); + setState(550); type_(); } @@ -4765,8 +5041,8 @@ TParser::ExpressionContext* TParser::expression(int precedence) { TParser::ExpressionContext *_localctx = _tracker.createInstance(_ctx, parentState); TParser::ExpressionContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. - size_t startState = 108; - enterRecursionRule(_localctx, 108, TParser::RuleExpression, precedence); + size_t startState = 112; + enterRecursionRule(_localctx, 112, TParser::RuleExpression, precedence); size_t _la = 0; @@ -4780,11 +5056,12 @@ TParser::ExpressionContext* TParser::expression(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(517); + setState(556); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::FUNC: case TParser::NIL_LIT: + case TParser::STRUCT: case TParser::IDENTIFIER: case TParser::L_PAREN: case TParser::L_BRACKET: @@ -4797,7 +5074,7 @@ TParser::ExpressionContext* TParser::expression(int precedence) { case TParser::RUNE_LIT: case TParser::RAW_STRING_LIT: case TParser::INTERPRETED_STRING_LIT: { - setState(514); + setState(553); primaryExpr(); break; } @@ -4808,18 +5085,18 @@ TParser::ExpressionContext* TParser::expression(int precedence) { case TParser::CARET: case TParser::STAR: case TParser::AMPERSAND: { - setState(515); + setState(554); antlrcpp::downCast(_localctx)->unary_op = _input->LT(1); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 8866461766385664) != 0))) { + ((1ULL << _la) & 70931694131085312) != 0))) { antlrcpp::downCast(_localctx)->unary_op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } - setState(516); + setState(555); expression(7); break; } @@ -4828,26 +5105,26 @@ TParser::ExpressionContext* TParser::expression(int precedence) { throw NoViableAltException(this); } _ctx->stop = _input->LT(-1); - setState(539); + setState(578); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 54, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 58, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) triggerExitRuleEvent(); previousContext = _localctx; - setState(537); + setState(576); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 53, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 57, _ctx)) { case 1: { _localctx = _tracker.createInstance(parentContext, parentState); pushNewRecursionContext(_localctx, startState, RuleExpression); - setState(519); + setState(558); if (!(precpred(_ctx, 6))) throw FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(520); + setState(559); match(TParser::EMIT); - setState(521); + setState(560); expression(7); break; } @@ -4855,21 +5132,21 @@ TParser::ExpressionContext* TParser::expression(int precedence) { case 2: { _localctx = _tracker.createInstance(parentContext, parentState); pushNewRecursionContext(_localctx, startState, RuleExpression); - setState(522); + setState(561); if (!(precpred(_ctx, 5))) throw FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(523); + setState(562); antlrcpp::downCast(_localctx)->mul_op = _input->LT(1); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 6823569161977856) != 0))) { + ((1ULL << _la) & 54588553295822848) != 0))) { antlrcpp::downCast(_localctx)->mul_op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } - setState(524); + setState(563); expression(6); break; } @@ -4877,21 +5154,21 @@ TParser::ExpressionContext* TParser::expression(int precedence) { case 3: { _localctx = _tracker.createInstance(parentContext, parentState); pushNewRecursionContext(_localctx, startState, RuleExpression); - setState(525); + setState(564); if (!(precpred(_ctx, 4))) throw FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(526); + setState(565); antlrcpp::downCast(_localctx)->add_op = _input->LT(1); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 1971424348602368) != 0))) { + ((1ULL << _la) & 15771394788818944) != 0))) { antlrcpp::downCast(_localctx)->add_op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } - setState(527); + setState(566); expression(5); break; } @@ -4899,21 +5176,21 @@ TParser::ExpressionContext* TParser::expression(int precedence) { case 4: { _localctx = _tracker.createInstance(parentContext, parentState); pushNewRecursionContext(_localctx, startState, RuleExpression); - setState(528); + setState(567); if (!(precpred(_ctx, 3))) throw FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(529); + setState(568); antlrcpp::downCast(_localctx)->rel_op = _input->LT(1); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 1082331758592) != 0))) { + ((1ULL << _la) & 8658654068736) != 0))) { antlrcpp::downCast(_localctx)->rel_op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } - setState(530); + setState(569); expression(4); break; } @@ -4921,12 +5198,12 @@ TParser::ExpressionContext* TParser::expression(int precedence) { case 5: { _localctx = _tracker.createInstance(parentContext, parentState); pushNewRecursionContext(_localctx, startState, RuleExpression); - setState(531); + setState(570); if (!(precpred(_ctx, 2))) throw FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(532); + setState(571); match(TParser::LOGICAL_AND); - setState(533); + setState(572); expression(3); break; } @@ -4934,12 +5211,12 @@ TParser::ExpressionContext* TParser::expression(int precedence) { case 6: { _localctx = _tracker.createInstance(parentContext, parentState); pushNewRecursionContext(_localctx, startState, RuleExpression); - setState(534); + setState(573); if (!(precpred(_ctx, 1))) throw FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(535); + setState(574); match(TParser::LOGICAL_OR); - setState(536); + setState(575); expression(2); break; } @@ -4948,9 +5225,9 @@ TParser::ExpressionContext* TParser::expression(int precedence) { break; } } - setState(541); + setState(580); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 54, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 58, _ctx); } } catch (RecognitionException &e) { @@ -4971,6 +5248,30 @@ TParser::OperandContext* TParser::PrimaryExprContext::operand() { return getRuleContext(0); } +std::vector TParser::PrimaryExprContext::DOT() { + return getTokens(TParser::DOT); +} + +tree::TerminalNode* TParser::PrimaryExprContext::DOT(size_t i) { + return getToken(TParser::DOT, i); +} + +std::vector TParser::PrimaryExprContext::index() { + return getRuleContexts(); +} + +TParser::IndexContext* TParser::PrimaryExprContext::index(size_t i) { + return getRuleContext(i); +} + +std::vector TParser::PrimaryExprContext::slice_() { + return getRuleContexts(); +} + +TParser::Slice_Context* TParser::PrimaryExprContext::slice_(size_t i) { + return getRuleContext(i); +} + std::vector TParser::PrimaryExprContext::arguments() { return getRuleContexts(); } @@ -4979,6 +5280,14 @@ TParser::ArgumentsContext* TParser::PrimaryExprContext::arguments(size_t i) { return getRuleContext(i); } +std::vector TParser::PrimaryExprContext::IDENTIFIER() { + return getTokens(TParser::IDENTIFIER); +} + +tree::TerminalNode* TParser::PrimaryExprContext::IDENTIFIER(size_t i) { + return getToken(TParser::IDENTIFIER, i); +} + size_t TParser::PrimaryExprContext::getRuleIndex() const { return TParser::RulePrimaryExpr; @@ -4994,7 +5303,7 @@ std::any TParser::PrimaryExprContext::accept(tree::ParseTreeVisitor *visitor) { TParser::PrimaryExprContext* TParser::primaryExpr() { PrimaryExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 110, TParser::RulePrimaryExpr); + enterRule(_localctx, 114, TParser::RulePrimaryExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5006,19 +5315,59 @@ TParser::PrimaryExprContext* TParser::primaryExpr() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(542); + setState(581); operand(); - setState(546); + setState(594); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 55, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 61, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(543); - arguments(); + setState(592); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 60, _ctx)) { + case 1: { + setState(582); + match(TParser::DOT); + setState(586); + _errHandler->sync(this); + alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); + while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { + if (alt == 1) { + setState(583); + match(TParser::IDENTIFIER); + } + setState(588); + _errHandler->sync(this); + alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); + } + break; + } + + case 2: { + setState(589); + index(); + break; + } + + case 3: { + setState(590); + slice_(); + break; + } + + case 4: { + setState(591); + arguments(); + break; + } + + default: + break; + } } - setState(548); + setState(596); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 55, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 61, _ctx); } } @@ -5072,7 +5421,7 @@ std::any TParser::ConversionContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ConversionContext* TParser::conversion() { ConversionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 112, TParser::RuleConversion); + enterRule(_localctx, 116, TParser::RuleConversion); size_t _la = 0; #if __cplusplus > 201703L @@ -5084,21 +5433,21 @@ TParser::ConversionContext* TParser::conversion() { }); try { enterOuterAlt(_localctx, 1); - setState(549); + setState(597); type_(); - setState(550); + setState(598); match(TParser::L_PAREN); - setState(551); + setState(599); expression(0); - setState(553); + setState(601); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::COMMA) { - setState(552); + setState(600); match(TParser::COMMA); } - setState(555); + setState(603); match(TParser::R_PAREN); } @@ -5156,7 +5505,7 @@ std::any TParser::OperandContext::accept(tree::ParseTreeVisitor *visitor) { TParser::OperandContext* TParser::operand() { OperandContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 114, TParser::RuleOperand); + enterRule(_localctx, 118, TParser::RuleOperand); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5166,26 +5515,26 @@ TParser::OperandContext* TParser::operand() { exitRule(); }); try { - setState(566); + setState(614); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 58, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 64, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(557); + setState(605); literal(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(558); + setState(606); operandName(); - setState(560); + setState(608); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 57, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 63, _ctx)) { case 1: { - setState(559); + setState(607); typeArgs(); break; } @@ -5198,11 +5547,11 @@ TParser::OperandContext* TParser::operand() { case 3: { enterOuterAlt(_localctx, 3); - setState(562); + setState(610); match(TParser::L_PAREN); - setState(563); + setState(611); expression(0); - setState(564); + setState(612); match(TParser::R_PAREN); break; } @@ -5254,7 +5603,7 @@ std::any TParser::LiteralContext::accept(tree::ParseTreeVisitor *visitor) { TParser::LiteralContext* TParser::literal() { LiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 116, TParser::RuleLiteral); + enterRule(_localctx, 120, TParser::RuleLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5264,7 +5613,7 @@ TParser::LiteralContext* TParser::literal() { exitRule(); }); try { - setState(571); + setState(619); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::NIL_LIT: @@ -5278,22 +5627,23 @@ TParser::LiteralContext* TParser::literal() { case TParser::RAW_STRING_LIT: case TParser::INTERPRETED_STRING_LIT: { enterOuterAlt(_localctx, 1); - setState(568); + setState(616); basicLit(); break; } + case TParser::STRUCT: case TParser::IDENTIFIER: case TParser::L_BRACKET: { enterOuterAlt(_localctx, 2); - setState(569); + setState(617); compositeLit(); break; } case TParser::FUNC: { enterOuterAlt(_localctx, 3); - setState(570); + setState(618); functionLit(); break; } @@ -5349,7 +5699,7 @@ std::any TParser::BasicLitContext::accept(tree::ParseTreeVisitor *visitor) { TParser::BasicLitContext* TParser::basicLit() { BasicLitContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 118, TParser::RuleBasicLit); + enterRule(_localctx, 122, TParser::RuleBasicLit); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5359,12 +5709,12 @@ TParser::BasicLitContext* TParser::basicLit() { exitRule(); }); try { - setState(577); + setState(625); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::NIL_LIT: { enterOuterAlt(_localctx, 1); - setState(573); + setState(621); match(TParser::NIL_LIT); break; } @@ -5376,7 +5726,7 @@ TParser::BasicLitContext* TParser::basicLit() { case TParser::IMAGINARY_LIT: case TParser::RUNE_LIT: { enterOuterAlt(_localctx, 2); - setState(574); + setState(622); integer(); break; } @@ -5384,14 +5734,14 @@ TParser::BasicLitContext* TParser::basicLit() { case TParser::RAW_STRING_LIT: case TParser::INTERPRETED_STRING_LIT: { enterOuterAlt(_localctx, 3); - setState(575); + setState(623); string_(); break; } case TParser::FLOAT_LIT: { enterOuterAlt(_localctx, 4); - setState(576); + setState(624); match(TParser::FLOAT_LIT); break; } @@ -5455,7 +5805,7 @@ std::any TParser::IntegerContext::accept(tree::ParseTreeVisitor *visitor) { TParser::IntegerContext* TParser::integer() { IntegerContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 120, TParser::RuleInteger); + enterRule(_localctx, 124, TParser::RuleInteger); size_t _la = 0; #if __cplusplus > 201703L @@ -5467,10 +5817,10 @@ TParser::IntegerContext* TParser::integer() { }); try { enterOuterAlt(_localctx, 1); - setState(579); + setState(627); _la = _input->LA(1); - if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 7187745005283311616) != 0))) { + if (!(((((_la - 57) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 57)) & 399) != 0))) { _errHandler->recoverInline(this); } else { @@ -5498,6 +5848,10 @@ tree::TerminalNode* TParser::OperandNameContext::IDENTIFIER() { return getToken(TParser::IDENTIFIER, 0); } +TParser::QualifiedIdentContext* TParser::OperandNameContext::qualifiedIdent() { + return getRuleContext(0); +} + size_t TParser::OperandNameContext::getRuleIndex() const { return TParser::RuleOperandName; @@ -5513,7 +5867,81 @@ std::any TParser::OperandNameContext::accept(tree::ParseTreeVisitor *visitor) { TParser::OperandNameContext* TParser::operandName() { OperandNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 122, TParser::RuleOperandName); + enterRule(_localctx, 126, TParser::RuleOperandName); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(631); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 67, _ctx)) { + case 1: { + enterOuterAlt(_localctx, 1); + setState(629); + match(TParser::IDENTIFIER); + break; + } + + case 2: { + enterOuterAlt(_localctx, 2); + setState(630); + qualifiedIdent(); + break; + } + + default: + break; + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- QualifiedIdentContext ------------------------------------------------------------------ + +TParser::QualifiedIdentContext::QualifiedIdentContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector TParser::QualifiedIdentContext::IDENTIFIER() { + return getTokens(TParser::IDENTIFIER); +} + +tree::TerminalNode* TParser::QualifiedIdentContext::IDENTIFIER(size_t i) { + return getToken(TParser::IDENTIFIER, i); +} + +tree::TerminalNode* TParser::QualifiedIdentContext::DOT() { + return getToken(TParser::DOT, 0); +} + + +size_t TParser::QualifiedIdentContext::getRuleIndex() const { + return TParser::RuleQualifiedIdent; +} + + +std::any TParser::QualifiedIdentContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitQualifiedIdent(this); + else + return visitor->visitChildren(this); +} + +TParser::QualifiedIdentContext* TParser::qualifiedIdent() { + QualifiedIdentContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 128, TParser::RuleQualifiedIdent); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5524,7 +5952,11 @@ TParser::OperandNameContext* TParser::operandName() { }); try { enterOuterAlt(_localctx, 1); - setState(581); + setState(633); + match(TParser::IDENTIFIER); + setState(634); + match(TParser::DOT); + setState(635); match(TParser::IDENTIFIER); } @@ -5566,7 +5998,7 @@ std::any TParser::CompositeLitContext::accept(tree::ParseTreeVisitor *visitor) { TParser::CompositeLitContext* TParser::compositeLit() { CompositeLitContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 124, TParser::RuleCompositeLit); + enterRule(_localctx, 130, TParser::RuleCompositeLit); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5577,9 +6009,9 @@ TParser::CompositeLitContext* TParser::compositeLit() { }); try { enterOuterAlt(_localctx, 1); - setState(583); + setState(637); literalType(); - setState(584); + setState(638); literalValue(); } @@ -5598,10 +6030,18 @@ TParser::LiteralTypeContext::LiteralTypeContext(ParserRuleContext *parent, size_ : ParserRuleContext(parent, invokingState) { } +TParser::StructTypeContext* TParser::LiteralTypeContext::structType() { + return getRuleContext(0); +} + TParser::ArrayTypeContext* TParser::LiteralTypeContext::arrayType() { return getRuleContext(0); } +TParser::SliceTypeContext* TParser::LiteralTypeContext::sliceType() { + return getRuleContext(0); +} + TParser::TypeNameContext* TParser::LiteralTypeContext::typeName() { return getRuleContext(0); } @@ -5625,7 +6065,7 @@ std::any TParser::LiteralTypeContext::accept(tree::ParseTreeVisitor *visitor) { TParser::LiteralTypeContext* TParser::literalType() { LiteralTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 126, TParser::RuleLiteralType); + enterRule(_localctx, 132, TParser::RuleLiteralType); size_t _la = 0; #if __cplusplus > 201703L @@ -5636,33 +6076,47 @@ TParser::LiteralTypeContext* TParser::literalType() { exitRule(); }); try { - setState(591); + setState(647); _errHandler->sync(this); - switch (_input->LA(1)) { - case TParser::L_BRACKET: { - enterOuterAlt(_localctx, 1); - setState(586); - arrayType(); - break; - } + switch (getInterpreter()->adaptivePredict(_input, 69, _ctx)) { + case 1: { + enterOuterAlt(_localctx, 1); + setState(640); + structType(); + break; + } - case TParser::IDENTIFIER: { - enterOuterAlt(_localctx, 2); - setState(587); - typeName(); - setState(589); - _errHandler->sync(this); + case 2: { + enterOuterAlt(_localctx, 2); + setState(641); + arrayType(); + break; + } - _la = _input->LA(1); - if (_la == TParser::L_BRACKET) { - setState(588); - typeArgs(); - } - break; + case 3: { + enterOuterAlt(_localctx, 3); + setState(642); + sliceType(); + break; + } + + case 4: { + enterOuterAlt(_localctx, 4); + setState(643); + typeName(); + setState(645); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == TParser::L_BRACKET) { + setState(644); + typeArgs(); } + break; + } default: - throw NoViableAltException(this); + break; } } @@ -5712,7 +6166,7 @@ std::any TParser::LiteralValueContext::accept(tree::ParseTreeVisitor *visitor) { TParser::LiteralValueContext* TParser::literalValue() { LiteralValueContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 128, TParser::RuleLiteralValue); + enterRule(_localctx, 134, TParser::RuleLiteralValue); size_t _la = 0; #if __cplusplus > 201703L @@ -5724,26 +6178,26 @@ TParser::LiteralValueContext* TParser::literalValue() { }); try { enterOuterAlt(_localctx, 1); - setState(593); + setState(649); match(TParser::L_CURLY); - setState(598); + setState(654); _errHandler->sync(this); _la = _input->LA(1); if (((((_la - 10) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 10)) & 872000544317642121) != 0)) { - setState(594); + ((1ULL << (_la - 10)) & 6976004354541114953) != 0)) { + setState(650); elementList(); - setState(596); + setState(652); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::COMMA) { - setState(595); + setState(651); match(TParser::COMMA); } } - setState(600); + setState(656); match(TParser::R_CURLY); } @@ -5793,7 +6247,7 @@ std::any TParser::ElementListContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ElementListContext* TParser::elementList() { ElementListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 130, TParser::RuleElementList); + enterRule(_localctx, 136, TParser::RuleElementList); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5805,21 +6259,21 @@ TParser::ElementListContext* TParser::elementList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(602); + setState(658); keyedElement(); - setState(607); + setState(663); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 65, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 72, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(603); + setState(659); match(TParser::COMMA); - setState(604); + setState(660); keyedElement(); } - setState(609); + setState(665); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 65, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 72, _ctx); } } @@ -5865,7 +6319,7 @@ std::any TParser::KeyedElementContext::accept(tree::ParseTreeVisitor *visitor) { TParser::KeyedElementContext* TParser::keyedElement() { KeyedElementContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 132, TParser::RuleKeyedElement); + enterRule(_localctx, 138, TParser::RuleKeyedElement); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5876,14 +6330,14 @@ TParser::KeyedElementContext* TParser::keyedElement() { }); try { enterOuterAlt(_localctx, 1); - setState(613); + setState(669); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 66, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 73, _ctx)) { case 1: { - setState(610); + setState(666); key(); - setState(611); + setState(667); match(TParser::COLON); break; } @@ -5891,7 +6345,7 @@ TParser::KeyedElementContext* TParser::keyedElement() { default: break; } - setState(615); + setState(671); element(); } @@ -5933,7 +6387,7 @@ std::any TParser::KeyContext::accept(tree::ParseTreeVisitor *visitor) { TParser::KeyContext* TParser::key() { KeyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 134, TParser::RuleKey); + enterRule(_localctx, 140, TParser::RuleKey); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5943,11 +6397,12 @@ TParser::KeyContext* TParser::key() { exitRule(); }); try { - setState(619); + setState(675); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::FUNC: case TParser::NIL_LIT: + case TParser::STRUCT: case TParser::IDENTIFIER: case TParser::L_PAREN: case TParser::L_BRACKET: @@ -5967,14 +6422,14 @@ TParser::KeyContext* TParser::key() { case TParser::RAW_STRING_LIT: case TParser::INTERPRETED_STRING_LIT: { enterOuterAlt(_localctx, 1); - setState(617); + setState(673); expression(0); break; } case TParser::L_CURLY: { enterOuterAlt(_localctx, 2); - setState(618); + setState(674); literalValue(); break; } @@ -6022,7 +6477,7 @@ std::any TParser::ElementContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ElementContext* TParser::element() { ElementContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 136, TParser::RuleElement); + enterRule(_localctx, 142, TParser::RuleElement); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6032,11 +6487,12 @@ TParser::ElementContext* TParser::element() { exitRule(); }); try { - setState(623); + setState(679); _errHandler->sync(this); switch (_input->LA(1)) { case TParser::FUNC: case TParser::NIL_LIT: + case TParser::STRUCT: case TParser::IDENTIFIER: case TParser::L_PAREN: case TParser::L_BRACKET: @@ -6056,14 +6512,14 @@ TParser::ElementContext* TParser::element() { case TParser::RAW_STRING_LIT: case TParser::INTERPRETED_STRING_LIT: { enterOuterAlt(_localctx, 1); - setState(621); + setState(677); expression(0); break; } case TParser::L_CURLY: { enterOuterAlt(_localctx, 2); - setState(622); + setState(678); literalValue(); break; } @@ -6082,36 +6538,218 @@ TParser::ElementContext* TParser::element() { return _localctx; } -//----------------- String_Context ------------------------------------------------------------------ +//----------------- StructTypeContext ------------------------------------------------------------------ -TParser::String_Context::String_Context(ParserRuleContext *parent, size_t invokingState) +TParser::StructTypeContext::StructTypeContext(ParserRuleContext *parent, size_t invokingState) : ParserRuleContext(parent, invokingState) { } -tree::TerminalNode* TParser::String_Context::RAW_STRING_LIT() { - return getToken(TParser::RAW_STRING_LIT, 0); +tree::TerminalNode* TParser::StructTypeContext::STRUCT() { + return getToken(TParser::STRUCT, 0); } -tree::TerminalNode* TParser::String_Context::INTERPRETED_STRING_LIT() { - return getToken(TParser::INTERPRETED_STRING_LIT, 0); +tree::TerminalNode* TParser::StructTypeContext::L_CURLY() { + return getToken(TParser::L_CURLY, 0); } - -size_t TParser::String_Context::getRuleIndex() const { - return TParser::RuleString_; +tree::TerminalNode* TParser::StructTypeContext::R_CURLY() { + return getToken(TParser::R_CURLY, 0); } +std::vector TParser::StructTypeContext::fieldDecl() { + return getRuleContexts(); +} -std::any TParser::String_Context::accept(tree::ParseTreeVisitor *visitor) { - if (auto parserVisitor = dynamic_cast(visitor)) - return parserVisitor->visitString_(this); - else - return visitor->visitChildren(this); +TParser::FieldDeclContext* TParser::StructTypeContext::fieldDecl(size_t i) { + return getRuleContext(i); +} + +std::vector TParser::StructTypeContext::eos() { + return getRuleContexts(); +} + +TParser::EosContext* TParser::StructTypeContext::eos(size_t i) { + return getRuleContext(i); +} + + +size_t TParser::StructTypeContext::getRuleIndex() const { + return TParser::RuleStructType; +} + + +std::any TParser::StructTypeContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitStructType(this); + else + return visitor->visitChildren(this); +} + +TParser::StructTypeContext* TParser::structType() { + StructTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 144, TParser::RuleStructType); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(681); + match(TParser::STRUCT); + setState(682); + match(TParser::L_CURLY); + setState(688); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == TParser::IDENTIFIER + + || _la == TParser::STAR) { + setState(683); + fieldDecl(); + setState(684); + eos(); + setState(690); + _errHandler->sync(this); + _la = _input->LA(1); + } + setState(691); + match(TParser::R_CURLY); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- FieldDeclContext ------------------------------------------------------------------ + +TParser::FieldDeclContext::FieldDeclContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +TParser::IdentifierListContext* TParser::FieldDeclContext::identifierList() { + return getRuleContext(0); +} + +TParser::Type_Context* TParser::FieldDeclContext::type_() { + return getRuleContext(0); +} + +TParser::EmbeddedFieldContext* TParser::FieldDeclContext::embeddedField() { + return getRuleContext(0); +} + +TParser::String_Context* TParser::FieldDeclContext::string_() { + return getRuleContext(0); +} + + +size_t TParser::FieldDeclContext::getRuleIndex() const { + return TParser::RuleFieldDecl; +} + + +std::any TParser::FieldDeclContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitFieldDecl(this); + else + return visitor->visitChildren(this); +} + +TParser::FieldDeclContext* TParser::fieldDecl() { + FieldDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 146, TParser::RuleFieldDecl); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(697); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 77, _ctx)) { + case 1: { + setState(693); + identifierList(); + setState(694); + type_(); + break; + } + + case 2: { + setState(696); + embeddedField(); + break; + } + + default: + break; + } + setState(700); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == TParser::RAW_STRING_LIT + + || _la == TParser::INTERPRETED_STRING_LIT) { + setState(699); + antlrcpp::downCast(_localctx)->tag = string_(); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- String_Context ------------------------------------------------------------------ + +TParser::String_Context::String_Context(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* TParser::String_Context::RAW_STRING_LIT() { + return getToken(TParser::RAW_STRING_LIT, 0); +} + +tree::TerminalNode* TParser::String_Context::INTERPRETED_STRING_LIT() { + return getToken(TParser::INTERPRETED_STRING_LIT, 0); +} + + +size_t TParser::String_Context::getRuleIndex() const { + return TParser::RuleString_; +} + + +std::any TParser::String_Context::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitString_(this); + else + return visitor->visitChildren(this); } TParser::String_Context* TParser::string_() { String_Context *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 138, TParser::RuleString_); + enterRule(_localctx, 148, TParser::RuleString_); size_t _la = 0; #if __cplusplus > 201703L @@ -6123,7 +6761,7 @@ TParser::String_Context* TParser::string_() { }); try { enterOuterAlt(_localctx, 1); - setState(625); + setState(702); _la = _input->LA(1); if (!(_la == TParser::RAW_STRING_LIT @@ -6145,6 +6783,80 @@ TParser::String_Context* TParser::string_() { return _localctx; } +//----------------- EmbeddedFieldContext ------------------------------------------------------------------ + +TParser::EmbeddedFieldContext::EmbeddedFieldContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +TParser::TypeNameContext* TParser::EmbeddedFieldContext::typeName() { + return getRuleContext(0); +} + +tree::TerminalNode* TParser::EmbeddedFieldContext::STAR() { + return getToken(TParser::STAR, 0); +} + +TParser::TypeArgsContext* TParser::EmbeddedFieldContext::typeArgs() { + return getRuleContext(0); +} + + +size_t TParser::EmbeddedFieldContext::getRuleIndex() const { + return TParser::RuleEmbeddedField; +} + + +std::any TParser::EmbeddedFieldContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitEmbeddedField(this); + else + return visitor->visitChildren(this); +} + +TParser::EmbeddedFieldContext* TParser::embeddedField() { + EmbeddedFieldContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 150, TParser::RuleEmbeddedField); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(705); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == TParser::STAR) { + setState(704); + match(TParser::STAR); + } + setState(707); + typeName(); + setState(709); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == TParser::L_BRACKET) { + setState(708); + typeArgs(); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + //----------------- FunctionLitContext ------------------------------------------------------------------ TParser::FunctionLitContext::FunctionLitContext(ParserRuleContext *parent, size_t invokingState) @@ -6178,7 +6890,7 @@ std::any TParser::FunctionLitContext::accept(tree::ParseTreeVisitor *visitor) { TParser::FunctionLitContext* TParser::functionLit() { FunctionLitContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 140, TParser::RuleFunctionLit); + enterRule(_localctx, 152, TParser::RuleFunctionLit); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6189,11 +6901,11 @@ TParser::FunctionLitContext* TParser::functionLit() { }); try { enterOuterAlt(_localctx, 1); - setState(627); + setState(711); match(TParser::FUNC); - setState(628); + setState(712); signature(); - setState(629); + setState(713); block(); } @@ -6239,7 +6951,7 @@ std::any TParser::IndexContext::accept(tree::ParseTreeVisitor *visitor) { TParser::IndexContext* TParser::index() { IndexContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 142, TParser::RuleIndex); + enterRule(_localctx, 154, TParser::RuleIndex); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6250,11 +6962,134 @@ TParser::IndexContext* TParser::index() { }); try { enterOuterAlt(_localctx, 1); - setState(631); + setState(715); match(TParser::L_BRACKET); - setState(632); + setState(716); expression(0); - setState(633); + setState(717); + match(TParser::R_BRACKET); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- Slice_Context ------------------------------------------------------------------ + +TParser::Slice_Context::Slice_Context(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* TParser::Slice_Context::L_BRACKET() { + return getToken(TParser::L_BRACKET, 0); +} + +tree::TerminalNode* TParser::Slice_Context::R_BRACKET() { + return getToken(TParser::R_BRACKET, 0); +} + +std::vector TParser::Slice_Context::COLON() { + return getTokens(TParser::COLON); +} + +tree::TerminalNode* TParser::Slice_Context::COLON(size_t i) { + return getToken(TParser::COLON, i); +} + +std::vector TParser::Slice_Context::expression() { + return getRuleContexts(); +} + +TParser::ExpressionContext* TParser::Slice_Context::expression(size_t i) { + return getRuleContext(i); +} + + +size_t TParser::Slice_Context::getRuleIndex() const { + return TParser::RuleSlice_; +} + + +std::any TParser::Slice_Context::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitSlice_(this); + else + return visitor->visitChildren(this); +} + +TParser::Slice_Context* TParser::slice_() { + Slice_Context *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 156, TParser::RuleSlice_); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(719); + match(TParser::L_BRACKET); + setState(735); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 84, _ctx)) { + case 1: { + setState(721); + _errHandler->sync(this); + + _la = _input->LA(1); + if (((((_la - 10) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 10)) & 6976004354541110857) != 0)) { + setState(720); + expression(0); + } + setState(723); + match(TParser::COLON); + setState(725); + _errHandler->sync(this); + + _la = _input->LA(1); + if (((((_la - 10) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 10)) & 6976004354541110857) != 0)) { + setState(724); + expression(0); + } + break; + } + + case 2: { + setState(728); + _errHandler->sync(this); + + _la = _input->LA(1); + if (((((_la - 10) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 10)) & 6976004354541110857) != 0)) { + setState(727); + expression(0); + } + setState(730); + match(TParser::COLON); + setState(731); + expression(0); + setState(732); + match(TParser::COLON); + setState(733); + expression(0); + break; + } + + default: + break; + } + setState(737); match(TParser::R_BRACKET); } @@ -6312,7 +7147,7 @@ std::any TParser::ArgumentsContext::accept(tree::ParseTreeVisitor *visitor) { TParser::ArgumentsContext* TParser::arguments() { ArgumentsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 144, TParser::RuleArguments); + enterRule(_localctx, 158, TParser::RuleArguments); size_t _la = 0; #if __cplusplus > 201703L @@ -6324,36 +7159,35 @@ TParser::ArgumentsContext* TParser::arguments() { }); try { enterOuterAlt(_localctx, 1); - setState(635); + setState(739); match(TParser::L_PAREN); - setState(647); + setState(751); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 7484841843206038532) != 0) || _la == TParser::RAW_STRING_LIT - - || _la == TParser::INTERPRETED_STRING_LIT) { - setState(642); + ((1ULL << _la) & 4538502524501074948) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 387) != 0)) { + setState(746); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 70, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 86, _ctx)) { case 1: { - setState(636); + setState(740); expressionList(); break; } case 2: { - setState(637); + setState(741); type_(); - setState(640); + setState(744); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 69, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 85, _ctx)) { case 1: { - setState(638); + setState(742); match(TParser::COMMA); - setState(639); + setState(743); expressionList(); break; } @@ -6367,16 +7201,16 @@ TParser::ArgumentsContext* TParser::arguments() { default: break; } - setState(645); + setState(749); _errHandler->sync(this); _la = _input->LA(1); if (_la == TParser::COMMA) { - setState(644); + setState(748); match(TParser::COMMA); } } - setState(649); + setState(753); match(TParser::R_PAREN); } @@ -6422,7 +7256,7 @@ std::any TParser::EosContext::accept(tree::ParseTreeVisitor *visitor) { TParser::EosContext* TParser::eos() { EosContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 146, TParser::RuleEos); + enterRule(_localctx, 160, TParser::RuleEos); size_t _la = 0; #if __cplusplus > 201703L @@ -6434,7 +7268,7 @@ TParser::EosContext* TParser::eos() { }); try { enterOuterAlt(_localctx, 1); - setState(651); + setState(755); _la = _input->LA(1); if (!(_la == TParser::EOF @@ -6458,7 +7292,7 @@ TParser::EosContext* TParser::eos() { bool TParser::sempred(RuleContext *context, size_t ruleIndex, size_t predicateIndex) { switch (ruleIndex) { - case 54: return expressionSempred(antlrcpp::downCast(context), predicateIndex); + case 56: return expressionSempred(antlrcpp::downCast(context), predicateIndex); default: break; diff --git a/parser/generated/TParser.h b/parser/generated/TParser.h index d9136d2..61c5dbf 100644 --- a/parser/generated/TParser.h +++ b/parser/generated/TParser.h @@ -23,43 +23,45 @@ class TParser : public antlr4::Parser { enum { AS = 1, ASYNC = 2, BREAK = 3, CASE = 4, CONST = 5, CONTINUE = 6, ELSE = 7, FOR = 8, FROM = 9, FUNC = 10, JOIN = 11, IF = 12, NIL_LIT = 13, RETURN = 14, - SYNC = 15, VAR = 16, IDENTIFIER = 17, L_PAREN = 18, R_PAREN = 19, L_CURLY = 20, - R_CURLY = 21, L_BRACKET = 22, R_BRACKET = 23, ASSIGN = 24, COMMA = 25, - SEMI = 26, COLON = 27, PLUS_PLUS = 28, MINUS_MINUS = 29, DECLARE_ASSIGN = 30, - LOGICAL_OR = 31, LOGICAL_AND = 32, SYNC_RETURN = 33, EQUALS = 34, NOT_EQUALS = 35, - LESS = 36, LESS_OR_EQUALS = 37, GREATER = 38, GREATER_OR_EQUALS = 39, - OR = 40, DIV = 41, MOD = 42, LSHIFT = 43, RSHIFT = 44, BIT_CLEAR = 45, - UNDERLYING = 46, EXCLAMATION = 47, PLUS = 48, MINUS = 49, CARET = 50, - STAR = 51, AMPERSAND = 52, EMIT = 53, DECIMAL_LIT = 54, BINARY_LIT = 55, - OCTAL_LIT = 56, HEX_LIT = 57, FLOAT_LIT = 58, DECIMAL_FLOAT_LIT = 59, - HEX_FLOAT_LIT = 60, IMAGINARY_LIT = 61, RUNE_LIT = 62, BYTE_VALUE = 63, - OCTAL_BYTE_VALUE = 64, HEX_BYTE_VALUE = 65, LITTLE_U_VALUE = 66, BIG_U_VALUE = 67, - RAW_STRING_LIT = 68, INTERPRETED_STRING_LIT = 69, WS = 70, COMMENT = 71, - TERMINATOR = 72, LINE_COMMENT = 73, WS_NLSEMI = 74, COMMENT_NLSEMI = 75, - LINE_COMMENT_NLSEMI = 76, EOS = 77, OTHER = 78 + SYNC = 15, STRUCT = 16, TYPE = 17, VAR = 18, IDENTIFIER = 19, L_PAREN = 20, + R_PAREN = 21, L_CURLY = 22, R_CURLY = 23, L_BRACKET = 24, R_BRACKET = 25, + ASSIGN = 26, COMMA = 27, SEMI = 28, COLON = 29, DOT = 30, PLUS_PLUS = 31, + MINUS_MINUS = 32, DECLARE_ASSIGN = 33, LOGICAL_OR = 34, LOGICAL_AND = 35, + SYNC_RETURN = 36, EQUALS = 37, NOT_EQUALS = 38, LESS = 39, LESS_OR_EQUALS = 40, + GREATER = 41, GREATER_OR_EQUALS = 42, OR = 43, DIV = 44, MOD = 45, LSHIFT = 46, + RSHIFT = 47, BIT_CLEAR = 48, UNDERLYING = 49, EXCLAMATION = 50, PLUS = 51, + MINUS = 52, CARET = 53, STAR = 54, AMPERSAND = 55, EMIT = 56, DECIMAL_LIT = 57, + BINARY_LIT = 58, OCTAL_LIT = 59, HEX_LIT = 60, FLOAT_LIT = 61, DECIMAL_FLOAT_LIT = 62, + HEX_FLOAT_LIT = 63, IMAGINARY_LIT = 64, RUNE_LIT = 65, BYTE_VALUE = 66, + OCTAL_BYTE_VALUE = 67, HEX_BYTE_VALUE = 68, LITTLE_U_VALUE = 69, BIG_U_VALUE = 70, + RAW_STRING_LIT = 71, INTERPRETED_STRING_LIT = 72, WS = 73, COMMENT = 74, + TERMINATOR = 75, LINE_COMMENT = 76, WS_NLSEMI = 77, COMMENT_NLSEMI = 78, + LINE_COMMENT_NLSEMI = 79, EOS = 80, OTHER = 81 }; enum { RuleSourceFile = 0, RuleIdentifier = 1, RuleDeclaration = 2, RuleConstDecl = 3, - RuleConstSpec = 4, RuleIdentifierList = 5, RuleExpressionList = 6, RuleTypeSpec = 7, - RuleAliasDecl = 8, RuleTypeDef = 9, RuleTypeParameters = 10, RuleTypeParameterDecl = 11, - RuleTypeElement = 12, RuleTypeTerm = 13, RuleFunctionDecl = 14, RuleVarDecl = 15, - RuleVarSpec = 16, RuleBlock = 17, RuleStatementList = 18, RuleStatement = 19, - RuleSimpleStmt = 20, RuleExpressionStmt = 21, RuleSyncReturnStmt = 22, - RuleEmitStmt = 23, RuleIncDecStmt = 24, RuleAssignment = 25, RuleAssign_op = 26, - RuleShortVarDecl = 27, RuleReturnStmt = 28, RuleBreakStmt = 29, RuleContinueStmt = 30, - RuleIfStmt = 31, RuleTypeList = 32, RuleJoinStmt = 33, RuleMatchClause = 34, - RuleMatchCase = 35, RuleFromChanAs = 36, RuleForStmt = 37, RuleCondition = 38, - RuleForClause = 39, RuleType_ = 40, RuleTypeArgs = 41, RuleTypeName = 42, - RuleTypeLit = 43, RuleArrayType = 44, RuleArrayLength = 45, RuleElementType = 46, - RuleAsyncChannelType = 47, RuleSyncChannelType = 48, RuleFunctionType = 49, - RuleSignature = 50, RuleResult = 51, RuleParameters = 52, RuleParameterDecl = 53, - RuleExpression = 54, RulePrimaryExpr = 55, RuleConversion = 56, RuleOperand = 57, - RuleLiteral = 58, RuleBasicLit = 59, RuleInteger = 60, RuleOperandName = 61, - RuleCompositeLit = 62, RuleLiteralType = 63, RuleLiteralValue = 64, - RuleElementList = 65, RuleKeyedElement = 66, RuleKey = 67, RuleElement = 68, - RuleString_ = 69, RuleFunctionLit = 70, RuleIndex = 71, RuleArguments = 72, - RuleEos = 73 + RuleConstSpec = 4, RuleIdentifierList = 5, RuleExpressionList = 6, RuleTypeDecl = 7, + RuleTypeSpec = 8, RuleAliasDecl = 9, RuleTypeDef = 10, RuleTypeParameters = 11, + RuleTypeParameterDecl = 12, RuleTypeElement = 13, RuleTypeTerm = 14, + RuleFunctionDecl = 15, RuleVarDecl = 16, RuleVarSpec = 17, RuleBlock = 18, + RuleStatementList = 19, RuleStatement = 20, RuleSimpleStmt = 21, RuleExpressionStmt = 22, + RuleSyncReturnStmt = 23, RuleEmitStmt = 24, RuleIncDecStmt = 25, RuleAssignment = 26, + RuleAssign_op = 27, RuleShortVarDecl = 28, RuleReturnStmt = 29, RuleBreakStmt = 30, + RuleContinueStmt = 31, RuleIfStmt = 32, RuleTypeList = 33, RuleJoinStmt = 34, + RuleMatchClause = 35, RuleMatchCase = 36, RuleFromChanAs = 37, RuleForStmt = 38, + RuleCondition = 39, RuleForClause = 40, RuleType_ = 41, RuleTypeArgs = 42, + RuleTypeName = 43, RuleTypeLit = 44, RuleArrayType = 45, RuleArrayLength = 46, + RuleElementType = 47, RuleSliceType = 48, RuleAsyncChannelType = 49, + RuleSyncChannelType = 50, RuleFunctionType = 51, RuleSignature = 52, + RuleResult = 53, RuleParameters = 54, RuleParameterDecl = 55, RuleExpression = 56, + RulePrimaryExpr = 57, RuleConversion = 58, RuleOperand = 59, RuleLiteral = 60, + RuleBasicLit = 61, RuleInteger = 62, RuleOperandName = 63, RuleQualifiedIdent = 64, + RuleCompositeLit = 65, RuleLiteralType = 66, RuleLiteralValue = 67, + RuleElementList = 68, RuleKeyedElement = 69, RuleKey = 70, RuleElement = 71, + RuleStructType = 72, RuleFieldDecl = 73, RuleString_ = 74, RuleEmbeddedField = 75, + RuleFunctionLit = 76, RuleIndex = 77, RuleSlice_ = 78, RuleArguments = 79, + RuleEos = 80 }; explicit TParser(antlr4::TokenStream *input); @@ -94,6 +96,7 @@ class TParser : public antlr4::Parser { class ConstSpecContext; class IdentifierListContext; class ExpressionListContext; + class TypeDeclContext; class TypeSpecContext; class AliasDeclContext; class TypeDefContext; @@ -134,6 +137,7 @@ class TParser : public antlr4::Parser { class ArrayTypeContext; class ArrayLengthContext; class ElementTypeContext; + class SliceTypeContext; class AsyncChannelTypeContext; class SyncChannelTypeContext; class FunctionTypeContext; @@ -149,6 +153,7 @@ class TParser : public antlr4::Parser { class BasicLitContext; class IntegerContext; class OperandNameContext; + class QualifiedIdentContext; class CompositeLitContext; class LiteralTypeContext; class LiteralValueContext; @@ -156,9 +161,13 @@ class TParser : public antlr4::Parser { class KeyedElementContext; class KeyContext; class ElementContext; + class StructTypeContext; + class FieldDeclContext; class String_Context; + class EmbeddedFieldContext; class FunctionLitContext; class IndexContext; + class Slice_Context; class ArgumentsContext; class EosContext; @@ -201,6 +210,7 @@ class TParser : public antlr4::Parser { DeclarationContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; ConstDeclContext *constDecl(); + TypeDeclContext *typeDecl(); VarDeclContext *varDecl(); @@ -277,6 +287,25 @@ class TParser : public antlr4::Parser { ExpressionListContext* expressionList(); + class TypeDeclContext : public antlr4::ParserRuleContext { + public: + TypeDeclContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *TYPE(); + std::vector typeSpec(); + TypeSpecContext* typeSpec(size_t i); + antlr4::tree::TerminalNode *L_PAREN(); + antlr4::tree::TerminalNode *R_PAREN(); + std::vector eos(); + EosContext* eos(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + TypeDeclContext* typeDecl(); + class TypeSpecContext : public antlr4::ParserRuleContext { public: TypeSpecContext(antlr4::ParserRuleContext *parent, size_t invokingState); @@ -858,6 +887,7 @@ class TParser : public antlr4::Parser { public: TypeNameContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; + QualifiedIdentContext *qualifiedIdent(); antlr4::tree::TerminalNode *IDENTIFIER(); @@ -872,7 +902,9 @@ class TParser : public antlr4::Parser { TypeLitContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; ArrayTypeContext *arrayType(); + StructTypeContext *structType(); FunctionTypeContext *functionType(); + SliceTypeContext *sliceType(); SyncChannelTypeContext *syncChannelType(); AsyncChannelTypeContext *asyncChannelType(); @@ -888,9 +920,9 @@ class TParser : public antlr4::Parser { ArrayTypeContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; antlr4::tree::TerminalNode *L_BRACKET(); - ArrayLengthContext *arrayLength(); antlr4::tree::TerminalNode *R_BRACKET(); ElementTypeContext *elementType(); + ArrayLengthContext *arrayLength(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; @@ -925,6 +957,21 @@ class TParser : public antlr4::Parser { ElementTypeContext* elementType(); + class SliceTypeContext : public antlr4::ParserRuleContext { + public: + SliceTypeContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *L_BRACKET(); + antlr4::tree::TerminalNode *R_BRACKET(); + ElementTypeContext *elementType(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + SliceTypeContext* sliceType(); + class AsyncChannelTypeContext : public antlr4::ParserRuleContext { public: AsyncChannelTypeContext(antlr4::ParserRuleContext *parent, size_t invokingState); @@ -1072,8 +1119,16 @@ class TParser : public antlr4::Parser { PrimaryExprContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; OperandContext *operand(); + std::vector DOT(); + antlr4::tree::TerminalNode* DOT(size_t i); + std::vector index(); + IndexContext* index(size_t i); + std::vector slice_(); + Slice_Context* slice_(size_t i); std::vector arguments(); ArgumentsContext* arguments(size_t i); + std::vector IDENTIFIER(); + antlr4::tree::TerminalNode* IDENTIFIER(size_t i); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; @@ -1171,6 +1226,7 @@ class TParser : public antlr4::Parser { OperandNameContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; antlr4::tree::TerminalNode *IDENTIFIER(); + QualifiedIdentContext *qualifiedIdent(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; @@ -1179,6 +1235,21 @@ class TParser : public antlr4::Parser { OperandNameContext* operandName(); + class QualifiedIdentContext : public antlr4::ParserRuleContext { + public: + QualifiedIdentContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector IDENTIFIER(); + antlr4::tree::TerminalNode* IDENTIFIER(size_t i); + antlr4::tree::TerminalNode *DOT(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + QualifiedIdentContext* qualifiedIdent(); + class CompositeLitContext : public antlr4::ParserRuleContext { public: CompositeLitContext(antlr4::ParserRuleContext *parent, size_t invokingState); @@ -1197,7 +1268,9 @@ class TParser : public antlr4::Parser { public: LiteralTypeContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; + StructTypeContext *structType(); ArrayTypeContext *arrayType(); + SliceTypeContext *sliceType(); TypeNameContext *typeName(); TypeArgsContext *typeArgs(); @@ -1283,6 +1356,42 @@ class TParser : public antlr4::Parser { ElementContext* element(); + class StructTypeContext : public antlr4::ParserRuleContext { + public: + StructTypeContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *STRUCT(); + antlr4::tree::TerminalNode *L_CURLY(); + antlr4::tree::TerminalNode *R_CURLY(); + std::vector fieldDecl(); + FieldDeclContext* fieldDecl(size_t i); + std::vector eos(); + EosContext* eos(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + StructTypeContext* structType(); + + class FieldDeclContext : public antlr4::ParserRuleContext { + public: + TParser::String_Context *tag = nullptr; + FieldDeclContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + IdentifierListContext *identifierList(); + Type_Context *type_(); + EmbeddedFieldContext *embeddedField(); + String_Context *string_(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + FieldDeclContext* fieldDecl(); + class String_Context : public antlr4::ParserRuleContext { public: String_Context(antlr4::ParserRuleContext *parent, size_t invokingState); @@ -1297,6 +1406,21 @@ class TParser : public antlr4::Parser { String_Context* string_(); + class EmbeddedFieldContext : public antlr4::ParserRuleContext { + public: + EmbeddedFieldContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + TypeNameContext *typeName(); + antlr4::tree::TerminalNode *STAR(); + TypeArgsContext *typeArgs(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + EmbeddedFieldContext* embeddedField(); + class FunctionLitContext : public antlr4::ParserRuleContext { public: FunctionLitContext(antlr4::ParserRuleContext *parent, size_t invokingState); @@ -1327,6 +1451,24 @@ class TParser : public antlr4::Parser { IndexContext* index(); + class Slice_Context : public antlr4::ParserRuleContext { + public: + Slice_Context(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *L_BRACKET(); + antlr4::tree::TerminalNode *R_BRACKET(); + std::vector COLON(); + antlr4::tree::TerminalNode* COLON(size_t i); + std::vector expression(); + ExpressionContext* expression(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + Slice_Context* slice_(); + class ArgumentsContext : public antlr4::ParserRuleContext { public: ArgumentsContext(antlr4::ParserRuleContext *parent, size_t invokingState); diff --git a/parser/generated/TParser.interp b/parser/generated/TParser.interp index 6a8dd60..5772717 100644 --- a/parser/generated/TParser.interp +++ b/parser/generated/TParser.interp @@ -15,6 +15,8 @@ null 'nil' 'return' 'sync' +'struct' +'type' 'var' null '(' @@ -27,6 +29,7 @@ null ',' ';' ':' +'.' '++' '--' ':=' @@ -96,6 +99,8 @@ IF NIL_LIT RETURN SYNC +STRUCT +TYPE VAR IDENTIFIER L_PAREN @@ -108,6 +113,7 @@ ASSIGN COMMA SEMI COLON +DOT PLUS_PLUS MINUS_MINUS DECLARE_ASSIGN @@ -168,6 +174,7 @@ constDecl constSpec identifierList expressionList +typeDecl typeSpec aliasDecl typeDef @@ -208,6 +215,7 @@ typeLit arrayType arrayLength elementType +sliceType asyncChannelType syncChannelType functionType @@ -223,6 +231,7 @@ literal basicLit integer operandName +qualifiedIdent compositeLit literalType literalValue @@ -230,12 +239,16 @@ elementList keyedElement key element +structType +fieldDecl string_ +embeddedField functionLit index +slice_ arguments eos atn: -[4, 1, 78, 654, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 1, 0, 1, 0, 1, 0, 3, 0, 152, 8, 0, 1, 0, 1, 0, 5, 0, 156, 8, 0, 10, 0, 12, 0, 159, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 167, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 175, 8, 3, 10, 3, 12, 3, 178, 9, 3, 1, 3, 3, 3, 181, 8, 3, 1, 4, 1, 4, 3, 4, 185, 8, 4, 1, 4, 1, 4, 3, 4, 189, 8, 4, 1, 5, 1, 5, 1, 5, 5, 5, 194, 8, 5, 10, 5, 12, 5, 197, 9, 5, 1, 6, 1, 6, 1, 6, 5, 6, 202, 8, 6, 10, 6, 12, 6, 205, 9, 6, 1, 7, 1, 7, 3, 7, 209, 8, 7, 1, 8, 1, 8, 3, 8, 213, 8, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 3, 9, 220, 8, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 228, 8, 10, 10, 10, 12, 10, 231, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 5, 12, 241, 8, 12, 10, 12, 12, 12, 244, 9, 12, 1, 13, 3, 13, 247, 8, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 3, 14, 254, 8, 14, 1, 14, 1, 14, 3, 14, 258, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 266, 8, 15, 10, 15, 12, 15, 269, 9, 15, 1, 15, 3, 15, 272, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 278, 8, 16, 1, 16, 1, 16, 3, 16, 282, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 3, 18, 291, 8, 18, 1, 18, 1, 18, 1, 18, 5, 18, 296, 8, 18, 10, 18, 12, 18, 299, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 310, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 318, 8, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 3, 26, 338, 8, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 3, 28, 348, 8, 28, 1, 29, 1, 29, 3, 29, 352, 8, 29, 1, 30, 1, 30, 3, 30, 356, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 366, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 372, 8, 31, 3, 31, 374, 8, 31, 1, 32, 1, 32, 3, 32, 378, 8, 32, 1, 32, 1, 32, 1, 32, 3, 32, 383, 8, 32, 5, 32, 385, 8, 32, 10, 32, 12, 32, 388, 9, 32, 1, 33, 1, 33, 1, 33, 5, 33, 393, 8, 33, 10, 33, 12, 33, 396, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 408, 8, 35, 10, 35, 12, 35, 411, 9, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 419, 8, 36, 1, 37, 1, 37, 1, 37, 3, 37, 424, 8, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 3, 39, 431, 8, 39, 1, 39, 1, 39, 3, 39, 435, 8, 39, 1, 39, 1, 39, 3, 39, 439, 8, 39, 1, 40, 1, 40, 3, 40, 443, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 450, 8, 40, 1, 41, 1, 41, 1, 41, 3, 41, 455, 8, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 465, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 3, 50, 487, 8, 50, 1, 51, 1, 51, 3, 51, 491, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 5, 52, 497, 8, 52, 10, 52, 12, 52, 500, 9, 52, 1, 52, 3, 52, 503, 8, 52, 3, 52, 505, 8, 52, 1, 52, 1, 52, 1, 53, 3, 53, 510, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 518, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 538, 8, 54, 10, 54, 12, 54, 541, 9, 54, 1, 55, 1, 55, 5, 55, 545, 8, 55, 10, 55, 12, 55, 548, 9, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 554, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 3, 57, 561, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 567, 8, 57, 1, 58, 1, 58, 1, 58, 3, 58, 572, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 578, 8, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 3, 63, 590, 8, 63, 3, 63, 592, 8, 63, 1, 64, 1, 64, 1, 64, 3, 64, 597, 8, 64, 3, 64, 599, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 5, 65, 606, 8, 65, 10, 65, 12, 65, 609, 9, 65, 1, 66, 1, 66, 1, 66, 3, 66, 614, 8, 66, 1, 66, 1, 66, 1, 67, 1, 67, 3, 67, 620, 8, 67, 1, 68, 1, 68, 3, 68, 624, 8, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 641, 8, 72, 3, 72, 643, 8, 72, 1, 72, 3, 72, 646, 8, 72, 3, 72, 648, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 0, 1, 108, 74, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 0, 10, 1, 0, 28, 29, 2, 0, 40, 45, 48, 52, 2, 0, 26, 26, 77, 77, 1, 0, 47, 52, 2, 0, 41, 45, 51, 52, 2, 0, 40, 40, 48, 50, 1, 0, 34, 39, 2, 0, 54, 57, 61, 62, 1, 0, 68, 69, 2, 1, 26, 26, 77, 77, 678, 0, 157, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 4, 166, 1, 0, 0, 0, 6, 168, 1, 0, 0, 0, 8, 182, 1, 0, 0, 0, 10, 190, 1, 0, 0, 0, 12, 198, 1, 0, 0, 0, 14, 208, 1, 0, 0, 0, 16, 210, 1, 0, 0, 0, 18, 217, 1, 0, 0, 0, 20, 223, 1, 0, 0, 0, 22, 234, 1, 0, 0, 0, 24, 237, 1, 0, 0, 0, 26, 246, 1, 0, 0, 0, 28, 250, 1, 0, 0, 0, 30, 259, 1, 0, 0, 0, 32, 273, 1, 0, 0, 0, 34, 283, 1, 0, 0, 0, 36, 297, 1, 0, 0, 0, 38, 309, 1, 0, 0, 0, 40, 317, 1, 0, 0, 0, 42, 319, 1, 0, 0, 0, 44, 321, 1, 0, 0, 0, 46, 325, 1, 0, 0, 0, 48, 329, 1, 0, 0, 0, 50, 332, 1, 0, 0, 0, 52, 337, 1, 0, 0, 0, 54, 341, 1, 0, 0, 0, 56, 345, 1, 0, 0, 0, 58, 349, 1, 0, 0, 0, 60, 353, 1, 0, 0, 0, 62, 357, 1, 0, 0, 0, 64, 377, 1, 0, 0, 0, 66, 389, 1, 0, 0, 0, 68, 399, 1, 0, 0, 0, 70, 403, 1, 0, 0, 0, 72, 414, 1, 0, 0, 0, 74, 420, 1, 0, 0, 0, 76, 427, 1, 0, 0, 0, 78, 430, 1, 0, 0, 0, 80, 449, 1, 0, 0, 0, 82, 451, 1, 0, 0, 0, 84, 458, 1, 0, 0, 0, 86, 464, 1, 0, 0, 0, 88, 466, 1, 0, 0, 0, 90, 471, 1, 0, 0, 0, 92, 473, 1, 0, 0, 0, 94, 475, 1, 0, 0, 0, 96, 478, 1, 0, 0, 0, 98, 481, 1, 0, 0, 0, 100, 484, 1, 0, 0, 0, 102, 490, 1, 0, 0, 0, 104, 492, 1, 0, 0, 0, 106, 509, 1, 0, 0, 0, 108, 517, 1, 0, 0, 0, 110, 542, 1, 0, 0, 0, 112, 549, 1, 0, 0, 0, 114, 566, 1, 0, 0, 0, 116, 571, 1, 0, 0, 0, 118, 577, 1, 0, 0, 0, 120, 579, 1, 0, 0, 0, 122, 581, 1, 0, 0, 0, 124, 583, 1, 0, 0, 0, 126, 591, 1, 0, 0, 0, 128, 593, 1, 0, 0, 0, 130, 602, 1, 0, 0, 0, 132, 613, 1, 0, 0, 0, 134, 619, 1, 0, 0, 0, 136, 623, 1, 0, 0, 0, 138, 625, 1, 0, 0, 0, 140, 627, 1, 0, 0, 0, 142, 631, 1, 0, 0, 0, 144, 635, 1, 0, 0, 0, 146, 651, 1, 0, 0, 0, 148, 152, 3, 28, 14, 0, 149, 152, 3, 4, 2, 0, 150, 152, 3, 38, 19, 0, 151, 148, 1, 0, 0, 0, 151, 149, 1, 0, 0, 0, 151, 150, 1, 0, 0, 0, 152, 153, 1, 0, 0, 0, 153, 154, 3, 146, 73, 0, 154, 156, 1, 0, 0, 0, 155, 151, 1, 0, 0, 0, 156, 159, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 160, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 161, 5, 0, 0, 1, 161, 1, 1, 0, 0, 0, 162, 163, 5, 17, 0, 0, 163, 3, 1, 0, 0, 0, 164, 167, 3, 6, 3, 0, 165, 167, 3, 30, 15, 0, 166, 164, 1, 0, 0, 0, 166, 165, 1, 0, 0, 0, 167, 5, 1, 0, 0, 0, 168, 180, 5, 5, 0, 0, 169, 181, 3, 8, 4, 0, 170, 176, 5, 18, 0, 0, 171, 172, 3, 8, 4, 0, 172, 173, 3, 146, 73, 0, 173, 175, 1, 0, 0, 0, 174, 171, 1, 0, 0, 0, 175, 178, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 179, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 179, 181, 5, 19, 0, 0, 180, 169, 1, 0, 0, 0, 180, 170, 1, 0, 0, 0, 181, 7, 1, 0, 0, 0, 182, 188, 3, 10, 5, 0, 183, 185, 3, 80, 40, 0, 184, 183, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 5, 24, 0, 0, 187, 189, 3, 12, 6, 0, 188, 184, 1, 0, 0, 0, 188, 189, 1, 0, 0, 0, 189, 9, 1, 0, 0, 0, 190, 195, 5, 17, 0, 0, 191, 192, 5, 25, 0, 0, 192, 194, 5, 17, 0, 0, 193, 191, 1, 0, 0, 0, 194, 197, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 195, 196, 1, 0, 0, 0, 196, 11, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 203, 3, 108, 54, 0, 199, 200, 5, 25, 0, 0, 200, 202, 3, 108, 54, 0, 201, 199, 1, 0, 0, 0, 202, 205, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 13, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 206, 209, 3, 16, 8, 0, 207, 209, 3, 18, 9, 0, 208, 206, 1, 0, 0, 0, 208, 207, 1, 0, 0, 0, 209, 15, 1, 0, 0, 0, 210, 212, 5, 17, 0, 0, 211, 213, 3, 20, 10, 0, 212, 211, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 215, 5, 24, 0, 0, 215, 216, 3, 80, 40, 0, 216, 17, 1, 0, 0, 0, 217, 219, 5, 17, 0, 0, 218, 220, 3, 20, 10, 0, 219, 218, 1, 0, 0, 0, 219, 220, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 222, 3, 80, 40, 0, 222, 19, 1, 0, 0, 0, 223, 224, 5, 22, 0, 0, 224, 229, 3, 22, 11, 0, 225, 226, 5, 25, 0, 0, 226, 228, 3, 22, 11, 0, 227, 225, 1, 0, 0, 0, 228, 231, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 229, 1, 0, 0, 0, 232, 233, 5, 23, 0, 0, 233, 21, 1, 0, 0, 0, 234, 235, 3, 10, 5, 0, 235, 236, 3, 24, 12, 0, 236, 23, 1, 0, 0, 0, 237, 242, 3, 26, 13, 0, 238, 239, 5, 40, 0, 0, 239, 241, 3, 26, 13, 0, 240, 238, 1, 0, 0, 0, 241, 244, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 25, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 245, 247, 5, 46, 0, 0, 246, 245, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 3, 80, 40, 0, 249, 27, 1, 0, 0, 0, 250, 251, 5, 10, 0, 0, 251, 253, 5, 17, 0, 0, 252, 254, 3, 20, 10, 0, 253, 252, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 257, 3, 100, 50, 0, 256, 258, 3, 34, 17, 0, 257, 256, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 29, 1, 0, 0, 0, 259, 271, 5, 16, 0, 0, 260, 272, 3, 32, 16, 0, 261, 267, 5, 18, 0, 0, 262, 263, 3, 32, 16, 0, 263, 264, 3, 146, 73, 0, 264, 266, 1, 0, 0, 0, 265, 262, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 270, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 270, 272, 5, 19, 0, 0, 271, 260, 1, 0, 0, 0, 271, 261, 1, 0, 0, 0, 272, 31, 1, 0, 0, 0, 273, 281, 3, 10, 5, 0, 274, 277, 3, 80, 40, 0, 275, 276, 5, 24, 0, 0, 276, 278, 3, 12, 6, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 282, 1, 0, 0, 0, 279, 280, 5, 24, 0, 0, 280, 282, 3, 12, 6, 0, 281, 274, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 282, 33, 1, 0, 0, 0, 283, 284, 5, 20, 0, 0, 284, 285, 3, 36, 18, 0, 285, 286, 5, 21, 0, 0, 286, 35, 1, 0, 0, 0, 287, 291, 5, 26, 0, 0, 288, 291, 5, 77, 0, 0, 289, 291, 1, 0, 0, 0, 290, 287, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 290, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 3, 38, 19, 0, 293, 294, 3, 146, 73, 0, 294, 296, 1, 0, 0, 0, 295, 290, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 37, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 310, 3, 4, 2, 0, 301, 310, 3, 40, 20, 0, 302, 310, 3, 56, 28, 0, 303, 310, 3, 58, 29, 0, 304, 310, 3, 60, 30, 0, 305, 310, 3, 34, 17, 0, 306, 310, 3, 62, 31, 0, 307, 310, 3, 66, 33, 0, 308, 310, 3, 74, 37, 0, 309, 300, 1, 0, 0, 0, 309, 301, 1, 0, 0, 0, 309, 302, 1, 0, 0, 0, 309, 303, 1, 0, 0, 0, 309, 304, 1, 0, 0, 0, 309, 305, 1, 0, 0, 0, 309, 306, 1, 0, 0, 0, 309, 307, 1, 0, 0, 0, 309, 308, 1, 0, 0, 0, 310, 39, 1, 0, 0, 0, 311, 318, 3, 46, 23, 0, 312, 318, 3, 44, 22, 0, 313, 318, 3, 48, 24, 0, 314, 318, 3, 50, 25, 0, 315, 318, 3, 42, 21, 0, 316, 318, 3, 54, 27, 0, 317, 311, 1, 0, 0, 0, 317, 312, 1, 0, 0, 0, 317, 313, 1, 0, 0, 0, 317, 314, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 316, 1, 0, 0, 0, 318, 41, 1, 0, 0, 0, 319, 320, 3, 108, 54, 0, 320, 43, 1, 0, 0, 0, 321, 322, 3, 108, 54, 0, 322, 323, 5, 33, 0, 0, 323, 324, 3, 108, 54, 0, 324, 45, 1, 0, 0, 0, 325, 326, 3, 108, 54, 0, 326, 327, 5, 53, 0, 0, 327, 328, 3, 108, 54, 0, 328, 47, 1, 0, 0, 0, 329, 330, 3, 108, 54, 0, 330, 331, 7, 0, 0, 0, 331, 49, 1, 0, 0, 0, 332, 333, 3, 12, 6, 0, 333, 334, 3, 52, 26, 0, 334, 335, 3, 12, 6, 0, 335, 51, 1, 0, 0, 0, 336, 338, 7, 1, 0, 0, 337, 336, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 340, 5, 24, 0, 0, 340, 53, 1, 0, 0, 0, 341, 342, 3, 10, 5, 0, 342, 343, 5, 30, 0, 0, 343, 344, 3, 12, 6, 0, 344, 55, 1, 0, 0, 0, 345, 347, 5, 14, 0, 0, 346, 348, 3, 12, 6, 0, 347, 346, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 57, 1, 0, 0, 0, 349, 351, 5, 3, 0, 0, 350, 352, 5, 17, 0, 0, 351, 350, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 59, 1, 0, 0, 0, 353, 355, 5, 6, 0, 0, 354, 356, 5, 17, 0, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 61, 1, 0, 0, 0, 357, 365, 5, 12, 0, 0, 358, 366, 3, 108, 54, 0, 359, 360, 7, 2, 0, 0, 360, 366, 3, 108, 54, 0, 361, 362, 3, 40, 20, 0, 362, 363, 7, 2, 0, 0, 363, 364, 3, 108, 54, 0, 364, 366, 1, 0, 0, 0, 365, 358, 1, 0, 0, 0, 365, 359, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 366, 367, 1, 0, 0, 0, 367, 373, 3, 34, 17, 0, 368, 371, 5, 7, 0, 0, 369, 372, 3, 62, 31, 0, 370, 372, 3, 34, 17, 0, 371, 369, 1, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 374, 1, 0, 0, 0, 373, 368, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 63, 1, 0, 0, 0, 375, 378, 3, 80, 40, 0, 376, 378, 5, 13, 0, 0, 377, 375, 1, 0, 0, 0, 377, 376, 1, 0, 0, 0, 378, 386, 1, 0, 0, 0, 379, 382, 5, 25, 0, 0, 380, 383, 3, 80, 40, 0, 381, 383, 5, 13, 0, 0, 382, 380, 1, 0, 0, 0, 382, 381, 1, 0, 0, 0, 383, 385, 1, 0, 0, 0, 384, 379, 1, 0, 0, 0, 385, 388, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 65, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 389, 390, 5, 11, 0, 0, 390, 394, 5, 20, 0, 0, 391, 393, 3, 68, 34, 0, 392, 391, 1, 0, 0, 0, 393, 396, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 397, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 397, 398, 5, 21, 0, 0, 398, 67, 1, 0, 0, 0, 399, 400, 3, 70, 35, 0, 400, 401, 5, 27, 0, 0, 401, 402, 3, 36, 18, 0, 402, 69, 1, 0, 0, 0, 403, 409, 5, 4, 0, 0, 404, 405, 3, 72, 36, 0, 405, 406, 5, 25, 0, 0, 406, 408, 1, 0, 0, 0, 407, 404, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 412, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 412, 413, 3, 72, 36, 0, 413, 71, 1, 0, 0, 0, 414, 415, 5, 9, 0, 0, 415, 418, 5, 17, 0, 0, 416, 417, 5, 1, 0, 0, 417, 419, 5, 17, 0, 0, 418, 416, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 73, 1, 0, 0, 0, 420, 423, 5, 8, 0, 0, 421, 424, 3, 76, 38, 0, 422, 424, 3, 78, 39, 0, 423, 421, 1, 0, 0, 0, 423, 422, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 3, 34, 17, 0, 426, 75, 1, 0, 0, 0, 427, 428, 3, 108, 54, 0, 428, 77, 1, 0, 0, 0, 429, 431, 3, 40, 20, 0, 430, 429, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 434, 3, 146, 73, 0, 433, 435, 3, 108, 54, 0, 434, 433, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 438, 3, 146, 73, 0, 437, 439, 3, 40, 20, 0, 438, 437, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 79, 1, 0, 0, 0, 440, 442, 3, 84, 42, 0, 441, 443, 3, 82, 41, 0, 442, 441, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 450, 1, 0, 0, 0, 444, 450, 3, 86, 43, 0, 445, 446, 5, 18, 0, 0, 446, 447, 3, 80, 40, 0, 447, 448, 5, 19, 0, 0, 448, 450, 1, 0, 0, 0, 449, 440, 1, 0, 0, 0, 449, 444, 1, 0, 0, 0, 449, 445, 1, 0, 0, 0, 450, 81, 1, 0, 0, 0, 451, 452, 5, 22, 0, 0, 452, 454, 3, 64, 32, 0, 453, 455, 5, 25, 0, 0, 454, 453, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 5, 23, 0, 0, 457, 83, 1, 0, 0, 0, 458, 459, 5, 17, 0, 0, 459, 85, 1, 0, 0, 0, 460, 465, 3, 88, 44, 0, 461, 465, 3, 98, 49, 0, 462, 465, 3, 96, 48, 0, 463, 465, 3, 94, 47, 0, 464, 460, 1, 0, 0, 0, 464, 461, 1, 0, 0, 0, 464, 462, 1, 0, 0, 0, 464, 463, 1, 0, 0, 0, 465, 87, 1, 0, 0, 0, 466, 467, 5, 22, 0, 0, 467, 468, 3, 90, 45, 0, 468, 469, 5, 23, 0, 0, 469, 470, 3, 92, 46, 0, 470, 89, 1, 0, 0, 0, 471, 472, 3, 108, 54, 0, 472, 91, 1, 0, 0, 0, 473, 474, 3, 80, 40, 0, 474, 93, 1, 0, 0, 0, 475, 476, 5, 2, 0, 0, 476, 477, 3, 92, 46, 0, 477, 95, 1, 0, 0, 0, 478, 479, 5, 15, 0, 0, 479, 480, 3, 100, 50, 0, 480, 97, 1, 0, 0, 0, 481, 482, 5, 10, 0, 0, 482, 483, 3, 100, 50, 0, 483, 99, 1, 0, 0, 0, 484, 486, 3, 104, 52, 0, 485, 487, 3, 102, 51, 0, 486, 485, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 101, 1, 0, 0, 0, 488, 491, 3, 104, 52, 0, 489, 491, 3, 80, 40, 0, 490, 488, 1, 0, 0, 0, 490, 489, 1, 0, 0, 0, 491, 103, 1, 0, 0, 0, 492, 504, 5, 18, 0, 0, 493, 498, 3, 106, 53, 0, 494, 495, 5, 25, 0, 0, 495, 497, 3, 106, 53, 0, 496, 494, 1, 0, 0, 0, 497, 500, 1, 0, 0, 0, 498, 496, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 502, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 501, 503, 5, 25, 0, 0, 502, 501, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 505, 1, 0, 0, 0, 504, 493, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 5, 19, 0, 0, 507, 105, 1, 0, 0, 0, 508, 510, 3, 10, 5, 0, 509, 508, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 3, 80, 40, 0, 512, 107, 1, 0, 0, 0, 513, 514, 6, 54, -1, 0, 514, 518, 3, 110, 55, 0, 515, 516, 7, 3, 0, 0, 516, 518, 3, 108, 54, 7, 517, 513, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 518, 539, 1, 0, 0, 0, 519, 520, 10, 6, 0, 0, 520, 521, 5, 53, 0, 0, 521, 538, 3, 108, 54, 7, 522, 523, 10, 5, 0, 0, 523, 524, 7, 4, 0, 0, 524, 538, 3, 108, 54, 6, 525, 526, 10, 4, 0, 0, 526, 527, 7, 5, 0, 0, 527, 538, 3, 108, 54, 5, 528, 529, 10, 3, 0, 0, 529, 530, 7, 6, 0, 0, 530, 538, 3, 108, 54, 4, 531, 532, 10, 2, 0, 0, 532, 533, 5, 32, 0, 0, 533, 538, 3, 108, 54, 3, 534, 535, 10, 1, 0, 0, 535, 536, 5, 31, 0, 0, 536, 538, 3, 108, 54, 2, 537, 519, 1, 0, 0, 0, 537, 522, 1, 0, 0, 0, 537, 525, 1, 0, 0, 0, 537, 528, 1, 0, 0, 0, 537, 531, 1, 0, 0, 0, 537, 534, 1, 0, 0, 0, 538, 541, 1, 0, 0, 0, 539, 537, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 109, 1, 0, 0, 0, 541, 539, 1, 0, 0, 0, 542, 546, 3, 114, 57, 0, 543, 545, 3, 144, 72, 0, 544, 543, 1, 0, 0, 0, 545, 548, 1, 0, 0, 0, 546, 544, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 111, 1, 0, 0, 0, 548, 546, 1, 0, 0, 0, 549, 550, 3, 80, 40, 0, 550, 551, 5, 18, 0, 0, 551, 553, 3, 108, 54, 0, 552, 554, 5, 25, 0, 0, 553, 552, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 555, 1, 0, 0, 0, 555, 556, 5, 19, 0, 0, 556, 113, 1, 0, 0, 0, 557, 567, 3, 116, 58, 0, 558, 560, 3, 122, 61, 0, 559, 561, 3, 82, 41, 0, 560, 559, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 567, 1, 0, 0, 0, 562, 563, 5, 18, 0, 0, 563, 564, 3, 108, 54, 0, 564, 565, 5, 19, 0, 0, 565, 567, 1, 0, 0, 0, 566, 557, 1, 0, 0, 0, 566, 558, 1, 0, 0, 0, 566, 562, 1, 0, 0, 0, 567, 115, 1, 0, 0, 0, 568, 572, 3, 118, 59, 0, 569, 572, 3, 124, 62, 0, 570, 572, 3, 140, 70, 0, 571, 568, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 571, 570, 1, 0, 0, 0, 572, 117, 1, 0, 0, 0, 573, 578, 5, 13, 0, 0, 574, 578, 3, 120, 60, 0, 575, 578, 3, 138, 69, 0, 576, 578, 5, 58, 0, 0, 577, 573, 1, 0, 0, 0, 577, 574, 1, 0, 0, 0, 577, 575, 1, 0, 0, 0, 577, 576, 1, 0, 0, 0, 578, 119, 1, 0, 0, 0, 579, 580, 7, 7, 0, 0, 580, 121, 1, 0, 0, 0, 581, 582, 5, 17, 0, 0, 582, 123, 1, 0, 0, 0, 583, 584, 3, 126, 63, 0, 584, 585, 3, 128, 64, 0, 585, 125, 1, 0, 0, 0, 586, 592, 3, 88, 44, 0, 587, 589, 3, 84, 42, 0, 588, 590, 3, 82, 41, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 1, 0, 0, 0, 591, 586, 1, 0, 0, 0, 591, 587, 1, 0, 0, 0, 592, 127, 1, 0, 0, 0, 593, 598, 5, 20, 0, 0, 594, 596, 3, 130, 65, 0, 595, 597, 5, 25, 0, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 599, 1, 0, 0, 0, 598, 594, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 5, 21, 0, 0, 601, 129, 1, 0, 0, 0, 602, 607, 3, 132, 66, 0, 603, 604, 5, 25, 0, 0, 604, 606, 3, 132, 66, 0, 605, 603, 1, 0, 0, 0, 606, 609, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 608, 131, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 610, 611, 3, 134, 67, 0, 611, 612, 5, 27, 0, 0, 612, 614, 1, 0, 0, 0, 613, 610, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 3, 136, 68, 0, 616, 133, 1, 0, 0, 0, 617, 620, 3, 108, 54, 0, 618, 620, 3, 128, 64, 0, 619, 617, 1, 0, 0, 0, 619, 618, 1, 0, 0, 0, 620, 135, 1, 0, 0, 0, 621, 624, 3, 108, 54, 0, 622, 624, 3, 128, 64, 0, 623, 621, 1, 0, 0, 0, 623, 622, 1, 0, 0, 0, 624, 137, 1, 0, 0, 0, 625, 626, 7, 8, 0, 0, 626, 139, 1, 0, 0, 0, 627, 628, 5, 10, 0, 0, 628, 629, 3, 100, 50, 0, 629, 630, 3, 34, 17, 0, 630, 141, 1, 0, 0, 0, 631, 632, 5, 22, 0, 0, 632, 633, 3, 108, 54, 0, 633, 634, 5, 23, 0, 0, 634, 143, 1, 0, 0, 0, 635, 647, 5, 18, 0, 0, 636, 643, 3, 12, 6, 0, 637, 640, 3, 80, 40, 0, 638, 639, 5, 25, 0, 0, 639, 641, 3, 12, 6, 0, 640, 638, 1, 0, 0, 0, 640, 641, 1, 0, 0, 0, 641, 643, 1, 0, 0, 0, 642, 636, 1, 0, 0, 0, 642, 637, 1, 0, 0, 0, 643, 645, 1, 0, 0, 0, 644, 646, 5, 25, 0, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 648, 1, 0, 0, 0, 647, 642, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 650, 5, 19, 0, 0, 650, 145, 1, 0, 0, 0, 651, 652, 7, 9, 0, 0, 652, 147, 1, 0, 0, 0, 73, 151, 157, 166, 176, 180, 184, 188, 195, 203, 208, 212, 219, 229, 242, 246, 253, 257, 267, 271, 277, 281, 290, 297, 309, 317, 337, 347, 351, 355, 365, 371, 373, 377, 382, 386, 394, 409, 418, 423, 430, 434, 438, 442, 449, 454, 464, 486, 490, 498, 502, 504, 509, 517, 537, 539, 546, 553, 560, 566, 571, 577, 589, 591, 596, 598, 607, 613, 619, 623, 640, 642, 645, 647] \ No newline at end of file +[4, 1, 81, 758, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 1, 0, 1, 0, 1, 0, 3, 0, 166, 8, 0, 1, 0, 1, 0, 5, 0, 170, 8, 0, 10, 0, 12, 0, 173, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 3, 2, 182, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 190, 8, 3, 10, 3, 12, 3, 193, 9, 3, 1, 3, 3, 3, 196, 8, 3, 1, 4, 1, 4, 3, 4, 200, 8, 4, 1, 4, 1, 4, 3, 4, 204, 8, 4, 1, 5, 1, 5, 1, 5, 5, 5, 209, 8, 5, 10, 5, 12, 5, 212, 9, 5, 1, 6, 1, 6, 1, 6, 5, 6, 217, 8, 6, 10, 6, 12, 6, 220, 9, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 228, 8, 7, 10, 7, 12, 7, 231, 9, 7, 1, 7, 3, 7, 234, 8, 7, 1, 8, 1, 8, 3, 8, 238, 8, 8, 1, 9, 1, 9, 3, 9, 242, 8, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 3, 10, 249, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 257, 8, 11, 10, 11, 12, 11, 260, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 270, 8, 13, 10, 13, 12, 13, 273, 9, 13, 1, 14, 3, 14, 276, 8, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 3, 15, 283, 8, 15, 1, 15, 1, 15, 3, 15, 287, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 295, 8, 16, 10, 16, 12, 16, 298, 9, 16, 1, 16, 3, 16, 301, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 307, 8, 17, 1, 17, 1, 17, 3, 17, 311, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 3, 19, 320, 8, 19, 1, 19, 1, 19, 1, 19, 5, 19, 325, 8, 19, 10, 19, 12, 19, 328, 9, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 339, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 347, 8, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 3, 27, 367, 8, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 3, 29, 377, 8, 29, 1, 30, 1, 30, 3, 30, 381, 8, 30, 1, 31, 1, 31, 3, 31, 385, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 395, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 401, 8, 32, 3, 32, 403, 8, 32, 1, 33, 1, 33, 3, 33, 407, 8, 33, 1, 33, 1, 33, 1, 33, 3, 33, 412, 8, 33, 5, 33, 414, 8, 33, 10, 33, 12, 33, 417, 9, 33, 1, 34, 1, 34, 1, 34, 5, 34, 422, 8, 34, 10, 34, 12, 34, 425, 9, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 437, 8, 36, 10, 36, 12, 36, 440, 9, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 448, 8, 37, 1, 38, 1, 38, 1, 38, 3, 38, 453, 8, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 3, 40, 460, 8, 40, 1, 40, 1, 40, 3, 40, 464, 8, 40, 1, 40, 1, 40, 3, 40, 468, 8, 40, 1, 41, 1, 41, 3, 41, 472, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 479, 8, 41, 1, 42, 1, 42, 1, 42, 3, 42, 484, 8, 42, 1, 42, 1, 42, 1, 43, 1, 43, 3, 43, 490, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 498, 8, 44, 1, 45, 1, 45, 3, 45, 502, 8, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 3, 52, 526, 8, 52, 1, 53, 1, 53, 3, 53, 530, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 536, 8, 54, 10, 54, 12, 54, 539, 9, 54, 1, 54, 3, 54, 542, 8, 54, 3, 54, 544, 8, 54, 1, 54, 1, 54, 1, 55, 3, 55, 549, 8, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 557, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 577, 8, 56, 10, 56, 12, 56, 580, 9, 56, 1, 57, 1, 57, 1, 57, 5, 57, 585, 8, 57, 10, 57, 12, 57, 588, 9, 57, 1, 57, 1, 57, 1, 57, 5, 57, 593, 8, 57, 10, 57, 12, 57, 596, 9, 57, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 602, 8, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 3, 59, 609, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 615, 8, 59, 1, 60, 1, 60, 1, 60, 3, 60, 620, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 626, 8, 61, 1, 62, 1, 62, 1, 63, 1, 63, 3, 63, 632, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 646, 8, 66, 3, 66, 648, 8, 66, 1, 67, 1, 67, 1, 67, 3, 67, 653, 8, 67, 3, 67, 655, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 5, 68, 662, 8, 68, 10, 68, 12, 68, 665, 9, 68, 1, 69, 1, 69, 1, 69, 3, 69, 670, 8, 69, 1, 69, 1, 69, 1, 70, 1, 70, 3, 70, 676, 8, 70, 1, 71, 1, 71, 3, 71, 680, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 687, 8, 72, 10, 72, 12, 72, 690, 9, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 698, 8, 73, 1, 73, 3, 73, 701, 8, 73, 1, 74, 1, 74, 1, 75, 3, 75, 706, 8, 75, 1, 75, 1, 75, 3, 75, 710, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 3, 78, 722, 8, 78, 1, 78, 1, 78, 3, 78, 726, 8, 78, 1, 78, 3, 78, 729, 8, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 736, 8, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 745, 8, 79, 3, 79, 747, 8, 79, 1, 79, 3, 79, 750, 8, 79, 3, 79, 752, 8, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 0, 1, 112, 81, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 0, 10, 1, 0, 31, 32, 2, 0, 43, 48, 51, 55, 2, 0, 28, 28, 80, 80, 1, 0, 50, 55, 2, 0, 44, 48, 54, 55, 2, 0, 43, 43, 51, 53, 1, 0, 37, 42, 2, 0, 57, 60, 64, 65, 1, 0, 71, 72, 2, 1, 28, 28, 80, 80, 798, 0, 171, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 4, 181, 1, 0, 0, 0, 6, 183, 1, 0, 0, 0, 8, 197, 1, 0, 0, 0, 10, 205, 1, 0, 0, 0, 12, 213, 1, 0, 0, 0, 14, 221, 1, 0, 0, 0, 16, 237, 1, 0, 0, 0, 18, 239, 1, 0, 0, 0, 20, 246, 1, 0, 0, 0, 22, 252, 1, 0, 0, 0, 24, 263, 1, 0, 0, 0, 26, 266, 1, 0, 0, 0, 28, 275, 1, 0, 0, 0, 30, 279, 1, 0, 0, 0, 32, 288, 1, 0, 0, 0, 34, 302, 1, 0, 0, 0, 36, 312, 1, 0, 0, 0, 38, 326, 1, 0, 0, 0, 40, 338, 1, 0, 0, 0, 42, 346, 1, 0, 0, 0, 44, 348, 1, 0, 0, 0, 46, 350, 1, 0, 0, 0, 48, 354, 1, 0, 0, 0, 50, 358, 1, 0, 0, 0, 52, 361, 1, 0, 0, 0, 54, 366, 1, 0, 0, 0, 56, 370, 1, 0, 0, 0, 58, 374, 1, 0, 0, 0, 60, 378, 1, 0, 0, 0, 62, 382, 1, 0, 0, 0, 64, 386, 1, 0, 0, 0, 66, 406, 1, 0, 0, 0, 68, 418, 1, 0, 0, 0, 70, 428, 1, 0, 0, 0, 72, 432, 1, 0, 0, 0, 74, 443, 1, 0, 0, 0, 76, 449, 1, 0, 0, 0, 78, 456, 1, 0, 0, 0, 80, 459, 1, 0, 0, 0, 82, 478, 1, 0, 0, 0, 84, 480, 1, 0, 0, 0, 86, 489, 1, 0, 0, 0, 88, 497, 1, 0, 0, 0, 90, 499, 1, 0, 0, 0, 92, 506, 1, 0, 0, 0, 94, 508, 1, 0, 0, 0, 96, 510, 1, 0, 0, 0, 98, 514, 1, 0, 0, 0, 100, 517, 1, 0, 0, 0, 102, 520, 1, 0, 0, 0, 104, 523, 1, 0, 0, 0, 106, 529, 1, 0, 0, 0, 108, 531, 1, 0, 0, 0, 110, 548, 1, 0, 0, 0, 112, 556, 1, 0, 0, 0, 114, 581, 1, 0, 0, 0, 116, 597, 1, 0, 0, 0, 118, 614, 1, 0, 0, 0, 120, 619, 1, 0, 0, 0, 122, 625, 1, 0, 0, 0, 124, 627, 1, 0, 0, 0, 126, 631, 1, 0, 0, 0, 128, 633, 1, 0, 0, 0, 130, 637, 1, 0, 0, 0, 132, 647, 1, 0, 0, 0, 134, 649, 1, 0, 0, 0, 136, 658, 1, 0, 0, 0, 138, 669, 1, 0, 0, 0, 140, 675, 1, 0, 0, 0, 142, 679, 1, 0, 0, 0, 144, 681, 1, 0, 0, 0, 146, 697, 1, 0, 0, 0, 148, 702, 1, 0, 0, 0, 150, 705, 1, 0, 0, 0, 152, 711, 1, 0, 0, 0, 154, 715, 1, 0, 0, 0, 156, 719, 1, 0, 0, 0, 158, 739, 1, 0, 0, 0, 160, 755, 1, 0, 0, 0, 162, 166, 3, 30, 15, 0, 163, 166, 3, 4, 2, 0, 164, 166, 3, 40, 20, 0, 165, 162, 1, 0, 0, 0, 165, 163, 1, 0, 0, 0, 165, 164, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 168, 3, 160, 80, 0, 168, 170, 1, 0, 0, 0, 169, 165, 1, 0, 0, 0, 170, 173, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 174, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 174, 175, 5, 0, 0, 1, 175, 1, 1, 0, 0, 0, 176, 177, 5, 19, 0, 0, 177, 3, 1, 0, 0, 0, 178, 182, 3, 6, 3, 0, 179, 182, 3, 14, 7, 0, 180, 182, 3, 32, 16, 0, 181, 178, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 181, 180, 1, 0, 0, 0, 182, 5, 1, 0, 0, 0, 183, 195, 5, 5, 0, 0, 184, 196, 3, 8, 4, 0, 185, 191, 5, 20, 0, 0, 186, 187, 3, 8, 4, 0, 187, 188, 3, 160, 80, 0, 188, 190, 1, 0, 0, 0, 189, 186, 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 194, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 196, 5, 21, 0, 0, 195, 184, 1, 0, 0, 0, 195, 185, 1, 0, 0, 0, 196, 7, 1, 0, 0, 0, 197, 203, 3, 10, 5, 0, 198, 200, 3, 82, 41, 0, 199, 198, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 202, 5, 26, 0, 0, 202, 204, 3, 12, 6, 0, 203, 199, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 9, 1, 0, 0, 0, 205, 210, 5, 19, 0, 0, 206, 207, 5, 27, 0, 0, 207, 209, 5, 19, 0, 0, 208, 206, 1, 0, 0, 0, 209, 212, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 11, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 213, 218, 3, 112, 56, 0, 214, 215, 5, 27, 0, 0, 215, 217, 3, 112, 56, 0, 216, 214, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 13, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 221, 233, 5, 17, 0, 0, 222, 234, 3, 16, 8, 0, 223, 229, 5, 20, 0, 0, 224, 225, 3, 16, 8, 0, 225, 226, 3, 160, 80, 0, 226, 228, 1, 0, 0, 0, 227, 224, 1, 0, 0, 0, 228, 231, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 229, 1, 0, 0, 0, 232, 234, 5, 21, 0, 0, 233, 222, 1, 0, 0, 0, 233, 223, 1, 0, 0, 0, 234, 15, 1, 0, 0, 0, 235, 238, 3, 18, 9, 0, 236, 238, 3, 20, 10, 0, 237, 235, 1, 0, 0, 0, 237, 236, 1, 0, 0, 0, 238, 17, 1, 0, 0, 0, 239, 241, 5, 19, 0, 0, 240, 242, 3, 22, 11, 0, 241, 240, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 5, 26, 0, 0, 244, 245, 3, 82, 41, 0, 245, 19, 1, 0, 0, 0, 246, 248, 5, 19, 0, 0, 247, 249, 3, 22, 11, 0, 248, 247, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 251, 3, 82, 41, 0, 251, 21, 1, 0, 0, 0, 252, 253, 5, 24, 0, 0, 253, 258, 3, 24, 12, 0, 254, 255, 5, 27, 0, 0, 255, 257, 3, 24, 12, 0, 256, 254, 1, 0, 0, 0, 257, 260, 1, 0, 0, 0, 258, 256, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 261, 1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 261, 262, 5, 25, 0, 0, 262, 23, 1, 0, 0, 0, 263, 264, 3, 10, 5, 0, 264, 265, 3, 26, 13, 0, 265, 25, 1, 0, 0, 0, 266, 271, 3, 28, 14, 0, 267, 268, 5, 43, 0, 0, 268, 270, 3, 28, 14, 0, 269, 267, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 27, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 276, 5, 49, 0, 0, 275, 274, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 3, 82, 41, 0, 278, 29, 1, 0, 0, 0, 279, 280, 5, 10, 0, 0, 280, 282, 5, 19, 0, 0, 281, 283, 3, 22, 11, 0, 282, 281, 1, 0, 0, 0, 282, 283, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 286, 3, 104, 52, 0, 285, 287, 3, 36, 18, 0, 286, 285, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 31, 1, 0, 0, 0, 288, 300, 5, 18, 0, 0, 289, 301, 3, 34, 17, 0, 290, 296, 5, 20, 0, 0, 291, 292, 3, 34, 17, 0, 292, 293, 3, 160, 80, 0, 293, 295, 1, 0, 0, 0, 294, 291, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 299, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 301, 5, 21, 0, 0, 300, 289, 1, 0, 0, 0, 300, 290, 1, 0, 0, 0, 301, 33, 1, 0, 0, 0, 302, 310, 3, 10, 5, 0, 303, 306, 3, 82, 41, 0, 304, 305, 5, 26, 0, 0, 305, 307, 3, 12, 6, 0, 306, 304, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 311, 1, 0, 0, 0, 308, 309, 5, 26, 0, 0, 309, 311, 3, 12, 6, 0, 310, 303, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 35, 1, 0, 0, 0, 312, 313, 5, 22, 0, 0, 313, 314, 3, 38, 19, 0, 314, 315, 5, 23, 0, 0, 315, 37, 1, 0, 0, 0, 316, 320, 5, 28, 0, 0, 317, 320, 5, 80, 0, 0, 318, 320, 1, 0, 0, 0, 319, 316, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 319, 318, 1, 0, 0, 0, 320, 321, 1, 0, 0, 0, 321, 322, 3, 40, 20, 0, 322, 323, 3, 160, 80, 0, 323, 325, 1, 0, 0, 0, 324, 319, 1, 0, 0, 0, 325, 328, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 39, 1, 0, 0, 0, 328, 326, 1, 0, 0, 0, 329, 339, 3, 4, 2, 0, 330, 339, 3, 42, 21, 0, 331, 339, 3, 58, 29, 0, 332, 339, 3, 60, 30, 0, 333, 339, 3, 62, 31, 0, 334, 339, 3, 36, 18, 0, 335, 339, 3, 64, 32, 0, 336, 339, 3, 68, 34, 0, 337, 339, 3, 76, 38, 0, 338, 329, 1, 0, 0, 0, 338, 330, 1, 0, 0, 0, 338, 331, 1, 0, 0, 0, 338, 332, 1, 0, 0, 0, 338, 333, 1, 0, 0, 0, 338, 334, 1, 0, 0, 0, 338, 335, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 338, 337, 1, 0, 0, 0, 339, 41, 1, 0, 0, 0, 340, 347, 3, 48, 24, 0, 341, 347, 3, 46, 23, 0, 342, 347, 3, 50, 25, 0, 343, 347, 3, 52, 26, 0, 344, 347, 3, 44, 22, 0, 345, 347, 3, 56, 28, 0, 346, 340, 1, 0, 0, 0, 346, 341, 1, 0, 0, 0, 346, 342, 1, 0, 0, 0, 346, 343, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 346, 345, 1, 0, 0, 0, 347, 43, 1, 0, 0, 0, 348, 349, 3, 112, 56, 0, 349, 45, 1, 0, 0, 0, 350, 351, 3, 112, 56, 0, 351, 352, 5, 36, 0, 0, 352, 353, 3, 112, 56, 0, 353, 47, 1, 0, 0, 0, 354, 355, 3, 112, 56, 0, 355, 356, 5, 56, 0, 0, 356, 357, 3, 112, 56, 0, 357, 49, 1, 0, 0, 0, 358, 359, 3, 112, 56, 0, 359, 360, 7, 0, 0, 0, 360, 51, 1, 0, 0, 0, 361, 362, 3, 12, 6, 0, 362, 363, 3, 54, 27, 0, 363, 364, 3, 12, 6, 0, 364, 53, 1, 0, 0, 0, 365, 367, 7, 1, 0, 0, 366, 365, 1, 0, 0, 0, 366, 367, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 5, 26, 0, 0, 369, 55, 1, 0, 0, 0, 370, 371, 3, 10, 5, 0, 371, 372, 5, 33, 0, 0, 372, 373, 3, 12, 6, 0, 373, 57, 1, 0, 0, 0, 374, 376, 5, 14, 0, 0, 375, 377, 3, 12, 6, 0, 376, 375, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 59, 1, 0, 0, 0, 378, 380, 5, 3, 0, 0, 379, 381, 5, 19, 0, 0, 380, 379, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 61, 1, 0, 0, 0, 382, 384, 5, 6, 0, 0, 383, 385, 5, 19, 0, 0, 384, 383, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 63, 1, 0, 0, 0, 386, 394, 5, 12, 0, 0, 387, 395, 3, 112, 56, 0, 388, 389, 7, 2, 0, 0, 389, 395, 3, 112, 56, 0, 390, 391, 3, 42, 21, 0, 391, 392, 7, 2, 0, 0, 392, 393, 3, 112, 56, 0, 393, 395, 1, 0, 0, 0, 394, 387, 1, 0, 0, 0, 394, 388, 1, 0, 0, 0, 394, 390, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 402, 3, 36, 18, 0, 397, 400, 5, 7, 0, 0, 398, 401, 3, 64, 32, 0, 399, 401, 3, 36, 18, 0, 400, 398, 1, 0, 0, 0, 400, 399, 1, 0, 0, 0, 401, 403, 1, 0, 0, 0, 402, 397, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 65, 1, 0, 0, 0, 404, 407, 3, 82, 41, 0, 405, 407, 5, 13, 0, 0, 406, 404, 1, 0, 0, 0, 406, 405, 1, 0, 0, 0, 407, 415, 1, 0, 0, 0, 408, 411, 5, 27, 0, 0, 409, 412, 3, 82, 41, 0, 410, 412, 5, 13, 0, 0, 411, 409, 1, 0, 0, 0, 411, 410, 1, 0, 0, 0, 412, 414, 1, 0, 0, 0, 413, 408, 1, 0, 0, 0, 414, 417, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 67, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 418, 419, 5, 11, 0, 0, 419, 423, 5, 22, 0, 0, 420, 422, 3, 70, 35, 0, 421, 420, 1, 0, 0, 0, 422, 425, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 426, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 426, 427, 5, 23, 0, 0, 427, 69, 1, 0, 0, 0, 428, 429, 3, 72, 36, 0, 429, 430, 5, 29, 0, 0, 430, 431, 3, 38, 19, 0, 431, 71, 1, 0, 0, 0, 432, 438, 5, 4, 0, 0, 433, 434, 3, 74, 37, 0, 434, 435, 5, 27, 0, 0, 435, 437, 1, 0, 0, 0, 436, 433, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 441, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 441, 442, 3, 74, 37, 0, 442, 73, 1, 0, 0, 0, 443, 444, 5, 9, 0, 0, 444, 447, 5, 19, 0, 0, 445, 446, 5, 1, 0, 0, 446, 448, 5, 19, 0, 0, 447, 445, 1, 0, 0, 0, 447, 448, 1, 0, 0, 0, 448, 75, 1, 0, 0, 0, 449, 452, 5, 8, 0, 0, 450, 453, 3, 78, 39, 0, 451, 453, 3, 80, 40, 0, 452, 450, 1, 0, 0, 0, 452, 451, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 455, 3, 36, 18, 0, 455, 77, 1, 0, 0, 0, 456, 457, 3, 112, 56, 0, 457, 79, 1, 0, 0, 0, 458, 460, 3, 42, 21, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 463, 3, 160, 80, 0, 462, 464, 3, 112, 56, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 467, 3, 160, 80, 0, 466, 468, 3, 42, 21, 0, 467, 466, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 81, 1, 0, 0, 0, 469, 471, 3, 86, 43, 0, 470, 472, 3, 84, 42, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 479, 1, 0, 0, 0, 473, 479, 3, 88, 44, 0, 474, 475, 5, 20, 0, 0, 475, 476, 3, 82, 41, 0, 476, 477, 5, 21, 0, 0, 477, 479, 1, 0, 0, 0, 478, 469, 1, 0, 0, 0, 478, 473, 1, 0, 0, 0, 478, 474, 1, 0, 0, 0, 479, 83, 1, 0, 0, 0, 480, 481, 5, 24, 0, 0, 481, 483, 3, 66, 33, 0, 482, 484, 5, 27, 0, 0, 483, 482, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 486, 5, 25, 0, 0, 486, 85, 1, 0, 0, 0, 487, 490, 3, 128, 64, 0, 488, 490, 5, 19, 0, 0, 489, 487, 1, 0, 0, 0, 489, 488, 1, 0, 0, 0, 490, 87, 1, 0, 0, 0, 491, 498, 3, 90, 45, 0, 492, 498, 3, 144, 72, 0, 493, 498, 3, 102, 51, 0, 494, 498, 3, 96, 48, 0, 495, 498, 3, 100, 50, 0, 496, 498, 3, 98, 49, 0, 497, 491, 1, 0, 0, 0, 497, 492, 1, 0, 0, 0, 497, 493, 1, 0, 0, 0, 497, 494, 1, 0, 0, 0, 497, 495, 1, 0, 0, 0, 497, 496, 1, 0, 0, 0, 498, 89, 1, 0, 0, 0, 499, 501, 5, 24, 0, 0, 500, 502, 3, 92, 46, 0, 501, 500, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 25, 0, 0, 504, 505, 3, 94, 47, 0, 505, 91, 1, 0, 0, 0, 506, 507, 3, 112, 56, 0, 507, 93, 1, 0, 0, 0, 508, 509, 3, 82, 41, 0, 509, 95, 1, 0, 0, 0, 510, 511, 5, 24, 0, 0, 511, 512, 5, 25, 0, 0, 512, 513, 3, 94, 47, 0, 513, 97, 1, 0, 0, 0, 514, 515, 5, 2, 0, 0, 515, 516, 3, 94, 47, 0, 516, 99, 1, 0, 0, 0, 517, 518, 5, 15, 0, 0, 518, 519, 3, 104, 52, 0, 519, 101, 1, 0, 0, 0, 520, 521, 5, 10, 0, 0, 521, 522, 3, 104, 52, 0, 522, 103, 1, 0, 0, 0, 523, 525, 3, 108, 54, 0, 524, 526, 3, 106, 53, 0, 525, 524, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 105, 1, 0, 0, 0, 527, 530, 3, 108, 54, 0, 528, 530, 3, 82, 41, 0, 529, 527, 1, 0, 0, 0, 529, 528, 1, 0, 0, 0, 530, 107, 1, 0, 0, 0, 531, 543, 5, 20, 0, 0, 532, 537, 3, 110, 55, 0, 533, 534, 5, 27, 0, 0, 534, 536, 3, 110, 55, 0, 535, 533, 1, 0, 0, 0, 536, 539, 1, 0, 0, 0, 537, 535, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 541, 1, 0, 0, 0, 539, 537, 1, 0, 0, 0, 540, 542, 5, 27, 0, 0, 541, 540, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 544, 1, 0, 0, 0, 543, 532, 1, 0, 0, 0, 543, 544, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 546, 5, 21, 0, 0, 546, 109, 1, 0, 0, 0, 547, 549, 3, 10, 5, 0, 548, 547, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 3, 82, 41, 0, 551, 111, 1, 0, 0, 0, 552, 553, 6, 56, -1, 0, 553, 557, 3, 114, 57, 0, 554, 555, 7, 3, 0, 0, 555, 557, 3, 112, 56, 7, 556, 552, 1, 0, 0, 0, 556, 554, 1, 0, 0, 0, 557, 578, 1, 0, 0, 0, 558, 559, 10, 6, 0, 0, 559, 560, 5, 56, 0, 0, 560, 577, 3, 112, 56, 7, 561, 562, 10, 5, 0, 0, 562, 563, 7, 4, 0, 0, 563, 577, 3, 112, 56, 6, 564, 565, 10, 4, 0, 0, 565, 566, 7, 5, 0, 0, 566, 577, 3, 112, 56, 5, 567, 568, 10, 3, 0, 0, 568, 569, 7, 6, 0, 0, 569, 577, 3, 112, 56, 4, 570, 571, 10, 2, 0, 0, 571, 572, 5, 35, 0, 0, 572, 577, 3, 112, 56, 3, 573, 574, 10, 1, 0, 0, 574, 575, 5, 34, 0, 0, 575, 577, 3, 112, 56, 2, 576, 558, 1, 0, 0, 0, 576, 561, 1, 0, 0, 0, 576, 564, 1, 0, 0, 0, 576, 567, 1, 0, 0, 0, 576, 570, 1, 0, 0, 0, 576, 573, 1, 0, 0, 0, 577, 580, 1, 0, 0, 0, 578, 576, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 113, 1, 0, 0, 0, 580, 578, 1, 0, 0, 0, 581, 594, 3, 118, 59, 0, 582, 586, 5, 30, 0, 0, 583, 585, 5, 19, 0, 0, 584, 583, 1, 0, 0, 0, 585, 588, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 593, 1, 0, 0, 0, 588, 586, 1, 0, 0, 0, 589, 593, 3, 154, 77, 0, 590, 593, 3, 156, 78, 0, 591, 593, 3, 158, 79, 0, 592, 582, 1, 0, 0, 0, 592, 589, 1, 0, 0, 0, 592, 590, 1, 0, 0, 0, 592, 591, 1, 0, 0, 0, 593, 596, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 115, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 597, 598, 3, 82, 41, 0, 598, 599, 5, 20, 0, 0, 599, 601, 3, 112, 56, 0, 600, 602, 5, 27, 0, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 21, 0, 0, 604, 117, 1, 0, 0, 0, 605, 615, 3, 120, 60, 0, 606, 608, 3, 126, 63, 0, 607, 609, 3, 84, 42, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 615, 1, 0, 0, 0, 610, 611, 5, 20, 0, 0, 611, 612, 3, 112, 56, 0, 612, 613, 5, 21, 0, 0, 613, 615, 1, 0, 0, 0, 614, 605, 1, 0, 0, 0, 614, 606, 1, 0, 0, 0, 614, 610, 1, 0, 0, 0, 615, 119, 1, 0, 0, 0, 616, 620, 3, 122, 61, 0, 617, 620, 3, 130, 65, 0, 618, 620, 3, 152, 76, 0, 619, 616, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 618, 1, 0, 0, 0, 620, 121, 1, 0, 0, 0, 621, 626, 5, 13, 0, 0, 622, 626, 3, 124, 62, 0, 623, 626, 3, 148, 74, 0, 624, 626, 5, 61, 0, 0, 625, 621, 1, 0, 0, 0, 625, 622, 1, 0, 0, 0, 625, 623, 1, 0, 0, 0, 625, 624, 1, 0, 0, 0, 626, 123, 1, 0, 0, 0, 627, 628, 7, 7, 0, 0, 628, 125, 1, 0, 0, 0, 629, 632, 5, 19, 0, 0, 630, 632, 3, 128, 64, 0, 631, 629, 1, 0, 0, 0, 631, 630, 1, 0, 0, 0, 632, 127, 1, 0, 0, 0, 633, 634, 5, 19, 0, 0, 634, 635, 5, 30, 0, 0, 635, 636, 5, 19, 0, 0, 636, 129, 1, 0, 0, 0, 637, 638, 3, 132, 66, 0, 638, 639, 3, 134, 67, 0, 639, 131, 1, 0, 0, 0, 640, 648, 3, 144, 72, 0, 641, 648, 3, 90, 45, 0, 642, 648, 3, 96, 48, 0, 643, 645, 3, 86, 43, 0, 644, 646, 3, 84, 42, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 648, 1, 0, 0, 0, 647, 640, 1, 0, 0, 0, 647, 641, 1, 0, 0, 0, 647, 642, 1, 0, 0, 0, 647, 643, 1, 0, 0, 0, 648, 133, 1, 0, 0, 0, 649, 654, 5, 22, 0, 0, 650, 652, 3, 136, 68, 0, 651, 653, 5, 27, 0, 0, 652, 651, 1, 0, 0, 0, 652, 653, 1, 0, 0, 0, 653, 655, 1, 0, 0, 0, 654, 650, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 657, 5, 23, 0, 0, 657, 135, 1, 0, 0, 0, 658, 663, 3, 138, 69, 0, 659, 660, 5, 27, 0, 0, 660, 662, 3, 138, 69, 0, 661, 659, 1, 0, 0, 0, 662, 665, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 137, 1, 0, 0, 0, 665, 663, 1, 0, 0, 0, 666, 667, 3, 140, 70, 0, 667, 668, 5, 29, 0, 0, 668, 670, 1, 0, 0, 0, 669, 666, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 3, 142, 71, 0, 672, 139, 1, 0, 0, 0, 673, 676, 3, 112, 56, 0, 674, 676, 3, 134, 67, 0, 675, 673, 1, 0, 0, 0, 675, 674, 1, 0, 0, 0, 676, 141, 1, 0, 0, 0, 677, 680, 3, 112, 56, 0, 678, 680, 3, 134, 67, 0, 679, 677, 1, 0, 0, 0, 679, 678, 1, 0, 0, 0, 680, 143, 1, 0, 0, 0, 681, 682, 5, 16, 0, 0, 682, 688, 5, 22, 0, 0, 683, 684, 3, 146, 73, 0, 684, 685, 3, 160, 80, 0, 685, 687, 1, 0, 0, 0, 686, 683, 1, 0, 0, 0, 687, 690, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 691, 1, 0, 0, 0, 690, 688, 1, 0, 0, 0, 691, 692, 5, 23, 0, 0, 692, 145, 1, 0, 0, 0, 693, 694, 3, 10, 5, 0, 694, 695, 3, 82, 41, 0, 695, 698, 1, 0, 0, 0, 696, 698, 3, 150, 75, 0, 697, 693, 1, 0, 0, 0, 697, 696, 1, 0, 0, 0, 698, 700, 1, 0, 0, 0, 699, 701, 3, 148, 74, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 147, 1, 0, 0, 0, 702, 703, 7, 8, 0, 0, 703, 149, 1, 0, 0, 0, 704, 706, 5, 54, 0, 0, 705, 704, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 709, 3, 86, 43, 0, 708, 710, 3, 84, 42, 0, 709, 708, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 151, 1, 0, 0, 0, 711, 712, 5, 10, 0, 0, 712, 713, 3, 104, 52, 0, 713, 714, 3, 36, 18, 0, 714, 153, 1, 0, 0, 0, 715, 716, 5, 24, 0, 0, 716, 717, 3, 112, 56, 0, 717, 718, 5, 25, 0, 0, 718, 155, 1, 0, 0, 0, 719, 735, 5, 24, 0, 0, 720, 722, 3, 112, 56, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 723, 1, 0, 0, 0, 723, 725, 5, 29, 0, 0, 724, 726, 3, 112, 56, 0, 725, 724, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 736, 1, 0, 0, 0, 727, 729, 3, 112, 56, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 5, 29, 0, 0, 731, 732, 3, 112, 56, 0, 732, 733, 5, 29, 0, 0, 733, 734, 3, 112, 56, 0, 734, 736, 1, 0, 0, 0, 735, 721, 1, 0, 0, 0, 735, 728, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 5, 25, 0, 0, 738, 157, 1, 0, 0, 0, 739, 751, 5, 20, 0, 0, 740, 747, 3, 12, 6, 0, 741, 744, 3, 82, 41, 0, 742, 743, 5, 27, 0, 0, 743, 745, 3, 12, 6, 0, 744, 742, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 747, 1, 0, 0, 0, 746, 740, 1, 0, 0, 0, 746, 741, 1, 0, 0, 0, 747, 749, 1, 0, 0, 0, 748, 750, 5, 27, 0, 0, 749, 748, 1, 0, 0, 0, 749, 750, 1, 0, 0, 0, 750, 752, 1, 0, 0, 0, 751, 746, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 5, 21, 0, 0, 754, 159, 1, 0, 0, 0, 755, 756, 7, 9, 0, 0, 756, 161, 1, 0, 0, 0, 89, 165, 171, 181, 191, 195, 199, 203, 210, 218, 229, 233, 237, 241, 248, 258, 271, 275, 282, 286, 296, 300, 306, 310, 319, 326, 338, 346, 366, 376, 380, 384, 394, 400, 402, 406, 411, 415, 423, 438, 447, 452, 459, 463, 467, 471, 478, 483, 489, 497, 501, 525, 529, 537, 541, 543, 548, 556, 576, 578, 586, 592, 594, 601, 608, 614, 619, 625, 631, 645, 647, 652, 654, 663, 669, 675, 679, 688, 697, 700, 705, 709, 721, 725, 728, 735, 744, 746, 749, 751] \ No newline at end of file diff --git a/parser/generated/TParser.tokens b/parser/generated/TParser.tokens index 1c64c62..70f824b 100644 --- a/parser/generated/TParser.tokens +++ b/parser/generated/TParser.tokens @@ -13,69 +13,72 @@ IF=12 NIL_LIT=13 RETURN=14 SYNC=15 -VAR=16 -IDENTIFIER=17 -L_PAREN=18 -R_PAREN=19 -L_CURLY=20 -R_CURLY=21 -L_BRACKET=22 -R_BRACKET=23 -ASSIGN=24 -COMMA=25 -SEMI=26 -COLON=27 -PLUS_PLUS=28 -MINUS_MINUS=29 -DECLARE_ASSIGN=30 -LOGICAL_OR=31 -LOGICAL_AND=32 -SYNC_RETURN=33 -EQUALS=34 -NOT_EQUALS=35 -LESS=36 -LESS_OR_EQUALS=37 -GREATER=38 -GREATER_OR_EQUALS=39 -OR=40 -DIV=41 -MOD=42 -LSHIFT=43 -RSHIFT=44 -BIT_CLEAR=45 -UNDERLYING=46 -EXCLAMATION=47 -PLUS=48 -MINUS=49 -CARET=50 -STAR=51 -AMPERSAND=52 -EMIT=53 -DECIMAL_LIT=54 -BINARY_LIT=55 -OCTAL_LIT=56 -HEX_LIT=57 -FLOAT_LIT=58 -DECIMAL_FLOAT_LIT=59 -HEX_FLOAT_LIT=60 -IMAGINARY_LIT=61 -RUNE_LIT=62 -BYTE_VALUE=63 -OCTAL_BYTE_VALUE=64 -HEX_BYTE_VALUE=65 -LITTLE_U_VALUE=66 -BIG_U_VALUE=67 -RAW_STRING_LIT=68 -INTERPRETED_STRING_LIT=69 -WS=70 -COMMENT=71 -TERMINATOR=72 -LINE_COMMENT=73 -WS_NLSEMI=74 -COMMENT_NLSEMI=75 -LINE_COMMENT_NLSEMI=76 -EOS=77 -OTHER=78 +STRUCT=16 +TYPE=17 +VAR=18 +IDENTIFIER=19 +L_PAREN=20 +R_PAREN=21 +L_CURLY=22 +R_CURLY=23 +L_BRACKET=24 +R_BRACKET=25 +ASSIGN=26 +COMMA=27 +SEMI=28 +COLON=29 +DOT=30 +PLUS_PLUS=31 +MINUS_MINUS=32 +DECLARE_ASSIGN=33 +LOGICAL_OR=34 +LOGICAL_AND=35 +SYNC_RETURN=36 +EQUALS=37 +NOT_EQUALS=38 +LESS=39 +LESS_OR_EQUALS=40 +GREATER=41 +GREATER_OR_EQUALS=42 +OR=43 +DIV=44 +MOD=45 +LSHIFT=46 +RSHIFT=47 +BIT_CLEAR=48 +UNDERLYING=49 +EXCLAMATION=50 +PLUS=51 +MINUS=52 +CARET=53 +STAR=54 +AMPERSAND=55 +EMIT=56 +DECIMAL_LIT=57 +BINARY_LIT=58 +OCTAL_LIT=59 +HEX_LIT=60 +FLOAT_LIT=61 +DECIMAL_FLOAT_LIT=62 +HEX_FLOAT_LIT=63 +IMAGINARY_LIT=64 +RUNE_LIT=65 +BYTE_VALUE=66 +OCTAL_BYTE_VALUE=67 +HEX_BYTE_VALUE=68 +LITTLE_U_VALUE=69 +BIG_U_VALUE=70 +RAW_STRING_LIT=71 +INTERPRETED_STRING_LIT=72 +WS=73 +COMMENT=74 +TERMINATOR=75 +LINE_COMMENT=76 +WS_NLSEMI=77 +COMMENT_NLSEMI=78 +LINE_COMMENT_NLSEMI=79 +EOS=80 +OTHER=81 'as'=1 'async'=2 'break'=3 @@ -91,40 +94,43 @@ OTHER=78 'nil'=13 'return'=14 'sync'=15 -'var'=16 -'('=18 -')'=19 -'{'=20 -'}'=21 -'['=22 -']'=23 -'='=24 -','=25 -';'=26 -':'=27 -'++'=28 -'--'=29 -':='=30 -'||'=31 -'&&'=32 -'<|'=33 -'=='=34 -'!='=35 -'<'=36 -'<='=37 -'>'=38 -'>='=39 -'|'=40 -'/'=41 -'%'=42 -'<<'=43 -'>>'=44 -'&^'=45 -'~'=46 -'!'=47 -'+'=48 -'-'=49 -'^'=50 -'*'=51 -'&'=52 -'<-'=53 +'struct'=16 +'type'=17 +'var'=18 +'('=20 +')'=21 +'{'=22 +'}'=23 +'['=24 +']'=25 +'='=26 +','=27 +';'=28 +':'=29 +'.'=30 +'++'=31 +'--'=32 +':='=33 +'||'=34 +'&&'=35 +'<|'=36 +'=='=37 +'!='=38 +'<'=39 +'<='=40 +'>'=41 +'>='=42 +'|'=43 +'/'=44 +'%'=45 +'<<'=46 +'>>'=47 +'&^'=48 +'~'=49 +'!'=50 +'+'=51 +'-'=52 +'^'=53 +'*'=54 +'&'=55 +'<-'=56 diff --git a/parser/generated/TParserBaseVisitor.h b/parser/generated/TParserBaseVisitor.h index fd3be3b..49b86ce 100644 --- a/parser/generated/TParserBaseVisitor.h +++ b/parser/generated/TParserBaseVisitor.h @@ -43,6 +43,10 @@ class TParserBaseVisitor : public TParserVisitor { return visitChildren(ctx); } + virtual std::any visitTypeDecl(TParser::TypeDeclContext *ctx) override { + return visitChildren(ctx); + } + virtual std::any visitTypeSpec(TParser::TypeSpecContext *ctx) override { return visitChildren(ctx); } @@ -203,6 +207,10 @@ class TParserBaseVisitor : public TParserVisitor { return visitChildren(ctx); } + virtual std::any visitSliceType(TParser::SliceTypeContext *ctx) override { + return visitChildren(ctx); + } + virtual std::any visitAsyncChannelType(TParser::AsyncChannelTypeContext *ctx) override { return visitChildren(ctx); } @@ -263,6 +271,10 @@ class TParserBaseVisitor : public TParserVisitor { return visitChildren(ctx); } + virtual std::any visitQualifiedIdent(TParser::QualifiedIdentContext *ctx) override { + return visitChildren(ctx); + } + virtual std::any visitCompositeLit(TParser::CompositeLitContext *ctx) override { return visitChildren(ctx); } @@ -291,10 +303,22 @@ class TParserBaseVisitor : public TParserVisitor { return visitChildren(ctx); } + virtual std::any visitStructType(TParser::StructTypeContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitFieldDecl(TParser::FieldDeclContext *ctx) override { + return visitChildren(ctx); + } + virtual std::any visitString_(TParser::String_Context *ctx) override { return visitChildren(ctx); } + virtual std::any visitEmbeddedField(TParser::EmbeddedFieldContext *ctx) override { + return visitChildren(ctx); + } + virtual std::any visitFunctionLit(TParser::FunctionLitContext *ctx) override { return visitChildren(ctx); } @@ -303,6 +327,10 @@ class TParserBaseVisitor : public TParserVisitor { return visitChildren(ctx); } + virtual std::any visitSlice_(TParser::Slice_Context *ctx) override { + return visitChildren(ctx); + } + virtual std::any visitArguments(TParser::ArgumentsContext *ctx) override { return visitChildren(ctx); } diff --git a/parser/generated/TParserVisitor.h b/parser/generated/TParserVisitor.h index b7b4074..89eaaa4 100644 --- a/parser/generated/TParserVisitor.h +++ b/parser/generated/TParserVisitor.h @@ -33,6 +33,8 @@ class TParserVisitor : public antlr4::tree::AbstractParseTreeVisitor { virtual std::any visitExpressionList(TParser::ExpressionListContext *context) = 0; + virtual std::any visitTypeDecl(TParser::TypeDeclContext *context) = 0; + virtual std::any visitTypeSpec(TParser::TypeSpecContext *context) = 0; virtual std::any visitAliasDecl(TParser::AliasDeclContext *context) = 0; @@ -113,6 +115,8 @@ class TParserVisitor : public antlr4::tree::AbstractParseTreeVisitor { virtual std::any visitElementType(TParser::ElementTypeContext *context) = 0; + virtual std::any visitSliceType(TParser::SliceTypeContext *context) = 0; + virtual std::any visitAsyncChannelType(TParser::AsyncChannelTypeContext *context) = 0; virtual std::any visitSyncChannelType(TParser::SyncChannelTypeContext *context) = 0; @@ -143,6 +147,8 @@ class TParserVisitor : public antlr4::tree::AbstractParseTreeVisitor { virtual std::any visitOperandName(TParser::OperandNameContext *context) = 0; + virtual std::any visitQualifiedIdent(TParser::QualifiedIdentContext *context) = 0; + virtual std::any visitCompositeLit(TParser::CompositeLitContext *context) = 0; virtual std::any visitLiteralType(TParser::LiteralTypeContext *context) = 0; @@ -157,12 +163,20 @@ class TParserVisitor : public antlr4::tree::AbstractParseTreeVisitor { virtual std::any visitElement(TParser::ElementContext *context) = 0; + virtual std::any visitStructType(TParser::StructTypeContext *context) = 0; + + virtual std::any visitFieldDecl(TParser::FieldDeclContext *context) = 0; + virtual std::any visitString_(TParser::String_Context *context) = 0; + virtual std::any visitEmbeddedField(TParser::EmbeddedFieldContext *context) = 0; + virtual std::any visitFunctionLit(TParser::FunctionLitContext *context) = 0; virtual std::any visitIndex(TParser::IndexContext *context) = 0; + virtual std::any visitSlice_(TParser::Slice_Context *context) = 0; + virtual std::any visitArguments(TParser::ArgumentsContext *context) = 0; virtual std::any visitEos(TParser::EosContext *context) = 0; diff --git a/parser/main.cpp b/parser/main.cpp index e042ce2..6af17c2 100644 --- a/parser/main.cpp +++ b/parser/main.cpp @@ -10,6 +10,8 @@ #include #include +#define DEBUG + using namespace antlr4; int main(int argc, const char** argv) { @@ -17,32 +19,51 @@ int main(int argc, const char** argv) { return 0; } - std::ifstream sourceFile(argv[1]); - std::string sourceFileData; - sourceFile.seekg(0, std::ios::end); - sourceFileData.reserve(sourceFile.tellg()); - sourceFile.seekg(0, std::ios::beg); - sourceFileData.assign(std::istreambuf_iterator(sourceFile), std::istreambuf_iterator()); - - ANTLRInputStream input(sourceFileData); - TLexer lexer(&input); - CommonTokenStream tokens(&lexer); - tokens.fill(); - - TParser parser(&tokens); - tree::ParseTree* tree = parser.sourceFile(); - - std::string outFilePath(argv[2]); - - Visitor visitor(outFilePath); - visitor.WriteHeaders(); - visitor.WriteGlobals(); - visitor.WritePredefinedFunctions(); - visitor.WriteFunctions(tree); - visitor.StartEntryFunc(); - visitor.visit(tree); - visitor.EndEntryFunc(); - visitor.WriteMain(); + try { + std::ifstream sourceFile(argv[1]); + if (!sourceFile.is_open()) { + std::cerr << "Failed to open file " << argv[1] << std::endl; + return 0; + } + std::string sourceFileData; + sourceFile.seekg(0, std::ios::end); + sourceFileData.reserve(sourceFile.tellg()); + sourceFile.seekg(0, std::ios::beg); + sourceFileData.assign(std::istreambuf_iterator(sourceFile), std::istreambuf_iterator()); + + ANTLRInputStream input(sourceFileData); + TLexer lexer(&input); + CommonTokenStream tokens(&lexer); + tokens.fill(); + + TParser parser(&tokens); + tree::ParseTree* tree = parser.sourceFile(); + +#ifndef DEBUG + if (argc < 3) { + std::cerr << "Usage: " << argv[0] << " " << std::endl; + return 0; + } + std::string outFilePath(argv[2]); + + Visitor visitor(outFilePath); +#else + Visitor visitor; +# endif + visitor.WriteHeaders(); + visitor.WriteGlobals(); + visitor.WritePredefinedFunctions(); + visitor.WriteFunctions(tree); + visitor.StartEntryFunc(); + visitor.visit(tree); + visitor.EndEntryFunc(); + visitor.WriteMain(); + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + } + catch (...) { + std::cerr << "Unknown exception" << std::endl; + } return 0; } \ No newline at end of file diff --git a/parser/visitor/visitor.cpp b/parser/visitor/visitor.cpp index 86146b1..d75b5e1 100644 --- a/parser/visitor/visitor.cpp +++ b/parser/visitor/visitor.cpp @@ -45,8 +45,22 @@ void Visitor::WritePredefinedFunctions() { GetOut() << "template " << std::endl; GetOut() << "void print(T var) {" << std::endl; GetOut() << " std::cout << var << std::endl;" << std::endl; - GetOut() << "}" << std::endl; - + GetOut() << "}" << std::endl <"; + GetOut() << "ListObject& append(ListObject& list, const T&... el) {" << std::endl; + GetOut() << " (list.push_back(el), ...);" << std::endl; + GetOut() << " return list;" << std::endl; + GetOut() << std::endl; } @@ -153,11 +167,11 @@ void Visitor::ProcessDefaultVarDecl(TParser::Type_Context* typeCtx, TParser::Ide // array, function, sync or async channel if (auto syncCtx = typeLitCtx->syncChannelType(); syncCtx) { typeName = "ChannelPtr"; - typeConstructor = "() //not implemented"; + typeConstructor = "(ChannelMode::Sync) //not implemented"; } else if (auto asyncCtx = typeLitCtx->asyncChannelType(); asyncCtx) { typeName = "ChannelPtr"; - typeConstructor = " = repository__->NewChannel()"; + typeConstructor = " = repository__->NewChannel(ChannelMode::Async, )"; } else { // TODO: Process other types @@ -180,13 +194,20 @@ std::any Visitor::visitVarDecl(TParser::VarDeclContext *ctx) { ProcessDefaultVarDecl(varSpec->type_(), varSpec->identifierList()); } else { - // Deduce type from expr - if (varSpec->type_()) { - // check type if need + const auto& ids = varSpec->identifierList()->IDENTIFIER(); + const auto& exprs = varSpec->expressionList()->expression(); + if (exprs.size() > ids.size()) { + throw std::runtime_error("Assigning error"); } + if (exprs.size() > 1 || ids.size() > 1) { + throw std::runtime_error("Multiple expressions assignment not implemented"); + } + GetOutWithIndent() << "auto " << ids[0]->getText() << " = "; + visitExpression(exprs[0]); + GetOut() << ";" << std::endl; } } - return visitChildren(ctx); + return std::any{}; } std::string Visitor::GetCppType(TParser::Type_Context* typeCtx) { @@ -292,6 +313,134 @@ std::any Visitor::visitStatement(TParser::StatementContext *ctx) { return visitChildren(ctx); } +std::string Visitor::GetObjectTypeForPrimitiveType(const std::string& typeIdentifier) { + if (typeIdentifier == "int") { + return "IntObject"; + } + if (typeIdentifier == "string") { + return "StringObject"; + } + if (typeIdentifier == "bool") { + return "BoolObject"; + } + throw std::runtime_error("Unknown primitive type " + typeIdentifier); +} + +void Visitor::BuildTypeForTypeLitaral(TParser::TypeLitContext *ctx, std::vector& types) { + if (ctx->arrayType()) { + types.push_back("ListObject"); + } + else if (ctx->asyncChannelType()) { + types.push_back("ChannelObject"); + } + else { + throw std::runtime_error("This type not implemented yet"); + } + + if (ctx->arrayType()->elementType()->type_()->typeName()) { + types.push_back(GetObjectTypeForPrimitiveType(ctx->arrayType()->elementType()->type_()->typeName()->getText())); + } + else { + BuildTypeForTypeLitaral(ctx->arrayType()->elementType()->type_()->typeLit(), types); + } +} + +void Visitor::BuildTypeForLitaralType(TParser::LiteralTypeContext *ctx, std::vector& types) { + if (ctx->arrayType()) { + types.push_back("ListObject"); + } + else if (ctx->structType()) { + throw std::runtime_error("This type not implemented yet"); + } + else { + throw std::runtime_error("This type not implemented yet"); + } + if (ctx->arrayType()->elementType()->type_()->typeName()) { + types.push_back(GetObjectTypeForPrimitiveType(ctx->arrayType()->elementType()->type_()->typeName()->getText())); + } + else { + BuildTypeForTypeLitaral(ctx->arrayType()->elementType()->type_()->typeLit(), types); + } +} + +void Visitor::WriteArrayElement(TParser::ElementContext *ctx, const std::vector& types, std::size_t curDepth) { + if (curDepth >= types.size()) { + throw std::runtime_error("Invalid type literal or value for array"); + } + auto type = types[curDepth]; + if (ctx->expression()) { + GetOut() << type << "(" << ctx->expression()->getText() << ")"; + } + else { + GetOut() << type << "({"; + std::size_t idx = 0; + std::size_t size = ctx->literalValue()->elementList()->keyedElement().size(); + for (const auto keyedElement : ctx->literalValue()->elementList()->keyedElement()) { + WriteArrayElement(keyedElement->element(), types, curDepth + 1); + if (idx < size - 1) { + GetOut() << ","; + } + ++idx; + } + GetOut() << "})"; + } +} + +void Visitor::ProcessArrayDef(TParser::CompositeLitContext *ctx) { + // TODO: Process length (reserve memory) + std::vector types; + BuildTypeForLitaralType(ctx->literalType(), types); + GetOut() << types[0] << "({"; + std::size_t idx = 0; + std::size_t size = ctx->literalValue()->elementList()->keyedElement().size(); + for (const auto keyedElement : ctx->literalValue()->elementList()->keyedElement()) { + WriteArrayElement(keyedElement->element(), types, 1); + if (idx < size - 1) { + GetOut() << ","; + } + ++idx; + } + GetOut() << "})"; +} + +void Visitor::ProcessPrimaryExpr(TParser::PrimaryExprContext *ctx) { + auto literalCtx = ctx->operand()->literal(); + if (!literalCtx) { + GetOut() << ctx->getText(); // (expr) or function call + return; + } + if (literalCtx->basicLit()) { + GetOut() << ctx->getText(); // just number or string or nil + return; + } + if (literalCtx->functionLit()) { + throw std::runtime_error("Lambda functions are not supported yet"); + } + // Process composite type (array or struct) + auto compositeCtx = literalCtx->compositeLit(); + if (compositeCtx->literalType()->arrayType()) { + ProcessArrayDef(compositeCtx); + } + else if (compositeCtx->literalType()->structType()) { + throw std::runtime_error("Structs are not supported yet"); + } + else { + throw std::runtime_error("Unknown composite type"); + } + +} + +std::any Visitor::visitExpression(TParser::ExpressionContext *ctx) { + if (ctx->primaryExpr()) { + ProcessPrimaryExpr(ctx->primaryExpr()); + } + else { + GetOut() << ctx->getText(); // map standard arithmetics 1 to 1 to C++ (excluding complex internal expressions) + } + + return std::any{}; +} + std::any Visitor::visitExpressionStmt(TParser::ExpressionStmtContext *ctx) { GetOutWithIndent() << ctx->getText() << ";" << std::endl; return std::any{}; @@ -344,7 +493,9 @@ std::any Visitor::visitShortVarDecl(TParser::ShortVarDeclContext *ctx) { throw std::runtime_error("Multiple expressions assignment not implemented"); } if (ids.size() == 1) { - GetOutWithIndent() << "auto " << ids[0]->getText() << " = " << exprs[0]->getText() << ";" << std::endl; + GetOutWithIndent() << "auto " << ids[0]->getText() << " = "; + visitExpression(exprs[0]); + GetOut() << ";" << std::endl; return std::any{}; } std::string tupleName = "tuple" + std::to_string(helpingIndex++); diff --git a/parser/visitor/visitor.h b/parser/visitor/visitor.h index a625db1..83e615a 100644 --- a/parser/visitor/visitor.h +++ b/parser/visitor/visitor.h @@ -29,6 +29,7 @@ class Visitor : public TParserBaseVisitor { virtual std::any visitFunctionDecl(TParser::FunctionDeclContext *ctx) override; virtual std::any visitDeclaration(TParser::DeclarationContext *ctx) override; virtual std::any visitStatement(TParser::StatementContext *ctx) override; + virtual std::any visitExpression(TParser::ExpressionContext *ctx) override; virtual std::any visitExpressionStmt(TParser::ExpressionStmtContext *ctx) override; virtual std::any visitEmitStmt(TParser::EmitStmtContext *ctx) override; virtual std::any visitSyncReturnStmt(TParser::SyncReturnStmtContext *ctx) override; @@ -40,6 +41,12 @@ class Visitor : public TParserBaseVisitor { std::ostream& GetOut(); void ProcessDefaultVarDecl(TParser::Type_Context* typeCtx, TParser::IdentifierListContext* identifierListCtx); std::string GetCppType(TParser::Type_Context* typeCtx); + std::string GetObjectTypeForPrimitiveType(const std::string& typeIdentifier); + void ProcessPrimaryExpr(TParser::PrimaryExprContext* ctx); + void BuildTypeForTypeLitaral(TParser::TypeLitContext* ctx, std::vector& types); + void BuildTypeForLitaralType(TParser::LiteralTypeContext *ctx, std::vector& types); + void ProcessArrayDef(TParser::CompositeLitContext* ctx); + void WriteArrayElement(TParser::ElementContext *ctx, const std::vector& types, std::size_t curDepth); private: std::size_t indent_ = 0; diff --git a/runtime/reactor/common/type_system.cpp b/runtime/reactor/common/type_system.cpp index ed1fec6..1cb4d91 100644 --- a/runtime/reactor/common/type_system.cpp +++ b/runtime/reactor/common/type_system.cpp @@ -183,6 +183,61 @@ const std::vector& TupleTypeNode::elements() const noexcept { return elements_; } +StructTypeNode::StructTypeNode(std::string name, std::vector> fields) noexcept + : name_(std::move(name)), fields_(std::move(fields)) {} + +TypeKind StructTypeNode::kind() const noexcept { + return TypeKind::Struct; +} + +bool StructTypeNode::Equals(const TypeNode& other) const noexcept { + auto* rhs = dynamic_cast(&other); + return rhs != nullptr && rhs->name_ == name_ && rhs->fields_ == fields_; +} + +std::string StructTypeNode::ToString() const { + std::vector parts; + parts.reserve(fields_.size()); + for (const auto& field : fields_) { + parts.push_back(field.first + ": " + field.second.ToString()); + } + return "{" + name_ + ";" + JoinStrings(parts, ", ") + "}"; +} + +bool StructTypeNode::IsConcrete() const noexcept { + for (const auto& field : fields_) { + if (!field.second.IsConcrete()) { + return false; + } + } + return true; +} + +size_t StructTypeNode::Hash() const noexcept { + size_t h = std::hash{}(static_cast(TypeKind::Struct)); + for (const auto& field : fields_) { + h = HashCombine(h, field.second.Hash()); + } + return h; +} + +std::string StructTypeNode::Serialize() const { + std::vector parts; + parts.reserve(fields_.size()); + for (const auto& field : fields_) { + parts.push_back(field.first + ": " + field.second.Serialize()); + } + return "{" + name_ + ";" + JoinStrings(parts, ",") + "}"; +} + +const std::string& StructTypeNode::name() const noexcept { + return name_; +} + +const std::vector>& StructTypeNode::fields() const noexcept { + return fields_; +} + ListTypeNode::ListTypeNode(Type element_type) noexcept : element_type_(std::move(element_type)) {} TypeKind ListTypeNode::kind() const noexcept { @@ -350,6 +405,10 @@ Type Type::Tuple(std::vector elements) { return Type(std::make_shared(std::move(elements))); } +Type Type::Struct(const std::string& name, std::vector> fields) { + return Type(std::make_shared(name, std::move(fields))); +} + Type Type::List(Type element_type) { return Type(std::make_shared(std::move(element_type))); } @@ -386,6 +445,14 @@ const std::vector& Type::TupleElements() const { return RequireNode(*this).elements(); } +const std::string& Type::StructName() const { + return RequireNode(*this).name(); +} + +const std::vector>& Type::StructFields() const { + return RequireNode(*this).fields(); +} + const Type& Type::ListElementType() const { return RequireNode(*this).element_type(); } @@ -463,6 +530,28 @@ Type Type::Deserialize(const std::string& serialized) { return Type::Tuple(std::move(elements)); } + // Handle struct types {name;field1:T1,field2:T2,...} + if (serialized[0] == '{' && serialized.back() == '}') { + std::string inner = serialized.substr(1, serialized.size() - 2); + std::vector> fields; + std::string name = inner.substr(0, inner.find(';')); + inner = inner.substr(name.size() + 1); + size_t depth = 0; + size_t start = 0; + for (size_t i = 0; i < inner.size(); ++i) { + if (inner[i] == '(' || inner[i] == '[' || inner[i] == '<') ++depth; + if (inner[i] == ')' || inner[i] == ']' || inner[i] == '>') --depth; + if (depth == 0 && inner[i] == ';') { + fields.push_back(std::make_pair(inner.substr(start, i - start), Deserialize(inner.substr(i + 1)))); + start = i + 1; + } + } + if (start < inner.size()) { + fields.push_back(std::make_pair(inner.substr(start), Deserialize(inner.substr(start)))); + } + return Type::Struct(name, fields); + } + // Handle channel types channel if (serialized.substr(0, 8) == "channel<" && serialized.back() == '>') { std::string inner = serialized.substr(8, serialized.size() - 9); @@ -641,6 +730,36 @@ const Objects& TupleObject::elements() const noexcept { return elements_; } +StructObject::StructObject(const detail::StructTypeNode& type, const Objects& fields) noexcept + : type_(type), fields_(fields) {} + +ObjectKind StructObject::kind() const noexcept { + return ObjectKind::Struct; +} + +Type StructObject::GetType() const { + return Type::Struct(type_.name(), type_.fields()); +} + +std::string StructObject::ToString() const { + std::vector parts; + parts.reserve(fields_.size()); + for (const auto& field : fields_) { + parts.push_back(field.ToString()); + } + return "{" + JoinStrings(parts, ", ") + "}"; +} + +std::string StructObject::Serialize() const { + std::vector parts; + parts.reserve(fields_.size()); + for (const auto& field : fields_) { + parts.push_back(field.Serialize()); + } + return "struct:" + type_.name() + ":{" + JoinStrings(parts, ",") + "}"; +} + + ListObject::ListObject(Objects elements, Maybe declared_element_type) noexcept : elements_(std::move(elements)), element_type_(InferElementType(elements_, declared_element_type)) {} @@ -771,6 +890,10 @@ Object Object::Tuple(Objects elements) { return Object(std::make_shared(std::move(elements))); } +Object Object::Struct(const detail::StructTypeNode& type, const Objects& fields) { + return Object(std::make_shared(type, fields)); +} + Object Object::List(Objects elements, Maybe declared_element_type) { return Object(std::make_shared(std::move(elements), std::move(declared_element_type))); } @@ -899,6 +1022,13 @@ Object Object::Deserialize(const std::string& serialized) { elements.push_back(Deserialize(inner.substr(start))); } return Object::Tuple(std::move(elements)); + } else if (kind_str == "struct") { + if (data.size() < 2 || data.front() != '{' || data.back() != '}') { + throw std::invalid_argument("Invalid struct serialization"); + } + // TODO: Serialize/Deserialize + std::string inner = data.substr(1, data.size() - 2); + } else if (kind_str == "list") { size_t bracket_pos = data.find('['); size_t bracket_end = data.find(']', bracket_pos); @@ -982,6 +1112,13 @@ size_t Object::Hash() const noexcept { } return h; } + case ObjectKind::Struct: { + for (const auto& field : As()->fields()) { + h = HashCombine(h, field.Hash()); + } + h = HashCombine(h, std::hash{}(As()->name())); + return h; + } case ObjectKind::List: { auto list_obj = As(); h = HashCombine(h, list_obj->element_type().Hash()); @@ -1037,6 +1174,19 @@ bool operator==(const Object& lhs, const Object& rhs) noexcept { } return true; } + case ObjectKind::Struct: { + const auto& lhs_fields = lhs.As()->fields(); + const auto& rhs_fields = rhs.As()->fields(); + if (lhs_fields.size() != rhs_fields.size()) { + return false; + } + for (size_t i = 0; i < lhs_fields.size(); ++i) { + if (lhs_fields[i] != rhs_fields[i]) { + return false; + } + } + return true; + } case ObjectKind::List: { const auto& lhs_elems = lhs.As()->elements(); const auto& rhs_elems = rhs.As()->elements(); @@ -1113,6 +1263,27 @@ bool IsInstanceOf(const Object& object, const Type& type) noexcept { } return true; } + case TypeKind::Struct: { + auto struct_object = object.As(); + if (!struct_object) { + return false; + } + const auto& struct_type = type.StructName(); + if (struct_object->name() != struct_type) { + return false; + } + const auto& fields = struct_object->fields(); + const auto& field_types = type.StructFields(); + if (fields.size() != field_types.size()) { + return false; + } + for (size_t i = 0; i < fields.size(); ++i) { + if (!field_types[i].second.Accepts(fields[i])) { + return false; + } + } + return true; + } case TypeKind::List: { auto list_object = object.As(); if (!list_object) { @@ -1156,6 +1327,8 @@ std::string ToString(TypeKind kind) { return "string"; case TypeKind::Tuple: return "tuple"; + case TypeKind::Struct: + return "struct"; case TypeKind::List: return "list"; case TypeKind::Channel: @@ -1180,6 +1353,8 @@ std::string ToString(ObjectKind kind) { return "string"; case ObjectKind::Tuple: return "tuple"; + case ObjectKind::Struct: + return "struct"; case ObjectKind::List: return "list"; case ObjectKind::Algebraic: diff --git a/runtime/reactor/common/type_system.hpp b/runtime/reactor/common/type_system.hpp index 82e18af..7ed2e9d 100644 --- a/runtime/reactor/common/type_system.hpp +++ b/runtime/reactor/common/type_system.hpp @@ -35,6 +35,7 @@ enum class TypeKind { Bool, String, Tuple, + Struct, List, Channel, Algebraic, @@ -47,6 +48,7 @@ enum class ObjectKind { Bool, String, Tuple, + Struct, List, Algebraic, Channel, @@ -57,6 +59,7 @@ class TypeNode; class PrimitiveTypeNode; class VariableTypeNode; class TupleTypeNode; +class StructTypeNode; class ListTypeNode; class ChannelTypeNode; class AlgebraicTypeNode; @@ -73,6 +76,7 @@ class Type { static Type String(); static Type Variable(std::string name); static Type Tuple(std::vector elements); + static Type Struct(const std::string& name, std::vector> fields); static Type List(Type element_type); static Type Channel(ChannelMode mode, Type payload_type); static Type SyncChannel(Type payload_type); @@ -84,6 +88,8 @@ class Type { [[nodiscard]] std::string ToString() const; [[nodiscard]] const std::vector& TupleElements() const; + [[nodiscard]] const std::string& StructName() const; + [[nodiscard]] const std::vector>& StructFields() const; [[nodiscard]] const Type& ListElementType() const; [[nodiscard]] ChannelMode GetChannelMode() const; [[nodiscard]] const Type& ChannelPayloadType() const; @@ -169,6 +175,25 @@ class TupleTypeNode final : public TypeNode { std::vector elements_; }; +class StructTypeNode final : public TypeNode { +public: + explicit StructTypeNode(std::string name, std::vector> fields) noexcept; + + TypeKind kind() const noexcept override; + bool Equals(const TypeNode& other) const noexcept override; + std::string ToString() const override; + bool IsConcrete() const noexcept override; + size_t Hash() const noexcept override; + std::string Serialize() const override; + + const std::string& name() const noexcept; + const std::vector>& fields() const noexcept; + +private: + std::string name_; + std::vector> fields_; +}; + class ListTypeNode final : public TypeNode { public: explicit ListTypeNode(Type element_type) noexcept; @@ -303,6 +328,24 @@ class TupleObject final : public ObjectValue { Objects elements_; }; +class StructObject final : public ObjectValue { +public: + StructObject(const detail::StructTypeNode& type, const Objects& fields) noexcept; + + ObjectKind kind() const noexcept override; + Type GetType() const override; + std::string ToString() const override; + std::string Serialize() const override; + + const std::string& name() const noexcept; + const Objects& fields() const noexcept; + const Type& field_type(const std::string& name) const; + ObjectValue& field_value(const std::string& name) const; +private: + detail::StructTypeNode type_; + Objects fields_; +}; + class ListObject final : public ObjectValue { public: ListObject(Objects elements, Maybe declared_element_type = {}) noexcept; @@ -370,6 +413,7 @@ class Object { static Object Bool(bool value); static Object String(std::string value); static Object Tuple(Objects elements); + static Object Struct(const detail::StructTypeNode&, const Objects& fields); static Object List(Objects elements, Maybe declared_element_type = {}); static Object Algebraic(Type algebraic_type, std::string constructor_name, Objects fields = {}); static Object Channel(Pointer channel);