diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 b/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 index 8ca7c8717..5a3e72658 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 @@ -76,7 +76,6 @@ typeSpecifier declarator : NAME #declaratorName // {if(isTypedef) Parser.addTypedef($NAME.text);} - //| declarator PAR_BEGIN parameterListDecl? PAR_END #declaratorProcedure | declarator BRACKET_BEGIN (expr)? BRACKET_END #declaratorArray | ASTERISK directive* declarator #declaratorPointer | PAR_BEGIN declarator PAR_END #declaratorPar @@ -202,7 +201,7 @@ switchCase: forLoop : forClassicInit ';' forClassicCondition? ';' commaExpr? #forClassic - | (declType declPointer*)? NAME COLON expr RANGE expr #forRange + | declType declarator COLON expr RANGE expr #forRange ; forClassicInit diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.interp b/src/main/java/dk/camelot64/kickc/parser/KickCParser.interp index b6f11d6fd..e56f010ab 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.interp +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.interp @@ -364,4 +364,4 @@ asmExpr atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 156, 873, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 7, 4, 106, 10, 4, 12, 4, 14, 4, 109, 11, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 125, 10, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 136, 10, 7, 12, 7, 14, 7, 139, 11, 7, 3, 8, 3, 8, 3, 8, 5, 8, 144, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 150, 10, 8, 3, 9, 3, 9, 3, 9, 7, 9, 155, 10, 9, 12, 9, 14, 9, 158, 11, 9, 3, 9, 3, 9, 7, 9, 162, 10, 9, 12, 9, 14, 9, 165, 11, 9, 3, 9, 3, 9, 3, 10, 7, 10, 170, 10, 10, 12, 10, 14, 10, 173, 11, 10, 3, 10, 3, 10, 7, 10, 177, 10, 10, 12, 10, 14, 10, 180, 11, 10, 3, 11, 3, 11, 7, 11, 184, 10, 11, 12, 11, 14, 11, 187, 11, 11, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 203, 10, 13, 3, 13, 7, 13, 206, 10, 13, 12, 13, 14, 13, 209, 11, 13, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 215, 10, 14, 12, 14, 14, 14, 218, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 225, 10, 14, 3, 14, 3, 14, 3, 14, 5, 14, 230, 10, 14, 3, 14, 7, 14, 233, 10, 14, 12, 14, 14, 14, 236, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 242, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 249, 10, 15, 3, 15, 3, 15, 3, 15, 7, 15, 254, 10, 15, 12, 15, 14, 15, 257, 11, 15, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 5, 17, 264, 10, 17, 3, 17, 3, 17, 6, 17, 268, 10, 17, 13, 17, 14, 17, 269, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 294, 10, 21, 12, 21, 14, 21, 297, 11, 21, 3, 22, 3, 22, 3, 22, 5, 22, 302, 10, 22, 3, 23, 3, 23, 7, 23, 306, 10, 23, 12, 23, 14, 23, 309, 11, 23, 3, 23, 3, 23, 3, 23, 5, 23, 314, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 319, 10, 23, 3, 24, 3, 24, 5, 24, 323, 10, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 7, 25, 330, 10, 25, 12, 25, 14, 25, 333, 11, 25, 3, 26, 3, 26, 7, 26, 337, 10, 26, 12, 26, 14, 26, 340, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 346, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 354, 10, 27, 12, 27, 14, 27, 357, 11, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 368, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 379, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 400, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 407, 10, 29, 12, 29, 14, 29, 410, 11, 29, 3, 29, 3, 29, 3, 29, 5, 29, 415, 10, 29, 3, 30, 6, 30, 418, 10, 30, 13, 30, 14, 30, 419, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 427, 10, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 440, 10, 31, 3, 31, 7, 31, 443, 10, 31, 12, 31, 14, 31, 446, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 455, 10, 31, 12, 31, 14, 31, 458, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 469, 10, 31, 12, 31, 14, 31, 472, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 490, 10, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 499, 10, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 507, 10, 31, 3, 32, 6, 32, 510, 10, 32, 13, 32, 14, 32, 511, 3, 32, 3, 32, 3, 32, 5, 32, 517, 10, 32, 5, 32, 519, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 525, 10, 33, 3, 34, 3, 34, 3, 34, 5, 34, 530, 10, 34, 3, 34, 3, 34, 5, 34, 534, 10, 34, 3, 34, 3, 34, 7, 34, 538, 10, 34, 12, 34, 14, 34, 541, 11, 34, 5, 34, 543, 10, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 551, 10, 34, 3, 35, 5, 35, 554, 10, 35, 3, 35, 5, 35, 557, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 567, 10, 37, 12, 37, 14, 37, 570, 11, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 581, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 589, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 595, 10, 38, 3, 38, 3, 38, 5, 38, 599, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 618, 10, 38, 12, 38, 14, 38, 621, 11, 38, 3, 38, 5, 38, 624, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 6, 38, 631, 10, 38, 13, 38, 14, 38, 632, 3, 38, 3, 38, 5, 38, 637, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 687, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 697, 10, 38, 12, 38, 14, 38, 700, 11, 38, 3, 39, 3, 39, 3, 39, 7, 39, 705, 10, 39, 12, 39, 14, 39, 708, 11, 39, 3, 40, 3, 40, 5, 40, 712, 10, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 7, 41, 720, 10, 41, 12, 41, 14, 41, 723, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 737, 10, 42, 3, 43, 7, 43, 740, 10, 43, 12, 43, 14, 43, 743, 11, 43, 3, 44, 3, 44, 3, 44, 5, 44, 748, 10, 44, 3, 45, 3, 45, 3, 45, 7, 45, 753, 10, 45, 12, 45, 14, 45, 756, 11, 45, 3, 45, 3, 45, 3, 45, 7, 45, 761, 10, 45, 12, 45, 14, 45, 764, 11, 45, 5, 45, 766, 10, 45, 3, 46, 3, 46, 5, 46, 770, 10, 46, 3, 46, 7, 46, 773, 10, 46, 12, 46, 14, 46, 776, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 7, 47, 782, 10, 47, 12, 47, 14, 47, 785, 11, 47, 3, 47, 7, 47, 788, 10, 47, 12, 47, 14, 47, 791, 11, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 838, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 854, 10, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 7, 49, 868, 10, 49, 12, 49, 14, 49, 871, 11, 49, 3, 49, 2, 10, 12, 24, 26, 28, 40, 72, 74, 96, 50, 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, 2, 13, 3, 2, 23, 24, 5, 2, 18, 19, 25, 26, 82, 82, 4, 2, 33, 33, 36, 36, 3, 2, 29, 30, 3, 2, 20, 22, 3, 2, 18, 19, 3, 2, 31, 36, 3, 2, 127, 130, 3, 2, 125, 126, 3, 2, 131, 132, 3, 2, 127, 128, 2, 999, 2, 98, 3, 2, 2, 2, 4, 101, 3, 2, 2, 2, 6, 107, 3, 2, 2, 2, 8, 124, 3, 2, 2, 2, 10, 126, 3, 2, 2, 2, 12, 129, 3, 2, 2, 2, 14, 149, 3, 2, 2, 2, 16, 151, 3, 2, 2, 2, 18, 171, 3, 2, 2, 2, 20, 181, 3, 2, 2, 2, 22, 188, 3, 2, 2, 2, 24, 194, 3, 2, 2, 2, 26, 224, 3, 2, 2, 2, 28, 248, 3, 2, 2, 2, 30, 258, 3, 2, 2, 2, 32, 261, 3, 2, 2, 2, 34, 273, 3, 2, 2, 2, 36, 276, 3, 2, 2, 2, 38, 279, 3, 2, 2, 2, 40, 287, 3, 2, 2, 2, 42, 298, 3, 2, 2, 2, 44, 303, 3, 2, 2, 2, 46, 320, 3, 2, 2, 2, 48, 326, 3, 2, 2, 2, 50, 345, 3, 2, 2, 2, 52, 347, 3, 2, 2, 2, 54, 367, 3, 2, 2, 2, 56, 414, 3, 2, 2, 2, 58, 417, 3, 2, 2, 2, 60, 506, 3, 2, 2, 2, 62, 509, 3, 2, 2, 2, 64, 520, 3, 2, 2, 2, 66, 550, 3, 2, 2, 2, 68, 556, 3, 2, 2, 2, 70, 558, 3, 2, 2, 2, 72, 560, 3, 2, 2, 2, 74, 636, 3, 2, 2, 2, 76, 701, 3, 2, 2, 2, 78, 709, 3, 2, 2, 2, 80, 715, 3, 2, 2, 2, 82, 736, 3, 2, 2, 2, 84, 741, 3, 2, 2, 2, 86, 747, 3, 2, 2, 2, 88, 765, 3, 2, 2, 2, 90, 767, 3, 2, 2, 2, 92, 777, 3, 2, 2, 2, 94, 837, 3, 2, 2, 2, 96, 853, 3, 2, 2, 2, 98, 99, 5, 6, 4, 2, 99, 100, 7, 2, 2, 3, 100, 3, 3, 2, 2, 2, 101, 102, 5, 84, 43, 2, 102, 103, 7, 2, 2, 3, 103, 5, 3, 2, 2, 2, 104, 106, 5, 8, 5, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 7, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 5, 10, 6, 2, 111, 112, 7, 10, 2, 2, 112, 125, 3, 2, 2, 2, 113, 125, 5, 44, 23, 2, 114, 115, 5, 32, 17, 2, 115, 116, 7, 10, 2, 2, 116, 125, 3, 2, 2, 2, 117, 118, 5, 38, 20, 2, 118, 119, 7, 10, 2, 2, 119, 125, 3, 2, 2, 2, 120, 125, 5, 52, 27, 2, 121, 122, 5, 16, 9, 2, 122, 123, 7, 10, 2, 2, 123, 125, 3, 2, 2, 2, 124, 110, 3, 2, 2, 2, 124, 113, 3, 2, 2, 2, 124, 114, 3, 2, 2, 2, 124, 117, 3, 2, 2, 2, 124, 120, 3, 2, 2, 2, 124, 121, 3, 2, 2, 2, 125, 9, 3, 2, 2, 2, 126, 127, 5, 18, 10, 2, 127, 128, 5, 12, 7, 2, 128, 11, 3, 2, 2, 2, 129, 130, 8, 7, 1, 2, 130, 131, 5, 14, 8, 2, 131, 137, 3, 2, 2, 2, 132, 133, 12, 3, 2, 2, 133, 134, 7, 12, 2, 2, 134, 136, 5, 14, 8, 2, 135, 132, 3, 2, 2, 2, 136, 139, 3, 2, 2, 2, 137, 135, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 13, 3, 2, 2, 2, 139, 137, 3, 2, 2, 2, 140, 143, 5, 26, 14, 2, 141, 142, 7, 39, 2, 2, 142, 144, 5, 74, 38, 2, 143, 141, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 150, 3, 2, 2, 2, 145, 146, 5, 26, 14, 2, 146, 147, 7, 39, 2, 2, 147, 148, 5, 78, 40, 2, 148, 150, 3, 2, 2, 2, 149, 140, 3, 2, 2, 2, 149, 145, 3, 2, 2, 2, 150, 15, 3, 2, 2, 2, 151, 152, 7, 41, 2, 2, 152, 156, 5, 18, 10, 2, 153, 155, 5, 20, 11, 2, 154, 153, 3, 2, 2, 2, 155, 158, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 159, 3, 2, 2, 2, 158, 156, 3, 2, 2, 2, 159, 163, 7, 109, 2, 2, 160, 162, 5, 22, 12, 2, 161, 160, 3, 2, 2, 2, 162, 165, 3, 2, 2, 2, 163, 161, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 166, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 166, 167, 8, 9, 1, 2, 167, 17, 3, 2, 2, 2, 168, 170, 5, 56, 29, 2, 169, 168, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 178, 5, 28, 15, 2, 175, 177, 5, 56, 29, 2, 176, 175, 3, 2, 2, 2, 177, 180, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 178, 179, 3, 2, 2, 2, 179, 19, 3, 2, 2, 2, 180, 178, 3, 2, 2, 2, 181, 185, 7, 20, 2, 2, 182, 184, 5, 56, 29, 2, 183, 182, 3, 2, 2, 2, 184, 187, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 21, 3, 2, 2, 2, 187, 185, 3, 2, 2, 2, 188, 190, 7, 6, 2, 2, 189, 191, 5, 74, 38, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 7, 2, 2, 193, 23, 3, 2, 2, 2, 194, 195, 8, 13, 1, 2, 195, 196, 5, 28, 15, 2, 196, 207, 3, 2, 2, 2, 197, 198, 12, 4, 2, 2, 198, 206, 7, 20, 2, 2, 199, 200, 12, 3, 2, 2, 200, 202, 7, 6, 2, 2, 201, 203, 5, 74, 38, 2, 202, 201, 3, 2, 2, 2, 202, 203, 3, 2, 2, 2, 203, 204, 3, 2, 2, 2, 204, 206, 7, 7, 2, 2, 205, 197, 3, 2, 2, 2, 205, 199, 3, 2, 2, 2, 206, 209, 3, 2, 2, 2, 207, 205, 3, 2, 2, 2, 207, 208, 3, 2, 2, 2, 208, 25, 3, 2, 2, 2, 209, 207, 3, 2, 2, 2, 210, 211, 8, 14, 1, 2, 211, 225, 7, 109, 2, 2, 212, 216, 7, 20, 2, 2, 213, 215, 5, 56, 29, 2, 214, 213, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 219, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 225, 5, 26, 14, 4, 220, 221, 7, 8, 2, 2, 221, 222, 5, 26, 14, 2, 222, 223, 7, 9, 2, 2, 223, 225, 3, 2, 2, 2, 224, 210, 3, 2, 2, 2, 224, 212, 3, 2, 2, 2, 224, 220, 3, 2, 2, 2, 225, 234, 3, 2, 2, 2, 226, 227, 12, 5, 2, 2, 227, 229, 7, 6, 2, 2, 228, 230, 5, 74, 38, 2, 229, 228, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 233, 7, 7, 2, 2, 232, 226, 3, 2, 2, 2, 233, 236, 3, 2, 2, 2, 234, 232, 3, 2, 2, 2, 234, 235, 3, 2, 2, 2, 235, 27, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 237, 238, 8, 15, 1, 2, 238, 249, 7, 84, 2, 2, 239, 241, 7, 83, 2, 2, 240, 242, 7, 84, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 249, 3, 2, 2, 2, 243, 249, 5, 32, 17, 2, 244, 249, 5, 30, 16, 2, 245, 249, 5, 38, 20, 2, 246, 249, 5, 36, 19, 2, 247, 249, 7, 3, 2, 2, 248, 237, 3, 2, 2, 2, 248, 239, 3, 2, 2, 2, 248, 243, 3, 2, 2, 2, 248, 244, 3, 2, 2, 2, 248, 245, 3, 2, 2, 2, 248, 246, 3, 2, 2, 2, 248, 247, 3, 2, 2, 2, 249, 255, 3, 2, 2, 2, 250, 251, 12, 8, 2, 2, 251, 252, 7, 8, 2, 2, 252, 254, 7, 9, 2, 2, 253, 250, 3, 2, 2, 2, 254, 257, 3, 2, 2, 2, 255, 253, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 29, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 258, 259, 7, 71, 2, 2, 259, 260, 7, 109, 2, 2, 260, 31, 3, 2, 2, 2, 261, 263, 7, 71, 2, 2, 262, 264, 7, 109, 2, 2, 263, 262, 3, 2, 2, 2, 263, 264, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 267, 7, 4, 2, 2, 266, 268, 5, 34, 18, 2, 267, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 272, 7, 5, 2, 2, 272, 33, 3, 2, 2, 2, 273, 274, 5, 10, 6, 2, 274, 275, 7, 10, 2, 2, 275, 35, 3, 2, 2, 2, 276, 277, 7, 72, 2, 2, 277, 278, 7, 109, 2, 2, 278, 37, 3, 2, 2, 2, 279, 281, 7, 72, 2, 2, 280, 282, 7, 109, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 284, 7, 4, 2, 2, 284, 285, 5, 40, 21, 2, 285, 286, 7, 5, 2, 2, 286, 39, 3, 2, 2, 2, 287, 288, 8, 21, 1, 2, 288, 289, 5, 42, 22, 2, 289, 295, 3, 2, 2, 2, 290, 291, 12, 3, 2, 2, 291, 292, 7, 12, 2, 2, 292, 294, 5, 42, 22, 2, 293, 290, 3, 2, 2, 2, 294, 297, 3, 2, 2, 2, 295, 293, 3, 2, 2, 2, 295, 296, 3, 2, 2, 2, 296, 41, 3, 2, 2, 2, 297, 295, 3, 2, 2, 2, 298, 301, 7, 109, 2, 2, 299, 300, 7, 39, 2, 2, 300, 302, 5, 74, 38, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 43, 3, 2, 2, 2, 303, 307, 5, 18, 10, 2, 304, 306, 5, 20, 11, 2, 305, 304, 3, 2, 2, 2, 306, 309, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 310, 311, 7, 109, 2, 2, 311, 313, 7, 8, 2, 2, 312, 314, 5, 48, 25, 2, 313, 312, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 318, 7, 9, 2, 2, 316, 319, 5, 46, 24, 2, 317, 319, 7, 10, 2, 2, 318, 316, 3, 2, 2, 2, 318, 317, 3, 2, 2, 2, 319, 45, 3, 2, 2, 2, 320, 322, 7, 4, 2, 2, 321, 323, 5, 58, 30, 2, 322, 321, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 324, 3, 2, 2, 2, 324, 325, 7, 5, 2, 2, 325, 47, 3, 2, 2, 2, 326, 331, 5, 50, 26, 2, 327, 328, 7, 12, 2, 2, 328, 330, 5, 50, 26, 2, 329, 327, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 331, 332, 3, 2, 2, 2, 332, 49, 3, 2, 2, 2, 333, 331, 3, 2, 2, 2, 334, 338, 5, 18, 10, 2, 335, 337, 5, 20, 11, 2, 336, 335, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 341, 3, 2, 2, 2, 340, 338, 3, 2, 2, 2, 341, 342, 7, 109, 2, 2, 342, 346, 3, 2, 2, 2, 343, 346, 7, 84, 2, 2, 344, 346, 7, 14, 2, 2, 345, 334, 3, 2, 2, 2, 345, 343, 3, 2, 2, 2, 345, 344, 3, 2, 2, 2, 346, 51, 3, 2, 2, 2, 347, 348, 7, 89, 2, 2, 348, 349, 7, 109, 2, 2, 349, 350, 7, 8, 2, 2, 350, 355, 5, 54, 28, 2, 351, 352, 7, 12, 2, 2, 352, 354, 5, 54, 28, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 358, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 359, 7, 9, 2, 2, 359, 53, 3, 2, 2, 2, 360, 368, 7, 100, 2, 2, 361, 362, 7, 100, 2, 2, 362, 363, 7, 13, 2, 2, 363, 368, 7, 100, 2, 2, 364, 368, 7, 109, 2, 2, 365, 368, 7, 110, 2, 2, 366, 368, 7, 58, 2, 2, 367, 360, 3, 2, 2, 2, 367, 361, 3, 2, 2, 2, 367, 364, 3, 2, 2, 2, 367, 365, 3, 2, 2, 2, 367, 366, 3, 2, 2, 2, 368, 55, 3, 2, 2, 2, 369, 415, 7, 42, 2, 2, 370, 371, 7, 45, 2, 2, 371, 372, 7, 8, 2, 2, 372, 373, 7, 100, 2, 2, 373, 415, 7, 9, 2, 2, 374, 378, 7, 50, 2, 2, 375, 376, 7, 8, 2, 2, 376, 377, 7, 109, 2, 2, 377, 379, 7, 9, 2, 2, 378, 375, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 415, 3, 2, 2, 2, 380, 415, 7, 53, 2, 2, 381, 415, 7, 54, 2, 2, 382, 383, 7, 52, 2, 2, 383, 384, 7, 8, 2, 2, 384, 385, 5, 74, 38, 2, 385, 386, 7, 9, 2, 2, 386, 415, 3, 2, 2, 2, 387, 415, 7, 47, 2, 2, 388, 415, 7, 48, 2, 2, 389, 415, 7, 55, 2, 2, 390, 415, 7, 56, 2, 2, 391, 415, 7, 43, 2, 2, 392, 415, 7, 44, 2, 2, 393, 415, 7, 46, 2, 2, 394, 415, 7, 57, 2, 2, 395, 399, 7, 49, 2, 2, 396, 397, 7, 8, 2, 2, 397, 398, 7, 109, 2, 2, 398, 400, 7, 9, 2, 2, 399, 396, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 415, 3, 2, 2, 2, 401, 402, 7, 51, 2, 2, 402, 403, 7, 8, 2, 2, 403, 408, 5, 54, 28, 2, 404, 405, 7, 12, 2, 2, 405, 407, 5, 54, 28, 2, 406, 404, 3, 2, 2, 2, 407, 410, 3, 2, 2, 2, 408, 406, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 411, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 411, 412, 7, 9, 2, 2, 412, 415, 3, 2, 2, 2, 413, 415, 7, 58, 2, 2, 414, 369, 3, 2, 2, 2, 414, 370, 3, 2, 2, 2, 414, 374, 3, 2, 2, 2, 414, 380, 3, 2, 2, 2, 414, 381, 3, 2, 2, 2, 414, 382, 3, 2, 2, 2, 414, 387, 3, 2, 2, 2, 414, 388, 3, 2, 2, 2, 414, 389, 3, 2, 2, 2, 414, 390, 3, 2, 2, 2, 414, 391, 3, 2, 2, 2, 414, 392, 3, 2, 2, 2, 414, 393, 3, 2, 2, 2, 414, 394, 3, 2, 2, 2, 414, 395, 3, 2, 2, 2, 414, 401, 3, 2, 2, 2, 414, 413, 3, 2, 2, 2, 415, 57, 3, 2, 2, 2, 416, 418, 5, 60, 31, 2, 417, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 417, 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 59, 3, 2, 2, 2, 421, 422, 5, 10, 6, 2, 422, 423, 7, 10, 2, 2, 423, 507, 3, 2, 2, 2, 424, 426, 7, 4, 2, 2, 425, 427, 5, 58, 30, 2, 426, 425, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 507, 7, 5, 2, 2, 429, 430, 5, 72, 37, 2, 430, 431, 7, 10, 2, 2, 431, 507, 3, 2, 2, 2, 432, 433, 7, 59, 2, 2, 433, 434, 7, 8, 2, 2, 434, 435, 5, 72, 37, 2, 435, 436, 7, 9, 2, 2, 436, 439, 5, 60, 31, 2, 437, 438, 7, 60, 2, 2, 438, 440, 5, 60, 31, 2, 439, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 507, 3, 2, 2, 2, 441, 443, 5, 56, 29, 2, 442, 441, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 447, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 448, 7, 61, 2, 2, 448, 449, 7, 8, 2, 2, 449, 450, 5, 72, 37, 2, 450, 451, 7, 9, 2, 2, 451, 452, 5, 60, 31, 2, 452, 507, 3, 2, 2, 2, 453, 455, 5, 56, 29, 2, 454, 453, 3, 2, 2, 2, 455, 458, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 459, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 460, 7, 62, 2, 2, 460, 461, 5, 60, 31, 2, 461, 462, 7, 61, 2, 2, 462, 463, 7, 8, 2, 2, 463, 464, 5, 72, 37, 2, 464, 465, 7, 9, 2, 2, 465, 466, 7, 10, 2, 2, 466, 507, 3, 2, 2, 2, 467, 469, 5, 56, 29, 2, 468, 467, 3, 2, 2, 2, 469, 472, 3, 2, 2, 2, 470, 468, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 473, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 473, 474, 7, 63, 2, 2, 474, 475, 7, 8, 2, 2, 475, 476, 5, 66, 34, 2, 476, 477, 7, 9, 2, 2, 477, 478, 5, 60, 31, 2, 478, 507, 3, 2, 2, 2, 479, 480, 7, 64, 2, 2, 480, 481, 7, 8, 2, 2, 481, 482, 5, 72, 37, 2, 482, 483, 7, 9, 2, 2, 483, 484, 7, 4, 2, 2, 484, 485, 5, 62, 32, 2, 485, 486, 7, 5, 2, 2, 486, 507, 3, 2, 2, 2, 487, 489, 7, 65, 2, 2, 488, 490, 5, 72, 37, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 507, 7, 10, 2, 2, 492, 493, 7, 66, 2, 2, 493, 507, 7, 10, 2, 2, 494, 495, 7, 67, 2, 2, 495, 507, 7, 10, 2, 2, 496, 498, 7, 68, 2, 2, 497, 499, 5, 80, 41, 2, 498, 497, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 500, 3, 2, 2, 2, 500, 501, 7, 4, 2, 2, 501, 502, 5, 84, 43, 2, 502, 503, 7, 134, 2, 2, 503, 507, 3, 2, 2, 2, 504, 507, 5, 78, 40, 2, 505, 507, 7, 10, 2, 2, 506, 421, 3, 2, 2, 2, 506, 424, 3, 2, 2, 2, 506, 429, 3, 2, 2, 2, 506, 432, 3, 2, 2, 2, 506, 444, 3, 2, 2, 2, 506, 456, 3, 2, 2, 2, 506, 470, 3, 2, 2, 2, 506, 479, 3, 2, 2, 2, 506, 487, 3, 2, 2, 2, 506, 492, 3, 2, 2, 2, 506, 494, 3, 2, 2, 2, 506, 496, 3, 2, 2, 2, 506, 504, 3, 2, 2, 2, 506, 505, 3, 2, 2, 2, 507, 61, 3, 2, 2, 2, 508, 510, 5, 64, 33, 2, 509, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 509, 3, 2, 2, 2, 511, 512, 3, 2, 2, 2, 512, 518, 3, 2, 2, 2, 513, 514, 7, 69, 2, 2, 514, 516, 7, 11, 2, 2, 515, 517, 5, 58, 30, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 519, 3, 2, 2, 2, 518, 513, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 63, 3, 2, 2, 2, 520, 521, 7, 70, 2, 2, 521, 522, 5, 74, 38, 2, 522, 524, 7, 11, 2, 2, 523, 525, 5, 58, 30, 2, 524, 523, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 65, 3, 2, 2, 2, 526, 527, 5, 68, 35, 2, 527, 529, 7, 10, 2, 2, 528, 530, 5, 70, 36, 2, 529, 528, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 531, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 534, 5, 72, 37, 2, 533, 532, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 551, 3, 2, 2, 2, 535, 539, 5, 18, 10, 2, 536, 538, 5, 20, 11, 2, 537, 536, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 540, 3, 2, 2, 2, 540, 543, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 542, 535, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 545, 7, 109, 2, 2, 545, 546, 7, 11, 2, 2, 546, 547, 5, 74, 38, 2, 547, 548, 7, 13, 2, 2, 548, 549, 5, 74, 38, 2, 549, 551, 3, 2, 2, 2, 550, 526, 3, 2, 2, 2, 550, 542, 3, 2, 2, 2, 551, 67, 3, 2, 2, 2, 552, 554, 5, 10, 6, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 557, 5, 72, 37, 2, 556, 553, 3, 2, 2, 2, 556, 555, 3, 2, 2, 2, 557, 69, 3, 2, 2, 2, 558, 559, 5, 72, 37, 2, 559, 71, 3, 2, 2, 2, 560, 561, 8, 37, 1, 2, 561, 562, 5, 74, 38, 2, 562, 568, 3, 2, 2, 2, 563, 564, 12, 3, 2, 2, 564, 565, 7, 12, 2, 2, 565, 567, 5, 74, 38, 2, 566, 563, 3, 2, 2, 2, 567, 570, 3, 2, 2, 2, 568, 566, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 73, 3, 2, 2, 2, 570, 568, 3, 2, 2, 2, 571, 572, 8, 38, 1, 2, 572, 573, 7, 8, 2, 2, 573, 574, 5, 72, 37, 2, 574, 575, 7, 9, 2, 2, 575, 637, 3, 2, 2, 2, 576, 577, 7, 73, 2, 2, 577, 580, 7, 8, 2, 2, 578, 581, 5, 74, 38, 2, 579, 581, 5, 24, 13, 2, 580, 578, 3, 2, 2, 2, 580, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 583, 7, 9, 2, 2, 583, 637, 3, 2, 2, 2, 584, 585, 7, 74, 2, 2, 585, 588, 7, 8, 2, 2, 586, 589, 5, 74, 38, 2, 587, 589, 5, 24, 13, 2, 588, 586, 3, 2, 2, 2, 588, 587, 3, 2, 2, 2, 589, 590, 3, 2, 2, 2, 590, 591, 7, 9, 2, 2, 591, 637, 3, 2, 2, 2, 592, 594, 7, 75, 2, 2, 593, 595, 7, 8, 2, 2, 594, 593, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 596, 3, 2, 2, 2, 596, 598, 7, 109, 2, 2, 597, 599, 7, 9, 2, 2, 598, 597, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 637, 3, 2, 2, 2, 600, 601, 7, 8, 2, 2, 601, 602, 5, 24, 13, 2, 602, 603, 7, 9, 2, 2, 603, 604, 5, 74, 38, 26, 604, 637, 3, 2, 2, 2, 605, 606, 9, 2, 2, 2, 606, 637, 5, 74, 38, 25, 607, 608, 7, 20, 2, 2, 608, 637, 5, 74, 38, 23, 609, 610, 9, 3, 2, 2, 610, 637, 5, 74, 38, 22, 611, 612, 9, 4, 2, 2, 612, 637, 5, 74, 38, 18, 613, 614, 7, 4, 2, 2, 614, 619, 5, 74, 38, 2, 615, 616, 7, 12, 2, 2, 616, 618, 5, 74, 38, 2, 617, 615, 3, 2, 2, 2, 618, 621, 3, 2, 2, 2, 619, 617, 3, 2, 2, 2, 619, 620, 3, 2, 2, 2, 620, 623, 3, 2, 2, 2, 621, 619, 3, 2, 2, 2, 622, 624, 7, 12, 2, 2, 623, 622, 3, 2, 2, 2, 623, 624, 3, 2, 2, 2, 624, 625, 3, 2, 2, 2, 625, 626, 7, 5, 2, 2, 626, 637, 3, 2, 2, 2, 627, 637, 7, 109, 2, 2, 628, 637, 7, 100, 2, 2, 629, 631, 7, 110, 2, 2, 630, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 630, 3, 2, 2, 2, 632, 633, 3, 2, 2, 2, 633, 637, 3, 2, 2, 2, 634, 637, 7, 111, 2, 2, 635, 637, 7, 85, 2, 2, 636, 571, 3, 2, 2, 2, 636, 576, 3, 2, 2, 2, 636, 584, 3, 2, 2, 2, 636, 592, 3, 2, 2, 2, 636, 600, 3, 2, 2, 2, 636, 605, 3, 2, 2, 2, 636, 607, 3, 2, 2, 2, 636, 609, 3, 2, 2, 2, 636, 611, 3, 2, 2, 2, 636, 613, 3, 2, 2, 2, 636, 627, 3, 2, 2, 2, 636, 628, 3, 2, 2, 2, 636, 630, 3, 2, 2, 2, 636, 634, 3, 2, 2, 2, 636, 635, 3, 2, 2, 2, 637, 698, 3, 2, 2, 2, 638, 639, 12, 21, 2, 2, 639, 640, 9, 5, 2, 2, 640, 697, 5, 74, 38, 22, 641, 642, 12, 20, 2, 2, 642, 643, 9, 6, 2, 2, 643, 697, 5, 74, 38, 21, 644, 645, 12, 19, 2, 2, 645, 646, 9, 7, 2, 2, 646, 697, 5, 74, 38, 20, 647, 648, 12, 17, 2, 2, 648, 649, 9, 8, 2, 2, 649, 697, 5, 74, 38, 18, 650, 651, 12, 16, 2, 2, 651, 652, 7, 25, 2, 2, 652, 697, 5, 74, 38, 17, 653, 654, 12, 15, 2, 2, 654, 655, 7, 27, 2, 2, 655, 697, 5, 74, 38, 16, 656, 657, 12, 14, 2, 2, 657, 658, 7, 28, 2, 2, 658, 697, 5, 74, 38, 15, 659, 660, 12, 13, 2, 2, 660, 661, 7, 37, 2, 2, 661, 697, 5, 74, 38, 14, 662, 663, 12, 12, 2, 2, 663, 664, 7, 38, 2, 2, 664, 697, 5, 74, 38, 13, 665, 666, 12, 11, 2, 2, 666, 667, 7, 15, 2, 2, 667, 668, 5, 74, 38, 2, 668, 669, 7, 11, 2, 2, 669, 670, 5, 74, 38, 12, 670, 697, 3, 2, 2, 2, 671, 672, 12, 10, 2, 2, 672, 673, 7, 39, 2, 2, 673, 697, 5, 74, 38, 10, 674, 675, 12, 9, 2, 2, 675, 676, 7, 40, 2, 2, 676, 697, 5, 74, 38, 9, 677, 678, 12, 33, 2, 2, 678, 679, 7, 16, 2, 2, 679, 697, 7, 109, 2, 2, 680, 681, 12, 32, 2, 2, 681, 682, 7, 17, 2, 2, 682, 697, 7, 109, 2, 2, 683, 684, 12, 31, 2, 2, 684, 686, 7, 8, 2, 2, 685, 687, 5, 76, 39, 2, 686, 685, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 688, 3, 2, 2, 2, 688, 697, 7, 9, 2, 2, 689, 690, 12, 27, 2, 2, 690, 691, 7, 6, 2, 2, 691, 692, 5, 72, 37, 2, 692, 693, 7, 7, 2, 2, 693, 697, 3, 2, 2, 2, 694, 695, 12, 24, 2, 2, 695, 697, 9, 2, 2, 2, 696, 638, 3, 2, 2, 2, 696, 641, 3, 2, 2, 2, 696, 644, 3, 2, 2, 2, 696, 647, 3, 2, 2, 2, 696, 650, 3, 2, 2, 2, 696, 653, 3, 2, 2, 2, 696, 656, 3, 2, 2, 2, 696, 659, 3, 2, 2, 2, 696, 662, 3, 2, 2, 2, 696, 665, 3, 2, 2, 2, 696, 671, 3, 2, 2, 2, 696, 674, 3, 2, 2, 2, 696, 677, 3, 2, 2, 2, 696, 680, 3, 2, 2, 2, 696, 683, 3, 2, 2, 2, 696, 689, 3, 2, 2, 2, 696, 694, 3, 2, 2, 2, 697, 700, 3, 2, 2, 2, 698, 696, 3, 2, 2, 2, 698, 699, 3, 2, 2, 2, 699, 75, 3, 2, 2, 2, 700, 698, 3, 2, 2, 2, 701, 706, 5, 74, 38, 2, 702, 703, 7, 12, 2, 2, 703, 705, 5, 74, 38, 2, 704, 702, 3, 2, 2, 2, 705, 708, 3, 2, 2, 2, 706, 704, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 77, 3, 2, 2, 2, 708, 706, 3, 2, 2, 2, 709, 711, 7, 76, 2, 2, 710, 712, 5, 80, 41, 2, 711, 710, 3, 2, 2, 2, 711, 712, 3, 2, 2, 2, 712, 713, 3, 2, 2, 2, 713, 714, 7, 86, 2, 2, 714, 79, 3, 2, 2, 2, 715, 716, 7, 8, 2, 2, 716, 721, 5, 82, 42, 2, 717, 718, 7, 12, 2, 2, 718, 720, 5, 82, 42, 2, 719, 717, 3, 2, 2, 2, 720, 723, 3, 2, 2, 2, 721, 719, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 724, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 724, 725, 7, 9, 2, 2, 725, 81, 3, 2, 2, 2, 726, 727, 7, 77, 2, 2, 727, 737, 7, 110, 2, 2, 728, 729, 7, 78, 2, 2, 729, 737, 7, 109, 2, 2, 730, 731, 7, 79, 2, 2, 731, 737, 7, 110, 2, 2, 732, 733, 7, 80, 2, 2, 733, 737, 5, 74, 38, 2, 734, 735, 7, 81, 2, 2, 735, 737, 5, 74, 38, 2, 736, 726, 3, 2, 2, 2, 736, 728, 3, 2, 2, 2, 736, 730, 3, 2, 2, 2, 736, 732, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 737, 83, 3, 2, 2, 2, 738, 740, 5, 86, 44, 2, 739, 738, 3, 2, 2, 2, 740, 743, 3, 2, 2, 2, 741, 739, 3, 2, 2, 2, 741, 742, 3, 2, 2, 2, 742, 85, 3, 2, 2, 2, 743, 741, 3, 2, 2, 2, 744, 748, 5, 88, 45, 2, 745, 748, 5, 90, 46, 2, 746, 748, 5, 92, 47, 2, 747, 744, 3, 2, 2, 2, 747, 745, 3, 2, 2, 2, 747, 746, 3, 2, 2, 2, 748, 87, 3, 2, 2, 2, 749, 750, 7, 147, 2, 2, 750, 754, 7, 118, 2, 2, 751, 753, 7, 148, 2, 2, 752, 751, 3, 2, 2, 2, 753, 756, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 766, 3, 2, 2, 2, 756, 754, 3, 2, 2, 2, 757, 758, 7, 146, 2, 2, 758, 762, 7, 118, 2, 2, 759, 761, 7, 148, 2, 2, 760, 759, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 766, 3, 2, 2, 2, 764, 762, 3, 2, 2, 2, 765, 749, 3, 2, 2, 2, 765, 757, 3, 2, 2, 2, 766, 89, 3, 2, 2, 2, 767, 769, 7, 116, 2, 2, 768, 770, 5, 94, 48, 2, 769, 768, 3, 2, 2, 2, 769, 770, 3, 2, 2, 2, 770, 774, 3, 2, 2, 2, 771, 773, 7, 148, 2, 2, 772, 771, 3, 2, 2, 2, 773, 776, 3, 2, 2, 2, 774, 772, 3, 2, 2, 2, 774, 775, 3, 2, 2, 2, 775, 91, 3, 2, 2, 2, 776, 774, 3, 2, 2, 2, 777, 778, 7, 115, 2, 2, 778, 783, 5, 96, 49, 2, 779, 780, 7, 119, 2, 2, 780, 782, 5, 96, 49, 2, 781, 779, 3, 2, 2, 2, 782, 785, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 783, 784, 3, 2, 2, 2, 784, 789, 3, 2, 2, 2, 785, 783, 3, 2, 2, 2, 786, 788, 7, 148, 2, 2, 787, 786, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 93, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 838, 5, 96, 49, 2, 793, 794, 7, 117, 2, 2, 794, 838, 5, 96, 49, 2, 795, 796, 5, 96, 49, 2, 796, 797, 7, 119, 2, 2, 797, 798, 5, 96, 49, 2, 798, 838, 3, 2, 2, 2, 799, 800, 7, 120, 2, 2, 800, 801, 5, 96, 49, 2, 801, 802, 7, 121, 2, 2, 802, 803, 7, 119, 2, 2, 803, 804, 7, 147, 2, 2, 804, 838, 3, 2, 2, 2, 805, 806, 7, 120, 2, 2, 806, 807, 7, 120, 2, 2, 807, 808, 5, 96, 49, 2, 808, 809, 7, 121, 2, 2, 809, 810, 7, 121, 2, 2, 810, 811, 7, 119, 2, 2, 811, 812, 7, 147, 2, 2, 812, 838, 3, 2, 2, 2, 813, 814, 7, 120, 2, 2, 814, 815, 5, 96, 49, 2, 815, 816, 7, 119, 2, 2, 816, 817, 7, 147, 2, 2, 817, 818, 7, 121, 2, 2, 818, 819, 7, 119, 2, 2, 819, 820, 7, 147, 2, 2, 820, 838, 3, 2, 2, 2, 821, 822, 7, 120, 2, 2, 822, 823, 5, 96, 49, 2, 823, 824, 7, 119, 2, 2, 824, 825, 7, 147, 2, 2, 825, 826, 7, 121, 2, 2, 826, 838, 3, 2, 2, 2, 827, 828, 7, 120, 2, 2, 828, 829, 5, 96, 49, 2, 829, 830, 7, 121, 2, 2, 830, 838, 3, 2, 2, 2, 831, 832, 7, 120, 2, 2, 832, 833, 7, 120, 2, 2, 833, 834, 5, 96, 49, 2, 834, 835, 7, 121, 2, 2, 835, 836, 7, 121, 2, 2, 836, 838, 3, 2, 2, 2, 837, 792, 3, 2, 2, 2, 837, 793, 3, 2, 2, 2, 837, 795, 3, 2, 2, 2, 837, 799, 3, 2, 2, 2, 837, 805, 3, 2, 2, 2, 837, 813, 3, 2, 2, 2, 837, 821, 3, 2, 2, 2, 837, 827, 3, 2, 2, 2, 837, 831, 3, 2, 2, 2, 838, 95, 3, 2, 2, 2, 839, 840, 8, 49, 1, 2, 840, 841, 7, 122, 2, 2, 841, 842, 5, 96, 49, 2, 842, 843, 7, 123, 2, 2, 843, 854, 3, 2, 2, 2, 844, 845, 9, 9, 2, 2, 845, 854, 5, 96, 49, 10, 846, 854, 7, 147, 2, 2, 847, 854, 7, 145, 2, 2, 848, 849, 7, 133, 2, 2, 849, 850, 7, 147, 2, 2, 850, 854, 7, 134, 2, 2, 851, 854, 7, 135, 2, 2, 852, 854, 7, 144, 2, 2, 853, 839, 3, 2, 2, 2, 853, 844, 3, 2, 2, 2, 853, 846, 3, 2, 2, 2, 853, 847, 3, 2, 2, 2, 853, 848, 3, 2, 2, 2, 853, 851, 3, 2, 2, 2, 853, 852, 3, 2, 2, 2, 854, 869, 3, 2, 2, 2, 855, 856, 12, 12, 2, 2, 856, 857, 7, 124, 2, 2, 857, 868, 5, 96, 49, 13, 858, 859, 12, 11, 2, 2, 859, 860, 9, 10, 2, 2, 860, 868, 5, 96, 49, 12, 861, 862, 12, 9, 2, 2, 862, 863, 9, 11, 2, 2, 863, 868, 5, 96, 49, 10, 864, 865, 12, 8, 2, 2, 865, 866, 9, 12, 2, 2, 866, 868, 5, 96, 49, 9, 867, 855, 3, 2, 2, 2, 867, 858, 3, 2, 2, 2, 867, 861, 3, 2, 2, 2, 867, 864, 3, 2, 2, 2, 868, 871, 3, 2, 2, 2, 869, 867, 3, 2, 2, 2, 869, 870, 3, 2, 2, 2, 870, 97, 3, 2, 2, 2, 871, 869, 3, 2, 2, 2, 90, 107, 124, 137, 143, 149, 156, 163, 171, 178, 185, 190, 202, 205, 207, 216, 224, 229, 234, 241, 248, 255, 263, 269, 281, 295, 301, 307, 313, 318, 322, 331, 338, 345, 355, 367, 378, 399, 408, 414, 419, 426, 439, 444, 456, 470, 489, 498, 506, 511, 516, 518, 524, 529, 533, 539, 542, 550, 553, 556, 568, 580, 588, 594, 598, 619, 623, 632, 636, 686, 696, 698, 706, 711, 721, 736, 741, 747, 754, 762, 765, 769, 774, 783, 789, 837, 853, 867, 869] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 156, 865, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 7, 4, 106, 10, 4, 12, 4, 14, 4, 109, 11, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 125, 10, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 136, 10, 7, 12, 7, 14, 7, 139, 11, 7, 3, 8, 3, 8, 3, 8, 5, 8, 144, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 150, 10, 8, 3, 9, 3, 9, 3, 9, 7, 9, 155, 10, 9, 12, 9, 14, 9, 158, 11, 9, 3, 9, 3, 9, 7, 9, 162, 10, 9, 12, 9, 14, 9, 165, 11, 9, 3, 9, 3, 9, 3, 10, 7, 10, 170, 10, 10, 12, 10, 14, 10, 173, 11, 10, 3, 10, 3, 10, 7, 10, 177, 10, 10, 12, 10, 14, 10, 180, 11, 10, 3, 11, 3, 11, 7, 11, 184, 10, 11, 12, 11, 14, 11, 187, 11, 11, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 203, 10, 13, 3, 13, 7, 13, 206, 10, 13, 12, 13, 14, 13, 209, 11, 13, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 215, 10, 14, 12, 14, 14, 14, 218, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 225, 10, 14, 3, 14, 3, 14, 3, 14, 5, 14, 230, 10, 14, 3, 14, 7, 14, 233, 10, 14, 12, 14, 14, 14, 236, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 242, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 249, 10, 15, 3, 15, 3, 15, 3, 15, 7, 15, 254, 10, 15, 12, 15, 14, 15, 257, 11, 15, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 5, 17, 264, 10, 17, 3, 17, 3, 17, 6, 17, 268, 10, 17, 13, 17, 14, 17, 269, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 294, 10, 21, 12, 21, 14, 21, 297, 11, 21, 3, 22, 3, 22, 3, 22, 5, 22, 302, 10, 22, 3, 23, 3, 23, 7, 23, 306, 10, 23, 12, 23, 14, 23, 309, 11, 23, 3, 23, 3, 23, 3, 23, 5, 23, 314, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 319, 10, 23, 3, 24, 3, 24, 5, 24, 323, 10, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 7, 25, 330, 10, 25, 12, 25, 14, 25, 333, 11, 25, 3, 26, 3, 26, 7, 26, 337, 10, 26, 12, 26, 14, 26, 340, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 346, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 354, 10, 27, 12, 27, 14, 27, 357, 11, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 368, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 379, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 400, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 407, 10, 29, 12, 29, 14, 29, 410, 11, 29, 3, 29, 3, 29, 3, 29, 5, 29, 415, 10, 29, 3, 30, 6, 30, 418, 10, 30, 13, 30, 14, 30, 419, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 427, 10, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 440, 10, 31, 3, 31, 7, 31, 443, 10, 31, 12, 31, 14, 31, 446, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 455, 10, 31, 12, 31, 14, 31, 458, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 469, 10, 31, 12, 31, 14, 31, 472, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 490, 10, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 499, 10, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 507, 10, 31, 3, 32, 6, 32, 510, 10, 32, 13, 32, 14, 32, 511, 3, 32, 3, 32, 3, 32, 5, 32, 517, 10, 32, 5, 32, 519, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 525, 10, 33, 3, 34, 3, 34, 3, 34, 5, 34, 530, 10, 34, 3, 34, 3, 34, 5, 34, 534, 10, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 543, 10, 34, 3, 35, 5, 35, 546, 10, 35, 3, 35, 5, 35, 549, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 559, 10, 37, 12, 37, 14, 37, 562, 11, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 573, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 581, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 587, 10, 38, 3, 38, 3, 38, 5, 38, 591, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 610, 10, 38, 12, 38, 14, 38, 613, 11, 38, 3, 38, 5, 38, 616, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 6, 38, 623, 10, 38, 13, 38, 14, 38, 624, 3, 38, 3, 38, 5, 38, 629, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 679, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 689, 10, 38, 12, 38, 14, 38, 692, 11, 38, 3, 39, 3, 39, 3, 39, 7, 39, 697, 10, 39, 12, 39, 14, 39, 700, 11, 39, 3, 40, 3, 40, 5, 40, 704, 10, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 7, 41, 712, 10, 41, 12, 41, 14, 41, 715, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 729, 10, 42, 3, 43, 7, 43, 732, 10, 43, 12, 43, 14, 43, 735, 11, 43, 3, 44, 3, 44, 3, 44, 5, 44, 740, 10, 44, 3, 45, 3, 45, 3, 45, 7, 45, 745, 10, 45, 12, 45, 14, 45, 748, 11, 45, 3, 45, 3, 45, 3, 45, 7, 45, 753, 10, 45, 12, 45, 14, 45, 756, 11, 45, 5, 45, 758, 10, 45, 3, 46, 3, 46, 5, 46, 762, 10, 46, 3, 46, 7, 46, 765, 10, 46, 12, 46, 14, 46, 768, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 7, 47, 774, 10, 47, 12, 47, 14, 47, 777, 11, 47, 3, 47, 7, 47, 780, 10, 47, 12, 47, 14, 47, 783, 11, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 830, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 846, 10, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 7, 49, 860, 10, 49, 12, 49, 14, 49, 863, 11, 49, 3, 49, 2, 10, 12, 24, 26, 28, 40, 72, 74, 96, 50, 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, 2, 13, 3, 2, 23, 24, 5, 2, 18, 19, 25, 26, 82, 82, 4, 2, 33, 33, 36, 36, 3, 2, 29, 30, 3, 2, 20, 22, 3, 2, 18, 19, 3, 2, 31, 36, 3, 2, 127, 130, 3, 2, 125, 126, 3, 2, 131, 132, 3, 2, 127, 128, 2, 989, 2, 98, 3, 2, 2, 2, 4, 101, 3, 2, 2, 2, 6, 107, 3, 2, 2, 2, 8, 124, 3, 2, 2, 2, 10, 126, 3, 2, 2, 2, 12, 129, 3, 2, 2, 2, 14, 149, 3, 2, 2, 2, 16, 151, 3, 2, 2, 2, 18, 171, 3, 2, 2, 2, 20, 181, 3, 2, 2, 2, 22, 188, 3, 2, 2, 2, 24, 194, 3, 2, 2, 2, 26, 224, 3, 2, 2, 2, 28, 248, 3, 2, 2, 2, 30, 258, 3, 2, 2, 2, 32, 261, 3, 2, 2, 2, 34, 273, 3, 2, 2, 2, 36, 276, 3, 2, 2, 2, 38, 279, 3, 2, 2, 2, 40, 287, 3, 2, 2, 2, 42, 298, 3, 2, 2, 2, 44, 303, 3, 2, 2, 2, 46, 320, 3, 2, 2, 2, 48, 326, 3, 2, 2, 2, 50, 345, 3, 2, 2, 2, 52, 347, 3, 2, 2, 2, 54, 367, 3, 2, 2, 2, 56, 414, 3, 2, 2, 2, 58, 417, 3, 2, 2, 2, 60, 506, 3, 2, 2, 2, 62, 509, 3, 2, 2, 2, 64, 520, 3, 2, 2, 2, 66, 542, 3, 2, 2, 2, 68, 548, 3, 2, 2, 2, 70, 550, 3, 2, 2, 2, 72, 552, 3, 2, 2, 2, 74, 628, 3, 2, 2, 2, 76, 693, 3, 2, 2, 2, 78, 701, 3, 2, 2, 2, 80, 707, 3, 2, 2, 2, 82, 728, 3, 2, 2, 2, 84, 733, 3, 2, 2, 2, 86, 739, 3, 2, 2, 2, 88, 757, 3, 2, 2, 2, 90, 759, 3, 2, 2, 2, 92, 769, 3, 2, 2, 2, 94, 829, 3, 2, 2, 2, 96, 845, 3, 2, 2, 2, 98, 99, 5, 6, 4, 2, 99, 100, 7, 2, 2, 3, 100, 3, 3, 2, 2, 2, 101, 102, 5, 84, 43, 2, 102, 103, 7, 2, 2, 3, 103, 5, 3, 2, 2, 2, 104, 106, 5, 8, 5, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 7, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 5, 10, 6, 2, 111, 112, 7, 10, 2, 2, 112, 125, 3, 2, 2, 2, 113, 125, 5, 44, 23, 2, 114, 115, 5, 32, 17, 2, 115, 116, 7, 10, 2, 2, 116, 125, 3, 2, 2, 2, 117, 118, 5, 38, 20, 2, 118, 119, 7, 10, 2, 2, 119, 125, 3, 2, 2, 2, 120, 125, 5, 52, 27, 2, 121, 122, 5, 16, 9, 2, 122, 123, 7, 10, 2, 2, 123, 125, 3, 2, 2, 2, 124, 110, 3, 2, 2, 2, 124, 113, 3, 2, 2, 2, 124, 114, 3, 2, 2, 2, 124, 117, 3, 2, 2, 2, 124, 120, 3, 2, 2, 2, 124, 121, 3, 2, 2, 2, 125, 9, 3, 2, 2, 2, 126, 127, 5, 18, 10, 2, 127, 128, 5, 12, 7, 2, 128, 11, 3, 2, 2, 2, 129, 130, 8, 7, 1, 2, 130, 131, 5, 14, 8, 2, 131, 137, 3, 2, 2, 2, 132, 133, 12, 3, 2, 2, 133, 134, 7, 12, 2, 2, 134, 136, 5, 14, 8, 2, 135, 132, 3, 2, 2, 2, 136, 139, 3, 2, 2, 2, 137, 135, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 13, 3, 2, 2, 2, 139, 137, 3, 2, 2, 2, 140, 143, 5, 26, 14, 2, 141, 142, 7, 39, 2, 2, 142, 144, 5, 74, 38, 2, 143, 141, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 150, 3, 2, 2, 2, 145, 146, 5, 26, 14, 2, 146, 147, 7, 39, 2, 2, 147, 148, 5, 78, 40, 2, 148, 150, 3, 2, 2, 2, 149, 140, 3, 2, 2, 2, 149, 145, 3, 2, 2, 2, 150, 15, 3, 2, 2, 2, 151, 152, 7, 41, 2, 2, 152, 156, 5, 18, 10, 2, 153, 155, 5, 20, 11, 2, 154, 153, 3, 2, 2, 2, 155, 158, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 159, 3, 2, 2, 2, 158, 156, 3, 2, 2, 2, 159, 163, 7, 109, 2, 2, 160, 162, 5, 22, 12, 2, 161, 160, 3, 2, 2, 2, 162, 165, 3, 2, 2, 2, 163, 161, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 166, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 166, 167, 8, 9, 1, 2, 167, 17, 3, 2, 2, 2, 168, 170, 5, 56, 29, 2, 169, 168, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 178, 5, 28, 15, 2, 175, 177, 5, 56, 29, 2, 176, 175, 3, 2, 2, 2, 177, 180, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 178, 179, 3, 2, 2, 2, 179, 19, 3, 2, 2, 2, 180, 178, 3, 2, 2, 2, 181, 185, 7, 20, 2, 2, 182, 184, 5, 56, 29, 2, 183, 182, 3, 2, 2, 2, 184, 187, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 21, 3, 2, 2, 2, 187, 185, 3, 2, 2, 2, 188, 190, 7, 6, 2, 2, 189, 191, 5, 74, 38, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 7, 2, 2, 193, 23, 3, 2, 2, 2, 194, 195, 8, 13, 1, 2, 195, 196, 5, 28, 15, 2, 196, 207, 3, 2, 2, 2, 197, 198, 12, 4, 2, 2, 198, 206, 7, 20, 2, 2, 199, 200, 12, 3, 2, 2, 200, 202, 7, 6, 2, 2, 201, 203, 5, 74, 38, 2, 202, 201, 3, 2, 2, 2, 202, 203, 3, 2, 2, 2, 203, 204, 3, 2, 2, 2, 204, 206, 7, 7, 2, 2, 205, 197, 3, 2, 2, 2, 205, 199, 3, 2, 2, 2, 206, 209, 3, 2, 2, 2, 207, 205, 3, 2, 2, 2, 207, 208, 3, 2, 2, 2, 208, 25, 3, 2, 2, 2, 209, 207, 3, 2, 2, 2, 210, 211, 8, 14, 1, 2, 211, 225, 7, 109, 2, 2, 212, 216, 7, 20, 2, 2, 213, 215, 5, 56, 29, 2, 214, 213, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 219, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 225, 5, 26, 14, 4, 220, 221, 7, 8, 2, 2, 221, 222, 5, 26, 14, 2, 222, 223, 7, 9, 2, 2, 223, 225, 3, 2, 2, 2, 224, 210, 3, 2, 2, 2, 224, 212, 3, 2, 2, 2, 224, 220, 3, 2, 2, 2, 225, 234, 3, 2, 2, 2, 226, 227, 12, 5, 2, 2, 227, 229, 7, 6, 2, 2, 228, 230, 5, 74, 38, 2, 229, 228, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 233, 7, 7, 2, 2, 232, 226, 3, 2, 2, 2, 233, 236, 3, 2, 2, 2, 234, 232, 3, 2, 2, 2, 234, 235, 3, 2, 2, 2, 235, 27, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 237, 238, 8, 15, 1, 2, 238, 249, 7, 84, 2, 2, 239, 241, 7, 83, 2, 2, 240, 242, 7, 84, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 249, 3, 2, 2, 2, 243, 249, 5, 32, 17, 2, 244, 249, 5, 30, 16, 2, 245, 249, 5, 38, 20, 2, 246, 249, 5, 36, 19, 2, 247, 249, 7, 3, 2, 2, 248, 237, 3, 2, 2, 2, 248, 239, 3, 2, 2, 2, 248, 243, 3, 2, 2, 2, 248, 244, 3, 2, 2, 2, 248, 245, 3, 2, 2, 2, 248, 246, 3, 2, 2, 2, 248, 247, 3, 2, 2, 2, 249, 255, 3, 2, 2, 2, 250, 251, 12, 8, 2, 2, 251, 252, 7, 8, 2, 2, 252, 254, 7, 9, 2, 2, 253, 250, 3, 2, 2, 2, 254, 257, 3, 2, 2, 2, 255, 253, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 29, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 258, 259, 7, 71, 2, 2, 259, 260, 7, 109, 2, 2, 260, 31, 3, 2, 2, 2, 261, 263, 7, 71, 2, 2, 262, 264, 7, 109, 2, 2, 263, 262, 3, 2, 2, 2, 263, 264, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 267, 7, 4, 2, 2, 266, 268, 5, 34, 18, 2, 267, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 272, 7, 5, 2, 2, 272, 33, 3, 2, 2, 2, 273, 274, 5, 10, 6, 2, 274, 275, 7, 10, 2, 2, 275, 35, 3, 2, 2, 2, 276, 277, 7, 72, 2, 2, 277, 278, 7, 109, 2, 2, 278, 37, 3, 2, 2, 2, 279, 281, 7, 72, 2, 2, 280, 282, 7, 109, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 284, 7, 4, 2, 2, 284, 285, 5, 40, 21, 2, 285, 286, 7, 5, 2, 2, 286, 39, 3, 2, 2, 2, 287, 288, 8, 21, 1, 2, 288, 289, 5, 42, 22, 2, 289, 295, 3, 2, 2, 2, 290, 291, 12, 3, 2, 2, 291, 292, 7, 12, 2, 2, 292, 294, 5, 42, 22, 2, 293, 290, 3, 2, 2, 2, 294, 297, 3, 2, 2, 2, 295, 293, 3, 2, 2, 2, 295, 296, 3, 2, 2, 2, 296, 41, 3, 2, 2, 2, 297, 295, 3, 2, 2, 2, 298, 301, 7, 109, 2, 2, 299, 300, 7, 39, 2, 2, 300, 302, 5, 74, 38, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 43, 3, 2, 2, 2, 303, 307, 5, 18, 10, 2, 304, 306, 5, 20, 11, 2, 305, 304, 3, 2, 2, 2, 306, 309, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 310, 311, 7, 109, 2, 2, 311, 313, 7, 8, 2, 2, 312, 314, 5, 48, 25, 2, 313, 312, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 318, 7, 9, 2, 2, 316, 319, 5, 46, 24, 2, 317, 319, 7, 10, 2, 2, 318, 316, 3, 2, 2, 2, 318, 317, 3, 2, 2, 2, 319, 45, 3, 2, 2, 2, 320, 322, 7, 4, 2, 2, 321, 323, 5, 58, 30, 2, 322, 321, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 324, 3, 2, 2, 2, 324, 325, 7, 5, 2, 2, 325, 47, 3, 2, 2, 2, 326, 331, 5, 50, 26, 2, 327, 328, 7, 12, 2, 2, 328, 330, 5, 50, 26, 2, 329, 327, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 331, 332, 3, 2, 2, 2, 332, 49, 3, 2, 2, 2, 333, 331, 3, 2, 2, 2, 334, 338, 5, 18, 10, 2, 335, 337, 5, 20, 11, 2, 336, 335, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 341, 3, 2, 2, 2, 340, 338, 3, 2, 2, 2, 341, 342, 7, 109, 2, 2, 342, 346, 3, 2, 2, 2, 343, 346, 7, 84, 2, 2, 344, 346, 7, 14, 2, 2, 345, 334, 3, 2, 2, 2, 345, 343, 3, 2, 2, 2, 345, 344, 3, 2, 2, 2, 346, 51, 3, 2, 2, 2, 347, 348, 7, 89, 2, 2, 348, 349, 7, 109, 2, 2, 349, 350, 7, 8, 2, 2, 350, 355, 5, 54, 28, 2, 351, 352, 7, 12, 2, 2, 352, 354, 5, 54, 28, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 358, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 359, 7, 9, 2, 2, 359, 53, 3, 2, 2, 2, 360, 368, 7, 100, 2, 2, 361, 362, 7, 100, 2, 2, 362, 363, 7, 13, 2, 2, 363, 368, 7, 100, 2, 2, 364, 368, 7, 109, 2, 2, 365, 368, 7, 110, 2, 2, 366, 368, 7, 58, 2, 2, 367, 360, 3, 2, 2, 2, 367, 361, 3, 2, 2, 2, 367, 364, 3, 2, 2, 2, 367, 365, 3, 2, 2, 2, 367, 366, 3, 2, 2, 2, 368, 55, 3, 2, 2, 2, 369, 415, 7, 42, 2, 2, 370, 371, 7, 45, 2, 2, 371, 372, 7, 8, 2, 2, 372, 373, 7, 100, 2, 2, 373, 415, 7, 9, 2, 2, 374, 378, 7, 50, 2, 2, 375, 376, 7, 8, 2, 2, 376, 377, 7, 109, 2, 2, 377, 379, 7, 9, 2, 2, 378, 375, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 415, 3, 2, 2, 2, 380, 415, 7, 53, 2, 2, 381, 415, 7, 54, 2, 2, 382, 383, 7, 52, 2, 2, 383, 384, 7, 8, 2, 2, 384, 385, 5, 74, 38, 2, 385, 386, 7, 9, 2, 2, 386, 415, 3, 2, 2, 2, 387, 415, 7, 47, 2, 2, 388, 415, 7, 48, 2, 2, 389, 415, 7, 55, 2, 2, 390, 415, 7, 56, 2, 2, 391, 415, 7, 43, 2, 2, 392, 415, 7, 44, 2, 2, 393, 415, 7, 46, 2, 2, 394, 415, 7, 57, 2, 2, 395, 399, 7, 49, 2, 2, 396, 397, 7, 8, 2, 2, 397, 398, 7, 109, 2, 2, 398, 400, 7, 9, 2, 2, 399, 396, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 415, 3, 2, 2, 2, 401, 402, 7, 51, 2, 2, 402, 403, 7, 8, 2, 2, 403, 408, 5, 54, 28, 2, 404, 405, 7, 12, 2, 2, 405, 407, 5, 54, 28, 2, 406, 404, 3, 2, 2, 2, 407, 410, 3, 2, 2, 2, 408, 406, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 411, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 411, 412, 7, 9, 2, 2, 412, 415, 3, 2, 2, 2, 413, 415, 7, 58, 2, 2, 414, 369, 3, 2, 2, 2, 414, 370, 3, 2, 2, 2, 414, 374, 3, 2, 2, 2, 414, 380, 3, 2, 2, 2, 414, 381, 3, 2, 2, 2, 414, 382, 3, 2, 2, 2, 414, 387, 3, 2, 2, 2, 414, 388, 3, 2, 2, 2, 414, 389, 3, 2, 2, 2, 414, 390, 3, 2, 2, 2, 414, 391, 3, 2, 2, 2, 414, 392, 3, 2, 2, 2, 414, 393, 3, 2, 2, 2, 414, 394, 3, 2, 2, 2, 414, 395, 3, 2, 2, 2, 414, 401, 3, 2, 2, 2, 414, 413, 3, 2, 2, 2, 415, 57, 3, 2, 2, 2, 416, 418, 5, 60, 31, 2, 417, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 417, 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 59, 3, 2, 2, 2, 421, 422, 5, 10, 6, 2, 422, 423, 7, 10, 2, 2, 423, 507, 3, 2, 2, 2, 424, 426, 7, 4, 2, 2, 425, 427, 5, 58, 30, 2, 426, 425, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 507, 7, 5, 2, 2, 429, 430, 5, 72, 37, 2, 430, 431, 7, 10, 2, 2, 431, 507, 3, 2, 2, 2, 432, 433, 7, 59, 2, 2, 433, 434, 7, 8, 2, 2, 434, 435, 5, 72, 37, 2, 435, 436, 7, 9, 2, 2, 436, 439, 5, 60, 31, 2, 437, 438, 7, 60, 2, 2, 438, 440, 5, 60, 31, 2, 439, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 507, 3, 2, 2, 2, 441, 443, 5, 56, 29, 2, 442, 441, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 447, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 448, 7, 61, 2, 2, 448, 449, 7, 8, 2, 2, 449, 450, 5, 72, 37, 2, 450, 451, 7, 9, 2, 2, 451, 452, 5, 60, 31, 2, 452, 507, 3, 2, 2, 2, 453, 455, 5, 56, 29, 2, 454, 453, 3, 2, 2, 2, 455, 458, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 459, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 460, 7, 62, 2, 2, 460, 461, 5, 60, 31, 2, 461, 462, 7, 61, 2, 2, 462, 463, 7, 8, 2, 2, 463, 464, 5, 72, 37, 2, 464, 465, 7, 9, 2, 2, 465, 466, 7, 10, 2, 2, 466, 507, 3, 2, 2, 2, 467, 469, 5, 56, 29, 2, 468, 467, 3, 2, 2, 2, 469, 472, 3, 2, 2, 2, 470, 468, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 473, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 473, 474, 7, 63, 2, 2, 474, 475, 7, 8, 2, 2, 475, 476, 5, 66, 34, 2, 476, 477, 7, 9, 2, 2, 477, 478, 5, 60, 31, 2, 478, 507, 3, 2, 2, 2, 479, 480, 7, 64, 2, 2, 480, 481, 7, 8, 2, 2, 481, 482, 5, 72, 37, 2, 482, 483, 7, 9, 2, 2, 483, 484, 7, 4, 2, 2, 484, 485, 5, 62, 32, 2, 485, 486, 7, 5, 2, 2, 486, 507, 3, 2, 2, 2, 487, 489, 7, 65, 2, 2, 488, 490, 5, 72, 37, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 507, 7, 10, 2, 2, 492, 493, 7, 66, 2, 2, 493, 507, 7, 10, 2, 2, 494, 495, 7, 67, 2, 2, 495, 507, 7, 10, 2, 2, 496, 498, 7, 68, 2, 2, 497, 499, 5, 80, 41, 2, 498, 497, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 500, 3, 2, 2, 2, 500, 501, 7, 4, 2, 2, 501, 502, 5, 84, 43, 2, 502, 503, 7, 134, 2, 2, 503, 507, 3, 2, 2, 2, 504, 507, 5, 78, 40, 2, 505, 507, 7, 10, 2, 2, 506, 421, 3, 2, 2, 2, 506, 424, 3, 2, 2, 2, 506, 429, 3, 2, 2, 2, 506, 432, 3, 2, 2, 2, 506, 444, 3, 2, 2, 2, 506, 456, 3, 2, 2, 2, 506, 470, 3, 2, 2, 2, 506, 479, 3, 2, 2, 2, 506, 487, 3, 2, 2, 2, 506, 492, 3, 2, 2, 2, 506, 494, 3, 2, 2, 2, 506, 496, 3, 2, 2, 2, 506, 504, 3, 2, 2, 2, 506, 505, 3, 2, 2, 2, 507, 61, 3, 2, 2, 2, 508, 510, 5, 64, 33, 2, 509, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 509, 3, 2, 2, 2, 511, 512, 3, 2, 2, 2, 512, 518, 3, 2, 2, 2, 513, 514, 7, 69, 2, 2, 514, 516, 7, 11, 2, 2, 515, 517, 5, 58, 30, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 519, 3, 2, 2, 2, 518, 513, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 63, 3, 2, 2, 2, 520, 521, 7, 70, 2, 2, 521, 522, 5, 74, 38, 2, 522, 524, 7, 11, 2, 2, 523, 525, 5, 58, 30, 2, 524, 523, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 65, 3, 2, 2, 2, 526, 527, 5, 68, 35, 2, 527, 529, 7, 10, 2, 2, 528, 530, 5, 70, 36, 2, 529, 528, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 531, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 534, 5, 72, 37, 2, 533, 532, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 543, 3, 2, 2, 2, 535, 536, 5, 18, 10, 2, 536, 537, 5, 26, 14, 2, 537, 538, 7, 11, 2, 2, 538, 539, 5, 74, 38, 2, 539, 540, 7, 13, 2, 2, 540, 541, 5, 74, 38, 2, 541, 543, 3, 2, 2, 2, 542, 526, 3, 2, 2, 2, 542, 535, 3, 2, 2, 2, 543, 67, 3, 2, 2, 2, 544, 546, 5, 10, 6, 2, 545, 544, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 549, 3, 2, 2, 2, 547, 549, 5, 72, 37, 2, 548, 545, 3, 2, 2, 2, 548, 547, 3, 2, 2, 2, 549, 69, 3, 2, 2, 2, 550, 551, 5, 72, 37, 2, 551, 71, 3, 2, 2, 2, 552, 553, 8, 37, 1, 2, 553, 554, 5, 74, 38, 2, 554, 560, 3, 2, 2, 2, 555, 556, 12, 3, 2, 2, 556, 557, 7, 12, 2, 2, 557, 559, 5, 74, 38, 2, 558, 555, 3, 2, 2, 2, 559, 562, 3, 2, 2, 2, 560, 558, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 73, 3, 2, 2, 2, 562, 560, 3, 2, 2, 2, 563, 564, 8, 38, 1, 2, 564, 565, 7, 8, 2, 2, 565, 566, 5, 72, 37, 2, 566, 567, 7, 9, 2, 2, 567, 629, 3, 2, 2, 2, 568, 569, 7, 73, 2, 2, 569, 572, 7, 8, 2, 2, 570, 573, 5, 74, 38, 2, 571, 573, 5, 24, 13, 2, 572, 570, 3, 2, 2, 2, 572, 571, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 575, 7, 9, 2, 2, 575, 629, 3, 2, 2, 2, 576, 577, 7, 74, 2, 2, 577, 580, 7, 8, 2, 2, 578, 581, 5, 74, 38, 2, 579, 581, 5, 24, 13, 2, 580, 578, 3, 2, 2, 2, 580, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 583, 7, 9, 2, 2, 583, 629, 3, 2, 2, 2, 584, 586, 7, 75, 2, 2, 585, 587, 7, 8, 2, 2, 586, 585, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 590, 7, 109, 2, 2, 589, 591, 7, 9, 2, 2, 590, 589, 3, 2, 2, 2, 590, 591, 3, 2, 2, 2, 591, 629, 3, 2, 2, 2, 592, 593, 7, 8, 2, 2, 593, 594, 5, 24, 13, 2, 594, 595, 7, 9, 2, 2, 595, 596, 5, 74, 38, 26, 596, 629, 3, 2, 2, 2, 597, 598, 9, 2, 2, 2, 598, 629, 5, 74, 38, 25, 599, 600, 7, 20, 2, 2, 600, 629, 5, 74, 38, 23, 601, 602, 9, 3, 2, 2, 602, 629, 5, 74, 38, 22, 603, 604, 9, 4, 2, 2, 604, 629, 5, 74, 38, 18, 605, 606, 7, 4, 2, 2, 606, 611, 5, 74, 38, 2, 607, 608, 7, 12, 2, 2, 608, 610, 5, 74, 38, 2, 609, 607, 3, 2, 2, 2, 610, 613, 3, 2, 2, 2, 611, 609, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 615, 3, 2, 2, 2, 613, 611, 3, 2, 2, 2, 614, 616, 7, 12, 2, 2, 615, 614, 3, 2, 2, 2, 615, 616, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 618, 7, 5, 2, 2, 618, 629, 3, 2, 2, 2, 619, 629, 7, 109, 2, 2, 620, 629, 7, 100, 2, 2, 621, 623, 7, 110, 2, 2, 622, 621, 3, 2, 2, 2, 623, 624, 3, 2, 2, 2, 624, 622, 3, 2, 2, 2, 624, 625, 3, 2, 2, 2, 625, 629, 3, 2, 2, 2, 626, 629, 7, 111, 2, 2, 627, 629, 7, 85, 2, 2, 628, 563, 3, 2, 2, 2, 628, 568, 3, 2, 2, 2, 628, 576, 3, 2, 2, 2, 628, 584, 3, 2, 2, 2, 628, 592, 3, 2, 2, 2, 628, 597, 3, 2, 2, 2, 628, 599, 3, 2, 2, 2, 628, 601, 3, 2, 2, 2, 628, 603, 3, 2, 2, 2, 628, 605, 3, 2, 2, 2, 628, 619, 3, 2, 2, 2, 628, 620, 3, 2, 2, 2, 628, 622, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 628, 627, 3, 2, 2, 2, 629, 690, 3, 2, 2, 2, 630, 631, 12, 21, 2, 2, 631, 632, 9, 5, 2, 2, 632, 689, 5, 74, 38, 22, 633, 634, 12, 20, 2, 2, 634, 635, 9, 6, 2, 2, 635, 689, 5, 74, 38, 21, 636, 637, 12, 19, 2, 2, 637, 638, 9, 7, 2, 2, 638, 689, 5, 74, 38, 20, 639, 640, 12, 17, 2, 2, 640, 641, 9, 8, 2, 2, 641, 689, 5, 74, 38, 18, 642, 643, 12, 16, 2, 2, 643, 644, 7, 25, 2, 2, 644, 689, 5, 74, 38, 17, 645, 646, 12, 15, 2, 2, 646, 647, 7, 27, 2, 2, 647, 689, 5, 74, 38, 16, 648, 649, 12, 14, 2, 2, 649, 650, 7, 28, 2, 2, 650, 689, 5, 74, 38, 15, 651, 652, 12, 13, 2, 2, 652, 653, 7, 37, 2, 2, 653, 689, 5, 74, 38, 14, 654, 655, 12, 12, 2, 2, 655, 656, 7, 38, 2, 2, 656, 689, 5, 74, 38, 13, 657, 658, 12, 11, 2, 2, 658, 659, 7, 15, 2, 2, 659, 660, 5, 74, 38, 2, 660, 661, 7, 11, 2, 2, 661, 662, 5, 74, 38, 12, 662, 689, 3, 2, 2, 2, 663, 664, 12, 10, 2, 2, 664, 665, 7, 39, 2, 2, 665, 689, 5, 74, 38, 10, 666, 667, 12, 9, 2, 2, 667, 668, 7, 40, 2, 2, 668, 689, 5, 74, 38, 9, 669, 670, 12, 33, 2, 2, 670, 671, 7, 16, 2, 2, 671, 689, 7, 109, 2, 2, 672, 673, 12, 32, 2, 2, 673, 674, 7, 17, 2, 2, 674, 689, 7, 109, 2, 2, 675, 676, 12, 31, 2, 2, 676, 678, 7, 8, 2, 2, 677, 679, 5, 76, 39, 2, 678, 677, 3, 2, 2, 2, 678, 679, 3, 2, 2, 2, 679, 680, 3, 2, 2, 2, 680, 689, 7, 9, 2, 2, 681, 682, 12, 27, 2, 2, 682, 683, 7, 6, 2, 2, 683, 684, 5, 72, 37, 2, 684, 685, 7, 7, 2, 2, 685, 689, 3, 2, 2, 2, 686, 687, 12, 24, 2, 2, 687, 689, 9, 2, 2, 2, 688, 630, 3, 2, 2, 2, 688, 633, 3, 2, 2, 2, 688, 636, 3, 2, 2, 2, 688, 639, 3, 2, 2, 2, 688, 642, 3, 2, 2, 2, 688, 645, 3, 2, 2, 2, 688, 648, 3, 2, 2, 2, 688, 651, 3, 2, 2, 2, 688, 654, 3, 2, 2, 2, 688, 657, 3, 2, 2, 2, 688, 663, 3, 2, 2, 2, 688, 666, 3, 2, 2, 2, 688, 669, 3, 2, 2, 2, 688, 672, 3, 2, 2, 2, 688, 675, 3, 2, 2, 2, 688, 681, 3, 2, 2, 2, 688, 686, 3, 2, 2, 2, 689, 692, 3, 2, 2, 2, 690, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 75, 3, 2, 2, 2, 692, 690, 3, 2, 2, 2, 693, 698, 5, 74, 38, 2, 694, 695, 7, 12, 2, 2, 695, 697, 5, 74, 38, 2, 696, 694, 3, 2, 2, 2, 697, 700, 3, 2, 2, 2, 698, 696, 3, 2, 2, 2, 698, 699, 3, 2, 2, 2, 699, 77, 3, 2, 2, 2, 700, 698, 3, 2, 2, 2, 701, 703, 7, 76, 2, 2, 702, 704, 5, 80, 41, 2, 703, 702, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 705, 3, 2, 2, 2, 705, 706, 7, 86, 2, 2, 706, 79, 3, 2, 2, 2, 707, 708, 7, 8, 2, 2, 708, 713, 5, 82, 42, 2, 709, 710, 7, 12, 2, 2, 710, 712, 5, 82, 42, 2, 711, 709, 3, 2, 2, 2, 712, 715, 3, 2, 2, 2, 713, 711, 3, 2, 2, 2, 713, 714, 3, 2, 2, 2, 714, 716, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 716, 717, 7, 9, 2, 2, 717, 81, 3, 2, 2, 2, 718, 719, 7, 77, 2, 2, 719, 729, 7, 110, 2, 2, 720, 721, 7, 78, 2, 2, 721, 729, 7, 109, 2, 2, 722, 723, 7, 79, 2, 2, 723, 729, 7, 110, 2, 2, 724, 725, 7, 80, 2, 2, 725, 729, 5, 74, 38, 2, 726, 727, 7, 81, 2, 2, 727, 729, 5, 74, 38, 2, 728, 718, 3, 2, 2, 2, 728, 720, 3, 2, 2, 2, 728, 722, 3, 2, 2, 2, 728, 724, 3, 2, 2, 2, 728, 726, 3, 2, 2, 2, 729, 83, 3, 2, 2, 2, 730, 732, 5, 86, 44, 2, 731, 730, 3, 2, 2, 2, 732, 735, 3, 2, 2, 2, 733, 731, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 85, 3, 2, 2, 2, 735, 733, 3, 2, 2, 2, 736, 740, 5, 88, 45, 2, 737, 740, 5, 90, 46, 2, 738, 740, 5, 92, 47, 2, 739, 736, 3, 2, 2, 2, 739, 737, 3, 2, 2, 2, 739, 738, 3, 2, 2, 2, 740, 87, 3, 2, 2, 2, 741, 742, 7, 147, 2, 2, 742, 746, 7, 118, 2, 2, 743, 745, 7, 148, 2, 2, 744, 743, 3, 2, 2, 2, 745, 748, 3, 2, 2, 2, 746, 744, 3, 2, 2, 2, 746, 747, 3, 2, 2, 2, 747, 758, 3, 2, 2, 2, 748, 746, 3, 2, 2, 2, 749, 750, 7, 146, 2, 2, 750, 754, 7, 118, 2, 2, 751, 753, 7, 148, 2, 2, 752, 751, 3, 2, 2, 2, 753, 756, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 758, 3, 2, 2, 2, 756, 754, 3, 2, 2, 2, 757, 741, 3, 2, 2, 2, 757, 749, 3, 2, 2, 2, 758, 89, 3, 2, 2, 2, 759, 761, 7, 116, 2, 2, 760, 762, 5, 94, 48, 2, 761, 760, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 766, 3, 2, 2, 2, 763, 765, 7, 148, 2, 2, 764, 763, 3, 2, 2, 2, 765, 768, 3, 2, 2, 2, 766, 764, 3, 2, 2, 2, 766, 767, 3, 2, 2, 2, 767, 91, 3, 2, 2, 2, 768, 766, 3, 2, 2, 2, 769, 770, 7, 115, 2, 2, 770, 775, 5, 96, 49, 2, 771, 772, 7, 119, 2, 2, 772, 774, 5, 96, 49, 2, 773, 771, 3, 2, 2, 2, 774, 777, 3, 2, 2, 2, 775, 773, 3, 2, 2, 2, 775, 776, 3, 2, 2, 2, 776, 781, 3, 2, 2, 2, 777, 775, 3, 2, 2, 2, 778, 780, 7, 148, 2, 2, 779, 778, 3, 2, 2, 2, 780, 783, 3, 2, 2, 2, 781, 779, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 93, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 784, 830, 5, 96, 49, 2, 785, 786, 7, 117, 2, 2, 786, 830, 5, 96, 49, 2, 787, 788, 5, 96, 49, 2, 788, 789, 7, 119, 2, 2, 789, 790, 5, 96, 49, 2, 790, 830, 3, 2, 2, 2, 791, 792, 7, 120, 2, 2, 792, 793, 5, 96, 49, 2, 793, 794, 7, 121, 2, 2, 794, 795, 7, 119, 2, 2, 795, 796, 7, 147, 2, 2, 796, 830, 3, 2, 2, 2, 797, 798, 7, 120, 2, 2, 798, 799, 7, 120, 2, 2, 799, 800, 5, 96, 49, 2, 800, 801, 7, 121, 2, 2, 801, 802, 7, 121, 2, 2, 802, 803, 7, 119, 2, 2, 803, 804, 7, 147, 2, 2, 804, 830, 3, 2, 2, 2, 805, 806, 7, 120, 2, 2, 806, 807, 5, 96, 49, 2, 807, 808, 7, 119, 2, 2, 808, 809, 7, 147, 2, 2, 809, 810, 7, 121, 2, 2, 810, 811, 7, 119, 2, 2, 811, 812, 7, 147, 2, 2, 812, 830, 3, 2, 2, 2, 813, 814, 7, 120, 2, 2, 814, 815, 5, 96, 49, 2, 815, 816, 7, 119, 2, 2, 816, 817, 7, 147, 2, 2, 817, 818, 7, 121, 2, 2, 818, 830, 3, 2, 2, 2, 819, 820, 7, 120, 2, 2, 820, 821, 5, 96, 49, 2, 821, 822, 7, 121, 2, 2, 822, 830, 3, 2, 2, 2, 823, 824, 7, 120, 2, 2, 824, 825, 7, 120, 2, 2, 825, 826, 5, 96, 49, 2, 826, 827, 7, 121, 2, 2, 827, 828, 7, 121, 2, 2, 828, 830, 3, 2, 2, 2, 829, 784, 3, 2, 2, 2, 829, 785, 3, 2, 2, 2, 829, 787, 3, 2, 2, 2, 829, 791, 3, 2, 2, 2, 829, 797, 3, 2, 2, 2, 829, 805, 3, 2, 2, 2, 829, 813, 3, 2, 2, 2, 829, 819, 3, 2, 2, 2, 829, 823, 3, 2, 2, 2, 830, 95, 3, 2, 2, 2, 831, 832, 8, 49, 1, 2, 832, 833, 7, 122, 2, 2, 833, 834, 5, 96, 49, 2, 834, 835, 7, 123, 2, 2, 835, 846, 3, 2, 2, 2, 836, 837, 9, 9, 2, 2, 837, 846, 5, 96, 49, 10, 838, 846, 7, 147, 2, 2, 839, 846, 7, 145, 2, 2, 840, 841, 7, 133, 2, 2, 841, 842, 7, 147, 2, 2, 842, 846, 7, 134, 2, 2, 843, 846, 7, 135, 2, 2, 844, 846, 7, 144, 2, 2, 845, 831, 3, 2, 2, 2, 845, 836, 3, 2, 2, 2, 845, 838, 3, 2, 2, 2, 845, 839, 3, 2, 2, 2, 845, 840, 3, 2, 2, 2, 845, 843, 3, 2, 2, 2, 845, 844, 3, 2, 2, 2, 846, 861, 3, 2, 2, 2, 847, 848, 12, 12, 2, 2, 848, 849, 7, 124, 2, 2, 849, 860, 5, 96, 49, 13, 850, 851, 12, 11, 2, 2, 851, 852, 9, 10, 2, 2, 852, 860, 5, 96, 49, 12, 853, 854, 12, 9, 2, 2, 854, 855, 9, 11, 2, 2, 855, 860, 5, 96, 49, 10, 856, 857, 12, 8, 2, 2, 857, 858, 9, 12, 2, 2, 858, 860, 5, 96, 49, 9, 859, 847, 3, 2, 2, 2, 859, 850, 3, 2, 2, 2, 859, 853, 3, 2, 2, 2, 859, 856, 3, 2, 2, 2, 860, 863, 3, 2, 2, 2, 861, 859, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 97, 3, 2, 2, 2, 863, 861, 3, 2, 2, 2, 88, 107, 124, 137, 143, 149, 156, 163, 171, 178, 185, 190, 202, 205, 207, 216, 224, 229, 234, 241, 248, 255, 263, 269, 281, 295, 301, 307, 313, 318, 322, 331, 338, 345, 355, 367, 378, 399, 408, 414, 419, 426, 439, 444, 456, 470, 489, 498, 506, 511, 516, 518, 524, 529, 533, 542, 545, 548, 560, 572, 580, 586, 590, 611, 615, 624, 628, 678, 688, 690, 698, 703, 713, 728, 733, 739, 746, 754, 757, 761, 766, 775, 781, 829, 845, 859, 861] \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java index 410b580f7..37829e697 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java @@ -4098,7 +4098,12 @@ public class KickCParser extends Parser { } } public static class ForRangeContext extends ForLoopContext { - public TerminalNode NAME() { return getToken(KickCParser.NAME, 0); } + public DeclTypeContext declType() { + return getRuleContext(DeclTypeContext.class,0); + } + public DeclaratorContext declarator() { + return getRuleContext(DeclaratorContext.class,0); + } public TerminalNode COLON() { return getToken(KickCParser.COLON, 0); } public List expr() { return getRuleContexts(ExprContext.class); @@ -4107,15 +4112,6 @@ public class KickCParser extends Parser { return getRuleContext(ExprContext.class,i); } public TerminalNode RANGE() { return getToken(KickCParser.RANGE, 0); } - public DeclTypeContext declType() { - return getRuleContext(DeclTypeContext.class,0); - } - public List declPointer() { - return getRuleContexts(DeclPointerContext.class); - } - public DeclPointerContext declPointer(int i) { - return getRuleContext(DeclPointerContext.class,i); - } public ForRangeContext(ForLoopContext ctx) { copyFrom(ctx); } @Override public void enterRule(ParseTreeListener listener) { @@ -4166,9 +4162,9 @@ public class KickCParser extends Parser { enterRule(_localctx, 64, RULE_forLoop); int _la; try { - setState(548); + setState(540); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: _localctx = new ForClassicContext(_localctx); enterOuterAlt(_localctx, 1); @@ -4205,39 +4201,17 @@ public class KickCParser extends Parser { _localctx = new ForRangeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(540); - _errHandler.sync(this); - _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << LOCAL_RESERVE) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC) | (1L << CALLINGCONVENTION))) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (STRUCT - 69)) | (1L << (ENUM - 69)) | (1L << (SIGNEDNESS - 69)) | (1L << (SIMPLETYPE - 69)))) != 0)) { - { - setState(533); - declType(); - setState(537); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==ASTERISK) { - { - { - setState(534); - declPointer(); - } - } - setState(539); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - - setState(542); - match(NAME); - setState(543); + setState(533); + declType(); + setState(534); + declarator(0); + setState(535); match(COLON); - setState(544); + setState(536); expr(0); - setState(545); + setState(537); match(RANGE); - setState(546); + setState(538); expr(0); } break; @@ -4309,7 +4283,7 @@ public class KickCParser extends Parser { enterRule(_localctx, 66, RULE_forClassicInit); int _la; try { - setState(554); + setState(546); _errHandler.sync(this); switch (_input.LA(1)) { case TYPEDEFNAME: @@ -4338,12 +4312,12 @@ public class KickCParser extends Parser { _localctx = new ForClassicInitDeclContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(551); + setState(543); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << INLINE) | (1L << VOLATILE) | (1L << STATIC) | (1L << INTERRUPT) | (1L << REGISTER) | (1L << LOCAL_RESERVE) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_MA) | (1L << INTRINSIC) | (1L << CALLINGCONVENTION))) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (STRUCT - 69)) | (1L << (ENUM - 69)) | (1L << (SIGNEDNESS - 69)) | (1L << (SIMPLETYPE - 69)))) != 0)) { { - setState(550); + setState(542); declVariables(); } } @@ -4373,7 +4347,7 @@ public class KickCParser extends Parser { _localctx = new ForClassicInitExprContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(553); + setState(545); commaExpr(0); } break; @@ -4421,7 +4395,7 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(556); + setState(548); commaExpr(0); } } @@ -4510,13 +4484,13 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(559); + setState(551); expr(0); } _ctx.stop = _input.LT(-1); - setState(566); + setState(558); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,59,_ctx); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); @@ -4525,18 +4499,18 @@ public class KickCParser extends Parser { { _localctx = new CommaSimpleContext(new CommaExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_commaExpr); - setState(561); + setState(553); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(562); + setState(554); match(COMMA); - setState(563); + setState(555); expr(0); } } } - setState(568); + setState(560); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,59,_ctx); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); } } } @@ -5098,20 +5072,20 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(634); + setState(626); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { _localctx = new ExprParContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(570); + setState(562); match(PAR_BEGIN); - setState(571); + setState(563); commaExpr(0); - setState(572); + setState(564); match(PAR_END); } break; @@ -5120,8 +5094,62 @@ public class KickCParser extends Parser { _localctx = new ExprSizeOfContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(574); + setState(566); match(SIZEOF); + setState(567); + match(PAR_BEGIN); + setState(570); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CURLY_BEGIN: + case PAR_BEGIN: + case PLUS: + case MINUS: + case ASTERISK: + case INC: + case DEC: + case AND: + case BIT_NOT: + case LESS_THAN: + case GREATER_THAN: + case SIZEOF: + case TYPEID: + case DEFINED: + case LOGIC_NOT: + case BOOLEAN: + case NUMBER: + case NAME: + case STRING: + case CHAR: + { + setState(568); + expr(0); + } + break; + case TYPEDEFNAME: + case STRUCT: + case ENUM: + case SIGNEDNESS: + case SIMPLETYPE: + { + setState(569); + typeSpecifier(0); + } + break; + default: + throw new NoViableAltException(this); + } + setState(572); + match(PAR_END); + } + break; + case 3: + { + _localctx = new ExprTypeIdContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(574); + match(TYPEID); setState(575); match(PAR_BEGIN); setState(578); @@ -5169,85 +5197,31 @@ public class KickCParser extends Parser { match(PAR_END); } break; - case 3: - { - _localctx = new ExprTypeIdContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - setState(582); - match(TYPEID); - setState(583); - match(PAR_BEGIN); - setState(586); - _errHandler.sync(this); - switch (_input.LA(1)) { - case CURLY_BEGIN: - case PAR_BEGIN: - case PLUS: - case MINUS: - case ASTERISK: - case INC: - case DEC: - case AND: - case BIT_NOT: - case LESS_THAN: - case GREATER_THAN: - case SIZEOF: - case TYPEID: - case DEFINED: - case LOGIC_NOT: - case BOOLEAN: - case NUMBER: - case NAME: - case STRING: - case CHAR: - { - setState(584); - expr(0); - } - break; - case TYPEDEFNAME: - case STRUCT: - case ENUM: - case SIGNEDNESS: - case SIMPLETYPE: - { - setState(585); - typeSpecifier(0); - } - break; - default: - throw new NoViableAltException(this); - } - setState(588); - match(PAR_END); - } - break; case 4: { _localctx = new ExprDefinedContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(590); + setState(582); match(DEFINED); - setState(592); + setState(584); _errHandler.sync(this); _la = _input.LA(1); if (_la==PAR_BEGIN) { { - setState(591); + setState(583); match(PAR_BEGIN); } } - setState(594); + setState(586); match(NAME); - setState(596); + setState(588); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(595); + setState(587); match(PAR_END); } break; @@ -5259,13 +5233,13 @@ public class KickCParser extends Parser { _localctx = new ExprCastContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(598); + setState(590); match(PAR_BEGIN); - setState(599); + setState(591); typeSpecifier(0); - setState(600); + setState(592); match(PAR_END); - setState(601); + setState(593); expr(24); } break; @@ -5274,7 +5248,7 @@ public class KickCParser extends Parser { _localctx = new ExprPreModContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(603); + setState(595); _la = _input.LA(1); if ( !(_la==INC || _la==DEC) ) { _errHandler.recoverInline(this); @@ -5284,7 +5258,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(604); + setState(596); expr(23); } break; @@ -5293,9 +5267,9 @@ public class KickCParser extends Parser { _localctx = new ExprPtrContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(605); + setState(597); match(ASTERISK); - setState(606); + setState(598); expr(21); } break; @@ -5304,7 +5278,7 @@ public class KickCParser extends Parser { _localctx = new ExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(607); + setState(599); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PLUS) | (1L << MINUS) | (1L << AND) | (1L << BIT_NOT))) != 0) || _la==LOGIC_NOT) ) { _errHandler.recoverInline(this); @@ -5314,7 +5288,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(608); + setState(600); expr(20); } break; @@ -5323,7 +5297,7 @@ public class KickCParser extends Parser { _localctx = new ExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(609); + setState(601); _la = _input.LA(1); if ( !(_la==LESS_THAN || _la==GREATER_THAN) ) { _errHandler.recoverInline(this); @@ -5333,7 +5307,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(610); + setState(602); expr(16); } break; @@ -5342,39 +5316,39 @@ public class KickCParser extends Parser { _localctx = new InitListContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(611); + setState(603); match(CURLY_BEGIN); - setState(612); + setState(604); expr(0); - setState(617); + setState(609); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,64,_ctx); + _alt = getInterpreter().adaptivePredict(_input,62,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(613); + setState(605); match(COMMA); - setState(614); + setState(606); expr(0); } } } - setState(619); + setState(611); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,64,_ctx); + _alt = getInterpreter().adaptivePredict(_input,62,_ctx); } - setState(621); + setState(613); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(620); + setState(612); match(COMMA); } } - setState(623); + setState(615); match(CURLY_END); } break; @@ -5383,7 +5357,7 @@ public class KickCParser extends Parser { _localctx = new ExprIdContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(625); + setState(617); match(NAME); } break; @@ -5392,7 +5366,7 @@ public class KickCParser extends Parser { _localctx = new ExprNumberContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(626); + setState(618); match(NUMBER); } break; @@ -5401,7 +5375,7 @@ public class KickCParser extends Parser { _localctx = new ExprStringContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(628); + setState(620); _errHandler.sync(this); _alt = 1; do { @@ -5409,7 +5383,7 @@ public class KickCParser extends Parser { case 1: { { - setState(627); + setState(619); match(STRING); } } @@ -5417,9 +5391,9 @@ public class KickCParser extends Parser { default: throw new NoViableAltException(this); } - setState(630); + setState(622); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,66,_ctx); + _alt = getInterpreter().adaptivePredict(_input,64,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } break; @@ -5428,7 +5402,7 @@ public class KickCParser extends Parser { _localctx = new ExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(632); + setState(624); match(CHAR); } break; @@ -5437,30 +5411,30 @@ public class KickCParser extends Parser { _localctx = new ExprBoolContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(633); + setState(625); match(BOOLEAN); } break; } _ctx.stop = _input.LT(-1); - setState(696); + setState(688); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,70,_ctx); + _alt = getInterpreter().adaptivePredict(_input,68,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(694); + setState(686); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(636); + setState(628); if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); - setState(637); + setState(629); _la = _input.LA(1); if ( !(_la==SHIFT_LEFT || _la==SHIFT_RIGHT) ) { _errHandler.recoverInline(this); @@ -5470,7 +5444,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(638); + setState(630); expr(20); } break; @@ -5478,9 +5452,9 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(639); + setState(631); if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); - setState(640); + setState(632); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASTERISK) | (1L << DIVIDE) | (1L << MODULO))) != 0)) ) { _errHandler.recoverInline(this); @@ -5490,7 +5464,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(641); + setState(633); expr(19); } break; @@ -5498,9 +5472,9 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(642); + setState(634); if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); - setState(643); + setState(635); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -5510,7 +5484,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(644); + setState(636); expr(18); } break; @@ -5518,9 +5492,9 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(645); + setState(637); if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); - setState(646); + setState(638); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << EQUAL) | (1L << NOT_EQUAL) | (1L << LESS_THAN) | (1L << LESS_THAN_EQUAL) | (1L << GREATER_THAN_EQUAL) | (1L << GREATER_THAN))) != 0)) ) { _errHandler.recoverInline(this); @@ -5530,7 +5504,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(647); + setState(639); expr(16); } break; @@ -5538,13 +5512,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(648); + setState(640); if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); { - setState(649); + setState(641); match(AND); } - setState(650); + setState(642); expr(15); } break; @@ -5552,13 +5526,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(651); + setState(643); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); { - setState(652); + setState(644); match(BIT_XOR); } - setState(653); + setState(645); expr(14); } break; @@ -5566,13 +5540,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(654); + setState(646); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); { - setState(655); + setState(647); match(BIT_OR); } - setState(656); + setState(648); expr(13); } break; @@ -5580,13 +5554,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(657); + setState(649); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); { - setState(658); + setState(650); match(LOGIC_AND); } - setState(659); + setState(651); expr(12); } break; @@ -5594,13 +5568,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(660); + setState(652); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); { - setState(661); + setState(653); match(LOGIC_OR); } - setState(662); + setState(654); expr(11); } break; @@ -5608,15 +5582,15 @@ public class KickCParser extends Parser { { _localctx = new ExprTernaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(663); + setState(655); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(664); + setState(656); match(CONDITION); - setState(665); + setState(657); expr(0); - setState(666); + setState(658); match(COLON); - setState(667); + setState(659); expr(10); } break; @@ -5624,11 +5598,11 @@ public class KickCParser extends Parser { { _localctx = new ExprAssignmentContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(669); + setState(661); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(670); + setState(662); match(ASSIGN); - setState(671); + setState(663); expr(8); } break; @@ -5636,11 +5610,11 @@ public class KickCParser extends Parser { { _localctx = new ExprAssignmentCompoundContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(672); + setState(664); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(673); + setState(665); match(ASSIGN_COMPOUND); - setState(674); + setState(666); expr(7); } break; @@ -5648,11 +5622,11 @@ public class KickCParser extends Parser { { _localctx = new ExprDotContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(675); + setState(667); if (!(precpred(_ctx, 31))) throw new FailedPredicateException(this, "precpred(_ctx, 31)"); - setState(676); + setState(668); match(DOT); - setState(677); + setState(669); match(NAME); } break; @@ -5660,11 +5634,11 @@ public class KickCParser extends Parser { { _localctx = new ExprArrowContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(678); + setState(670); if (!(precpred(_ctx, 30))) throw new FailedPredicateException(this, "precpred(_ctx, 30)"); - setState(679); + setState(671); match(ARROW); - setState(680); + setState(672); match(NAME); } break; @@ -5672,21 +5646,21 @@ public class KickCParser extends Parser { { _localctx = new ExprCallContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(681); + setState(673); if (!(precpred(_ctx, 29))) throw new FailedPredicateException(this, "precpred(_ctx, 29)"); - setState(682); + setState(674); match(PAR_BEGIN); - setState(684); + setState(676); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (SIZEOF - 71)) | (1L << (TYPEID - 71)) | (1L << (DEFINED - 71)) | (1L << (LOGIC_NOT - 71)) | (1L << (BOOLEAN - 71)) | (1L << (NUMBER - 71)) | (1L << (NAME - 71)) | (1L << (STRING - 71)) | (1L << (CHAR - 71)))) != 0)) { { - setState(683); + setState(675); parameterList(); } } - setState(686); + setState(678); match(PAR_END); } break; @@ -5694,13 +5668,13 @@ public class KickCParser extends Parser { { _localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(687); + setState(679); if (!(precpred(_ctx, 25))) throw new FailedPredicateException(this, "precpred(_ctx, 25)"); - setState(688); + setState(680); match(BRACKET_BEGIN); - setState(689); + setState(681); commaExpr(0); - setState(690); + setState(682); match(BRACKET_END); } break; @@ -5708,9 +5682,9 @@ public class KickCParser extends Parser { { _localctx = new ExprPostModContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(692); + setState(684); if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)"); - setState(693); + setState(685); _la = _input.LA(1); if ( !(_la==INC || _la==DEC) ) { _errHandler.recoverInline(this); @@ -5725,9 +5699,9 @@ public class KickCParser extends Parser { } } } - setState(698); + setState(690); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,70,_ctx); + _alt = getInterpreter().adaptivePredict(_input,68,_ctx); } } } @@ -5779,21 +5753,21 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(699); + setState(691); expr(0); - setState(704); + setState(696); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(700); + setState(692); match(COMMA); - setState(701); + setState(693); expr(0); } } - setState(706); + setState(698); _errHandler.sync(this); _la = _input.LA(1); } @@ -5842,19 +5816,19 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(707); + setState(699); match(KICKASM); - setState(709); + setState(701); _errHandler.sync(this); _la = _input.LA(1); if (_la==PAR_BEGIN) { { - setState(708); + setState(700); asmDirectives(); } } - setState(711); + setState(703); match(KICKASM_BODY); } } @@ -5908,27 +5882,27 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(713); + setState(705); match(PAR_BEGIN); - setState(714); + setState(706); asmDirective(); - setState(719); + setState(711); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(715); + setState(707); match(COMMA); - setState(716); + setState(708); asmDirective(); } } - setState(721); + setState(713); _errHandler.sync(this); _la = _input.LA(1); } - setState(722); + setState(714); match(PAR_END); } } @@ -6053,16 +6027,16 @@ public class KickCParser extends Parser { AsmDirectiveContext _localctx = new AsmDirectiveContext(_ctx, getState()); enterRule(_localctx, 80, RULE_asmDirective); try { - setState(734); + setState(726); _errHandler.sync(this); switch (_input.LA(1)) { case RESOURCE: _localctx = new AsmDirectiveResourceContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(724); + setState(716); match(RESOURCE); - setState(725); + setState(717); match(STRING); } break; @@ -6070,9 +6044,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveUsesContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(726); + setState(718); match(USES); - setState(727); + setState(719); match(NAME); } break; @@ -6080,9 +6054,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveClobberContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(728); + setState(720); match(CLOBBERS); - setState(729); + setState(721); match(STRING); } break; @@ -6090,9 +6064,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveBytesContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(730); + setState(722); match(BYTES); - setState(731); + setState(723); expr(0); } break; @@ -6100,9 +6074,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveCyclesContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(732); + setState(724); match(CYCLES); - setState(733); + setState(725); expr(0); } break; @@ -6154,17 +6128,17 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(739); + setState(731); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & ((1L << (ASM_BYTE - 113)) | (1L << (ASM_MNEMONIC - 113)) | (1L << (ASM_MULTI_NAME - 113)) | (1L << (ASM_NAME - 113)))) != 0)) { { { - setState(736); + setState(728); asmLine(); } } - setState(741); + setState(733); _errHandler.sync(this); _la = _input.LA(1); } @@ -6214,28 +6188,28 @@ public class KickCParser extends Parser { AsmLineContext _localctx = new AsmLineContext(_ctx, getState()); enterRule(_localctx, 84, RULE_asmLine); try { - setState(745); + setState(737); _errHandler.sync(this); switch (_input.LA(1)) { case ASM_MULTI_NAME: case ASM_NAME: enterOuterAlt(_localctx, 1); { - setState(742); + setState(734); asmLabel(); } break; case ASM_MNEMONIC: enterOuterAlt(_localctx, 2); { - setState(743); + setState(735); asmInstruction(); } break; case ASM_BYTE: enterOuterAlt(_localctx, 3); { - setState(744); + setState(736); asmBytes(); } break; @@ -6315,15 +6289,39 @@ public class KickCParser extends Parser { enterRule(_localctx, 86, RULE_asmLabel); int _la; try { - setState(763); + setState(755); _errHandler.sync(this); switch (_input.LA(1)) { case ASM_NAME: _localctx = new AsmLabelNameContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(747); + setState(739); match(ASM_NAME); + setState(740); + match(ASM_COLON); + setState(744); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==ASM_TAG) { + { + { + setState(741); + match(ASM_TAG); + } + } + setState(746); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + case ASM_MULTI_NAME: + _localctx = new AsmLabelMultiContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(747); + match(ASM_MULTI_NAME); setState(748); match(ASM_COLON); setState(752); @@ -6342,30 +6340,6 @@ public class KickCParser extends Parser { } } break; - case ASM_MULTI_NAME: - _localctx = new AsmLabelMultiContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(755); - match(ASM_MULTI_NAME); - setState(756); - match(ASM_COLON); - setState(760); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==ASM_TAG) { - { - { - setState(757); - match(ASM_TAG); - } - } - setState(762); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - break; default: throw new NoViableAltException(this); } @@ -6416,29 +6390,29 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(765); + setState(757); match(ASM_MNEMONIC); - setState(767); + setState(759); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { - setState(766); + setState(758); asmParamMode(); } break; } - setState(772); + setState(764); _errHandler.sync(this); _la = _input.LA(1); while (_la==ASM_TAG) { { { - setState(769); + setState(761); match(ASM_TAG); } } - setState(774); + setState(766); _errHandler.sync(this); _la = _input.LA(1); } @@ -6497,37 +6471,37 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(775); + setState(767); match(ASM_BYTE); - setState(776); + setState(768); asmExpr(0); - setState(781); + setState(773); _errHandler.sync(this); _la = _input.LA(1); while (_la==ASM_COMMA) { { { - setState(777); + setState(769); match(ASM_COMMA); - setState(778); + setState(770); asmExpr(0); } } - setState(783); + setState(775); _errHandler.sync(this); _la = _input.LA(1); } - setState(787); + setState(779); _errHandler.sync(this); _la = _input.LA(1); while (_la==ASM_TAG) { { { - setState(784); + setState(776); match(ASM_TAG); } } - setState(789); + setState(781); _errHandler.sync(this); _la = _input.LA(1); } @@ -6774,14 +6748,14 @@ public class KickCParser extends Parser { AsmParamModeContext _localctx = new AsmParamModeContext(_ctx, getState()); enterRule(_localctx, 92, RULE_asmParamMode); try { - setState(835); + setState(827); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { case 1: _localctx = new AsmModeAbsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(790); + setState(782); asmExpr(0); } break; @@ -6789,9 +6763,9 @@ public class KickCParser extends Parser { _localctx = new AsmModeImmContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(791); + setState(783); match(ASM_IMM); - setState(792); + setState(784); asmExpr(0); } break; @@ -6799,11 +6773,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeAbsXYContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(793); + setState(785); asmExpr(0); - setState(794); + setState(786); match(ASM_COMMA); - setState(795); + setState(787); asmExpr(0); } break; @@ -6811,10 +6785,30 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndIdxXYContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(797); + setState(789); match(ASM_PAR_BEGIN); - setState(798); + setState(790); asmExpr(0); + setState(791); + match(ASM_PAR_END); + setState(792); + match(ASM_COMMA); + setState(793); + match(ASM_NAME); + } + break; + case 5: + _localctx = new AsmModeIndLongIdxXYContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(795); + match(ASM_PAR_BEGIN); + setState(796); + match(ASM_PAR_BEGIN); + setState(797); + asmExpr(0); + setState(798); + match(ASM_PAR_END); setState(799); match(ASM_PAR_END); setState(800); @@ -6823,18 +6817,18 @@ public class KickCParser extends Parser { match(ASM_NAME); } break; - case 5: - _localctx = new AsmModeIndLongIdxXYContext(_localctx); - enterOuterAlt(_localctx, 5); + case 6: + _localctx = new AsmModeSPIndIdxContext(_localctx); + enterOuterAlt(_localctx, 6); { setState(803); match(ASM_PAR_BEGIN); setState(804); - match(ASM_PAR_BEGIN); - setState(805); asmExpr(0); + setState(805); + match(ASM_COMMA); setState(806); - match(ASM_PAR_END); + match(ASM_NAME); setState(807); match(ASM_PAR_END); setState(808); @@ -6843,9 +6837,9 @@ public class KickCParser extends Parser { match(ASM_NAME); } break; - case 6: - _localctx = new AsmModeSPIndIdxContext(_localctx); - enterOuterAlt(_localctx, 6); + case 7: + _localctx = new AsmModeIdxIndXYContext(_localctx); + enterOuterAlt(_localctx, 7); { setState(811); match(ASM_PAR_BEGIN); @@ -6857,37 +6851,17 @@ public class KickCParser extends Parser { match(ASM_NAME); setState(815); match(ASM_PAR_END); - setState(816); - match(ASM_COMMA); - setState(817); - match(ASM_NAME); - } - break; - case 7: - _localctx = new AsmModeIdxIndXYContext(_localctx); - enterOuterAlt(_localctx, 7); - { - setState(819); - match(ASM_PAR_BEGIN); - setState(820); - asmExpr(0); - setState(821); - match(ASM_COMMA); - setState(822); - match(ASM_NAME); - setState(823); - match(ASM_PAR_END); } break; case 8: _localctx = new AsmModeIndContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(825); + setState(817); match(ASM_PAR_BEGIN); - setState(826); + setState(818); asmExpr(0); - setState(827); + setState(819); match(ASM_PAR_END); } break; @@ -6895,15 +6869,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndLongContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(829); + setState(821); match(ASM_PAR_BEGIN); - setState(830); + setState(822); match(ASM_PAR_BEGIN); - setState(831); + setState(823); asmExpr(0); - setState(832); + setState(824); match(ASM_PAR_END); - setState(833); + setState(825); match(ASM_PAR_END); } break; @@ -7108,7 +7082,7 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(851); + setState(843); _errHandler.sync(this); switch (_input.LA(1)) { case ASM_BRACKET_BEGIN: @@ -7117,11 +7091,11 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(838); + setState(830); match(ASM_BRACKET_BEGIN); - setState(839); + setState(831); asmExpr(0); - setState(840); + setState(832); match(ASM_BRACKET_END); } break; @@ -7133,7 +7107,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(842); + setState(834); _la = _input.LA(1); if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (ASM_PLUS - 125)) | (1L << (ASM_MINUS - 125)) | (1L << (ASM_LESS_THAN - 125)) | (1L << (ASM_GREATER_THAN - 125)))) != 0)) ) { _errHandler.recoverInline(this); @@ -7143,7 +7117,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(843); + setState(835); asmExpr(8); } break; @@ -7152,7 +7126,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(844); + setState(836); match(ASM_NAME); } break; @@ -7161,7 +7135,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelRelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(845); + setState(837); match(ASM_MULTI_REL); } break; @@ -7170,11 +7144,11 @@ public class KickCParser extends Parser { _localctx = new AsmExprReplaceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(846); + setState(838); match(ASM_CURLY_BEGIN); - setState(847); + setState(839); match(ASM_NAME); - setState(848); + setState(840); match(ASM_CURLY_END); } break; @@ -7183,7 +7157,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprIntContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(849); + setState(841); match(ASM_NUMBER); } break; @@ -7192,7 +7166,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(850); + setState(842); match(ASM_CHAR); } break; @@ -7200,28 +7174,28 @@ public class KickCParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(867); + setState(859); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,87,_ctx); + _alt = getInterpreter().adaptivePredict(_input,85,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(865); + setState(857); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(853); + setState(845); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); { - setState(854); + setState(846); match(ASM_DOT); } - setState(855); + setState(847); asmExpr(11); } break; @@ -7229,9 +7203,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(856); + setState(848); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(857); + setState(849); _la = _input.LA(1); if ( !(_la==ASM_SHIFT_LEFT || _la==ASM_SHIFT_RIGHT) ) { _errHandler.recoverInline(this); @@ -7241,7 +7215,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(858); + setState(850); asmExpr(10); } break; @@ -7249,9 +7223,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(859); + setState(851); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(860); + setState(852); _la = _input.LA(1); if ( !(_la==ASM_MULTIPLY || _la==ASM_DIVIDE) ) { _errHandler.recoverInline(this); @@ -7261,7 +7235,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(861); + setState(853); asmExpr(8); } break; @@ -7269,9 +7243,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(862); + setState(854); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(863); + setState(855); _la = _input.LA(1); if ( !(_la==ASM_PLUS || _la==ASM_MINUS) ) { _errHandler.recoverInline(this); @@ -7281,16 +7255,16 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(864); + setState(856); asmExpr(7); } break; } } } - setState(869); + setState(861); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,87,_ctx); + _alt = getInterpreter().adaptivePredict(_input,85,_ctx); } } } @@ -7424,7 +7398,7 @@ public class KickCParser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009c\u0369\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009c\u0361\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -7466,309 +7440,306 @@ public class KickCParser extends Parser { "\3\37\5\37\u01ea\n\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u01f3\n"+ "\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u01fb\n\37\3 \6 \u01fe\n \r \16"+ " \u01ff\3 \3 \3 \5 \u0205\n \5 \u0207\n \3!\3!\3!\3!\5!\u020d\n!\3\"\3"+ - "\"\3\"\5\"\u0212\n\"\3\"\3\"\5\"\u0216\n\"\3\"\3\"\7\"\u021a\n\"\f\"\16"+ - "\"\u021d\13\"\5\"\u021f\n\"\3\"\3\"\3\"\3\"\3\"\3\"\5\"\u0227\n\"\3#\5"+ - "#\u022a\n#\3#\5#\u022d\n#\3$\3$\3%\3%\3%\3%\3%\3%\7%\u0237\n%\f%\16%\u023a"+ - "\13%\3&\3&\3&\3&\3&\3&\3&\3&\3&\5&\u0245\n&\3&\3&\3&\3&\3&\3&\5&\u024d"+ - "\n&\3&\3&\3&\3&\5&\u0253\n&\3&\3&\5&\u0257\n&\3&\3&\3&\3&\3&\3&\3&\3&"+ - "\3&\3&\3&\3&\3&\3&\3&\3&\3&\7&\u026a\n&\f&\16&\u026d\13&\3&\5&\u0270\n"+ - "&\3&\3&\3&\3&\3&\6&\u0277\n&\r&\16&\u0278\3&\3&\5&\u027d\n&\3&\3&\3&\3"+ - "&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3"+ - "&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\5&\u02af"+ - "\n&\3&\3&\3&\3&\3&\3&\3&\3&\7&\u02b9\n&\f&\16&\u02bc\13&\3\'\3\'\3\'\7"+ - "\'\u02c1\n\'\f\'\16\'\u02c4\13\'\3(\3(\5(\u02c8\n(\3(\3(\3)\3)\3)\3)\7"+ - ")\u02d0\n)\f)\16)\u02d3\13)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\5*\u02e1"+ - "\n*\3+\7+\u02e4\n+\f+\16+\u02e7\13+\3,\3,\3,\5,\u02ec\n,\3-\3-\3-\7-\u02f1"+ - "\n-\f-\16-\u02f4\13-\3-\3-\3-\7-\u02f9\n-\f-\16-\u02fc\13-\5-\u02fe\n"+ - "-\3.\3.\5.\u0302\n.\3.\7.\u0305\n.\f.\16.\u0308\13.\3/\3/\3/\3/\7/\u030e"+ - "\n/\f/\16/\u0311\13/\3/\7/\u0314\n/\f/\16/\u0317\13/\3\60\3\60\3\60\3"+ - "\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3"+ - "\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3"+ - "\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\5"+ - "\60\u0346\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+ - "\3\61\3\61\3\61\5\61\u0356\n\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+ - "\3\61\3\61\3\61\3\61\7\61\u0364\n\61\f\61\16\61\u0367\13\61\3\61\2\n\f"+ - "\30\32\34(HJ`\62\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62"+ - "\64\668:<>@BDFHJLNPRTVXZ\\^`\2\r\3\2\27\30\5\2\22\23\31\32RR\4\2!!$$\3"+ - "\2\35\36\3\2\24\26\3\2\22\23\3\2\37$\3\2\177\u0082\3\2}~\3\2\u0083\u0084"+ - "\3\2\177\u0080\2\u03e7\2b\3\2\2\2\4e\3\2\2\2\6k\3\2\2\2\b|\3\2\2\2\n~"+ - "\3\2\2\2\f\u0081\3\2\2\2\16\u0095\3\2\2\2\20\u0097\3\2\2\2\22\u00ab\3"+ - "\2\2\2\24\u00b5\3\2\2\2\26\u00bc\3\2\2\2\30\u00c2\3\2\2\2\32\u00e0\3\2"+ - "\2\2\34\u00f8\3\2\2\2\36\u0102\3\2\2\2 \u0105\3\2\2\2\"\u0111\3\2\2\2"+ - "$\u0114\3\2\2\2&\u0117\3\2\2\2(\u011f\3\2\2\2*\u012a\3\2\2\2,\u012f\3"+ - "\2\2\2.\u0140\3\2\2\2\60\u0146\3\2\2\2\62\u0159\3\2\2\2\64\u015b\3\2\2"+ - "\2\66\u016f\3\2\2\28\u019e\3\2\2\2:\u01a1\3\2\2\2<\u01fa\3\2\2\2>\u01fd"+ - "\3\2\2\2@\u0208\3\2\2\2B\u0226\3\2\2\2D\u022c\3\2\2\2F\u022e\3\2\2\2H"+ - "\u0230\3\2\2\2J\u027c\3\2\2\2L\u02bd\3\2\2\2N\u02c5\3\2\2\2P\u02cb\3\2"+ - "\2\2R\u02e0\3\2\2\2T\u02e5\3\2\2\2V\u02eb\3\2\2\2X\u02fd\3\2\2\2Z\u02ff"+ - "\3\2\2\2\\\u0309\3\2\2\2^\u0345\3\2\2\2`\u0355\3\2\2\2bc\5\6\4\2cd\7\2"+ - "\2\3d\3\3\2\2\2ef\5T+\2fg\7\2\2\3g\5\3\2\2\2hj\5\b\5\2ih\3\2\2\2jm\3\2"+ - "\2\2ki\3\2\2\2kl\3\2\2\2l\7\3\2\2\2mk\3\2\2\2no\5\n\6\2op\7\n\2\2p}\3"+ - "\2\2\2q}\5,\27\2rs\5 \21\2st\7\n\2\2t}\3\2\2\2uv\5&\24\2vw\7\n\2\2w}\3"+ - "\2\2\2x}\5\64\33\2yz\5\20\t\2z{\7\n\2\2{}\3\2\2\2|n\3\2\2\2|q\3\2\2\2"+ - "|r\3\2\2\2|u\3\2\2\2|x\3\2\2\2|y\3\2\2\2}\t\3\2\2\2~\177\5\22\n\2\177"+ - "\u0080\5\f\7\2\u0080\13\3\2\2\2\u0081\u0082\b\7\1\2\u0082\u0083\5\16\b"+ - "\2\u0083\u0089\3\2\2\2\u0084\u0085\f\3\2\2\u0085\u0086\7\f\2\2\u0086\u0088"+ - "\5\16\b\2\u0087\u0084\3\2\2\2\u0088\u008b\3\2\2\2\u0089\u0087\3\2\2\2"+ - "\u0089\u008a\3\2\2\2\u008a\r\3\2\2\2\u008b\u0089\3\2\2\2\u008c\u008f\5"+ - "\32\16\2\u008d\u008e\7\'\2\2\u008e\u0090\5J&\2\u008f\u008d\3\2\2\2\u008f"+ - "\u0090\3\2\2\2\u0090\u0096\3\2\2\2\u0091\u0092\5\32\16\2\u0092\u0093\7"+ - "\'\2\2\u0093\u0094\5N(\2\u0094\u0096\3\2\2\2\u0095\u008c\3\2\2\2\u0095"+ - "\u0091\3\2\2\2\u0096\17\3\2\2\2\u0097\u0098\7)\2\2\u0098\u009c\5\22\n"+ - "\2\u0099\u009b\5\24\13\2\u009a\u0099\3\2\2\2\u009b\u009e\3\2\2\2\u009c"+ - "\u009a\3\2\2\2\u009c\u009d\3\2\2\2\u009d\u009f\3\2\2\2\u009e\u009c\3\2"+ - "\2\2\u009f\u00a3\7m\2\2\u00a0\u00a2\5\26\f\2\u00a1\u00a0\3\2\2\2\u00a2"+ - "\u00a5\3\2\2\2\u00a3\u00a1\3\2\2\2\u00a3\u00a4\3\2\2\2\u00a4\u00a6\3\2"+ - "\2\2\u00a5\u00a3\3\2\2\2\u00a6\u00a7\b\t\1\2\u00a7\21\3\2\2\2\u00a8\u00aa"+ - "\58\35\2\u00a9\u00a8\3\2\2\2\u00aa\u00ad\3\2\2\2\u00ab\u00a9\3\2\2\2\u00ab"+ - "\u00ac\3\2\2\2\u00ac\u00ae\3\2\2\2\u00ad\u00ab\3\2\2\2\u00ae\u00b2\5\34"+ - "\17\2\u00af\u00b1\58\35\2\u00b0\u00af\3\2\2\2\u00b1\u00b4\3\2\2\2\u00b2"+ - "\u00b0\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\23\3\2\2\2\u00b4\u00b2\3\2\2"+ - "\2\u00b5\u00b9\7\24\2\2\u00b6\u00b8\58\35\2\u00b7\u00b6\3\2\2\2\u00b8"+ - "\u00bb\3\2\2\2\u00b9\u00b7\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\25\3\2\2"+ - "\2\u00bb\u00b9\3\2\2\2\u00bc\u00be\7\6\2\2\u00bd\u00bf\5J&\2\u00be\u00bd"+ - "\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\7\7\2\2\u00c1"+ - "\27\3\2\2\2\u00c2\u00c3\b\r\1\2\u00c3\u00c4\5\34\17\2\u00c4\u00cf\3\2"+ - "\2\2\u00c5\u00c6\f\4\2\2\u00c6\u00ce\7\24\2\2\u00c7\u00c8\f\3\2\2\u00c8"+ - "\u00ca\7\6\2\2\u00c9\u00cb\5J&\2\u00ca\u00c9\3\2\2\2\u00ca\u00cb\3\2\2"+ - "\2\u00cb\u00cc\3\2\2\2\u00cc\u00ce\7\7\2\2\u00cd\u00c5\3\2\2\2\u00cd\u00c7"+ - "\3\2\2\2\u00ce\u00d1\3\2\2\2\u00cf\u00cd\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0"+ - "\31\3\2\2\2\u00d1\u00cf\3\2\2\2\u00d2\u00d3\b\16\1\2\u00d3\u00e1\7m\2"+ - "\2\u00d4\u00d8\7\24\2\2\u00d5\u00d7\58\35\2\u00d6\u00d5\3\2\2\2\u00d7"+ - "\u00da\3\2\2\2\u00d8\u00d6\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00db\3\2"+ - "\2\2\u00da\u00d8\3\2\2\2\u00db\u00e1\5\32\16\4\u00dc\u00dd\7\b\2\2\u00dd"+ - "\u00de\5\32\16\2\u00de\u00df\7\t\2\2\u00df\u00e1\3\2\2\2\u00e0\u00d2\3"+ - "\2\2\2\u00e0\u00d4\3\2\2\2\u00e0\u00dc\3\2\2\2\u00e1\u00ea\3\2\2\2\u00e2"+ - "\u00e3\f\5\2\2\u00e3\u00e5\7\6\2\2\u00e4\u00e6\5J&\2\u00e5\u00e4\3\2\2"+ - "\2\u00e5\u00e6\3\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e9\7\7\2\2\u00e8\u00e2"+ - "\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb"+ - "\33\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee\b\17\1\2\u00ee\u00f9\7T\2"+ - "\2\u00ef\u00f1\7S\2\2\u00f0\u00f2\7T\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2"+ - "\3\2\2\2\u00f2\u00f9\3\2\2\2\u00f3\u00f9\5 \21\2\u00f4\u00f9\5\36\20\2"+ - "\u00f5\u00f9\5&\24\2\u00f6\u00f9\5$\23\2\u00f7\u00f9\7\3\2\2\u00f8\u00ed"+ - "\3\2\2\2\u00f8\u00ef\3\2\2\2\u00f8\u00f3\3\2\2\2\u00f8\u00f4\3\2\2\2\u00f8"+ - "\u00f5\3\2\2\2\u00f8\u00f6\3\2\2\2\u00f8\u00f7\3\2\2\2\u00f9\u00ff\3\2"+ - "\2\2\u00fa\u00fb\f\b\2\2\u00fb\u00fc\7\b\2\2\u00fc\u00fe\7\t\2\2\u00fd"+ - "\u00fa\3\2\2\2\u00fe\u0101\3\2\2\2\u00ff\u00fd\3\2\2\2\u00ff\u0100\3\2"+ - "\2\2\u0100\35\3\2\2\2\u0101\u00ff\3\2\2\2\u0102\u0103\7G\2\2\u0103\u0104"+ - "\7m\2\2\u0104\37\3\2\2\2\u0105\u0107\7G\2\2\u0106\u0108\7m\2\2\u0107\u0106"+ - "\3\2\2\2\u0107\u0108\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010b\7\4\2\2\u010a"+ - "\u010c\5\"\22\2\u010b\u010a\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010b\3"+ - "\2\2\2\u010d\u010e\3\2\2\2\u010e\u010f\3\2\2\2\u010f\u0110\7\5\2\2\u0110"+ - "!\3\2\2\2\u0111\u0112\5\n\6\2\u0112\u0113\7\n\2\2\u0113#\3\2\2\2\u0114"+ - "\u0115\7H\2\2\u0115\u0116\7m\2\2\u0116%\3\2\2\2\u0117\u0119\7H\2\2\u0118"+ - "\u011a\7m\2\2\u0119\u0118\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011b\3\2"+ - "\2\2\u011b\u011c\7\4\2\2\u011c\u011d\5(\25\2\u011d\u011e\7\5\2\2\u011e"+ - "\'\3\2\2\2\u011f\u0120\b\25\1\2\u0120\u0121\5*\26\2\u0121\u0127\3\2\2"+ - "\2\u0122\u0123\f\3\2\2\u0123\u0124\7\f\2\2\u0124\u0126\5*\26\2\u0125\u0122"+ - "\3\2\2\2\u0126\u0129\3\2\2\2\u0127\u0125\3\2\2\2\u0127\u0128\3\2\2\2\u0128"+ - ")\3\2\2\2\u0129\u0127\3\2\2\2\u012a\u012d\7m\2\2\u012b\u012c\7\'\2\2\u012c"+ - "\u012e\5J&\2\u012d\u012b\3\2\2\2\u012d\u012e\3\2\2\2\u012e+\3\2\2\2\u012f"+ - "\u0133\5\22\n\2\u0130\u0132\5\24\13\2\u0131\u0130\3\2\2\2\u0132\u0135"+ - "\3\2\2\2\u0133\u0131\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136\3\2\2\2\u0135"+ - "\u0133\3\2\2\2\u0136\u0137\7m\2\2\u0137\u0139\7\b\2\2\u0138\u013a\5\60"+ - "\31\2\u0139\u0138\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u013b\3\2\2\2\u013b"+ - "\u013e\7\t\2\2\u013c\u013f\5.\30\2\u013d\u013f\7\n\2\2\u013e\u013c\3\2"+ - "\2\2\u013e\u013d\3\2\2\2\u013f-\3\2\2\2\u0140\u0142\7\4\2\2\u0141\u0143"+ - "\5:\36\2\u0142\u0141\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0144\3\2\2\2\u0144"+ - "\u0145\7\5\2\2\u0145/\3\2\2\2\u0146\u014b\5\62\32\2\u0147\u0148\7\f\2"+ - "\2\u0148\u014a\5\62\32\2\u0149\u0147\3\2\2\2\u014a\u014d\3\2\2\2\u014b"+ - "\u0149\3\2\2\2\u014b\u014c\3\2\2\2\u014c\61\3\2\2\2\u014d\u014b\3\2\2"+ - "\2\u014e\u0152\5\22\n\2\u014f\u0151\5\24\13\2\u0150\u014f\3\2\2\2\u0151"+ - "\u0154\3\2\2\2\u0152\u0150\3\2\2\2\u0152\u0153\3\2\2\2\u0153\u0155\3\2"+ - "\2\2\u0154\u0152\3\2\2\2\u0155\u0156\7m\2\2\u0156\u015a\3\2\2\2\u0157"+ - "\u015a\7T\2\2\u0158\u015a\7\16\2\2\u0159\u014e\3\2\2\2\u0159\u0157\3\2"+ - "\2\2\u0159\u0158\3\2\2\2\u015a\63\3\2\2\2\u015b\u015c\7Y\2\2\u015c\u015d"+ - "\7m\2\2\u015d\u015e\7\b\2\2\u015e\u0163\5\66\34\2\u015f\u0160\7\f\2\2"+ - "\u0160\u0162\5\66\34\2\u0161\u015f\3\2\2\2\u0162\u0165\3\2\2\2\u0163\u0161"+ - "\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0166\3\2\2\2\u0165\u0163\3\2\2\2\u0166"+ - "\u0167\7\t\2\2\u0167\65\3\2\2\2\u0168\u0170\7d\2\2\u0169\u016a\7d\2\2"+ - "\u016a\u016b\7\r\2\2\u016b\u0170\7d\2\2\u016c\u0170\7m\2\2\u016d\u0170"+ - "\7n\2\2\u016e\u0170\7:\2\2\u016f\u0168\3\2\2\2\u016f\u0169\3\2\2\2\u016f"+ - "\u016c\3\2\2\2\u016f\u016d\3\2\2\2\u016f\u016e\3\2\2\2\u0170\67\3\2\2"+ - "\2\u0171\u019f\7*\2\2\u0172\u0173\7-\2\2\u0173\u0174\7\b\2\2\u0174\u0175"+ - "\7d\2\2\u0175\u019f\7\t\2\2\u0176\u017a\7\62\2\2\u0177\u0178\7\b\2\2\u0178"+ - "\u0179\7m\2\2\u0179\u017b\7\t\2\2\u017a\u0177\3\2\2\2\u017a\u017b\3\2"+ - "\2\2\u017b\u019f\3\2\2\2\u017c\u019f\7\65\2\2\u017d\u019f\7\66\2\2\u017e"+ - "\u017f\7\64\2\2\u017f\u0180\7\b\2\2\u0180\u0181\5J&\2\u0181\u0182\7\t"+ - "\2\2\u0182\u019f\3\2\2\2\u0183\u019f\7/\2\2\u0184\u019f\7\60\2\2\u0185"+ - "\u019f\7\67\2\2\u0186\u019f\78\2\2\u0187\u019f\7+\2\2\u0188\u019f\7,\2"+ - "\2\u0189\u019f\7.\2\2\u018a\u019f\79\2\2\u018b\u018f\7\61\2\2\u018c\u018d"+ - "\7\b\2\2\u018d\u018e\7m\2\2\u018e\u0190\7\t\2\2\u018f\u018c\3\2\2\2\u018f"+ - "\u0190\3\2\2\2\u0190\u019f\3\2\2\2\u0191\u0192\7\63\2\2\u0192\u0193\7"+ - "\b\2\2\u0193\u0198\5\66\34\2\u0194\u0195\7\f\2\2\u0195\u0197\5\66\34\2"+ - "\u0196\u0194\3\2\2\2\u0197\u019a\3\2\2\2\u0198\u0196\3\2\2\2\u0198\u0199"+ - "\3\2\2\2\u0199\u019b\3\2\2\2\u019a\u0198\3\2\2\2\u019b\u019c\7\t\2\2\u019c"+ - "\u019f\3\2\2\2\u019d\u019f\7:\2\2\u019e\u0171\3\2\2\2\u019e\u0172\3\2"+ - "\2\2\u019e\u0176\3\2\2\2\u019e\u017c\3\2\2\2\u019e\u017d\3\2\2\2\u019e"+ - "\u017e\3\2\2\2\u019e\u0183\3\2\2\2\u019e\u0184\3\2\2\2\u019e\u0185\3\2"+ - "\2\2\u019e\u0186\3\2\2\2\u019e\u0187\3\2\2\2\u019e\u0188\3\2\2\2\u019e"+ - "\u0189\3\2\2\2\u019e\u018a\3\2\2\2\u019e\u018b\3\2\2\2\u019e\u0191\3\2"+ - "\2\2\u019e\u019d\3\2\2\2\u019f9\3\2\2\2\u01a0\u01a2\5<\37\2\u01a1\u01a0"+ - "\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a1\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4"+ - ";\3\2\2\2\u01a5\u01a6\5\n\6\2\u01a6\u01a7\7\n\2\2\u01a7\u01fb\3\2\2\2"+ - "\u01a8\u01aa\7\4\2\2\u01a9\u01ab\5:\36\2\u01aa\u01a9\3\2\2\2\u01aa\u01ab"+ - "\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01fb\7\5\2\2\u01ad\u01ae\5H%\2\u01ae"+ - "\u01af\7\n\2\2\u01af\u01fb\3\2\2\2\u01b0\u01b1\7;\2\2\u01b1\u01b2\7\b"+ - "\2\2\u01b2\u01b3\5H%\2\u01b3\u01b4\7\t\2\2\u01b4\u01b7\5<\37\2\u01b5\u01b6"+ - "\7<\2\2\u01b6\u01b8\5<\37\2\u01b7\u01b5\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8"+ - "\u01fb\3\2\2\2\u01b9\u01bb\58\35\2\u01ba\u01b9\3\2\2\2\u01bb\u01be\3\2"+ - "\2\2\u01bc\u01ba\3\2\2\2\u01bc\u01bd\3\2\2\2\u01bd\u01bf\3\2\2\2\u01be"+ - "\u01bc\3\2\2\2\u01bf\u01c0\7=\2\2\u01c0\u01c1\7\b\2\2\u01c1\u01c2\5H%"+ - "\2\u01c2\u01c3\7\t\2\2\u01c3\u01c4\5<\37\2\u01c4\u01fb\3\2\2\2\u01c5\u01c7"+ - "\58\35\2\u01c6\u01c5\3\2\2\2\u01c7\u01ca\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c8"+ - "\u01c9\3\2\2\2\u01c9\u01cb\3\2\2\2\u01ca\u01c8\3\2\2\2\u01cb\u01cc\7>"+ - "\2\2\u01cc\u01cd\5<\37\2\u01cd\u01ce\7=\2\2\u01ce\u01cf\7\b\2\2\u01cf"+ - "\u01d0\5H%\2\u01d0\u01d1\7\t\2\2\u01d1\u01d2\7\n\2\2\u01d2\u01fb\3\2\2"+ - "\2\u01d3\u01d5\58\35\2\u01d4\u01d3\3\2\2\2\u01d5\u01d8\3\2\2\2\u01d6\u01d4"+ - "\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d9\3\2\2\2\u01d8\u01d6\3\2\2\2\u01d9"+ - "\u01da\7?\2\2\u01da\u01db\7\b\2\2\u01db\u01dc\5B\"\2\u01dc\u01dd\7\t\2"+ - "\2\u01dd\u01de\5<\37\2\u01de\u01fb\3\2\2\2\u01df\u01e0\7@\2\2\u01e0\u01e1"+ - "\7\b\2\2\u01e1\u01e2\5H%\2\u01e2\u01e3\7\t\2\2\u01e3\u01e4\7\4\2\2\u01e4"+ - "\u01e5\5> \2\u01e5\u01e6\7\5\2\2\u01e6\u01fb\3\2\2\2\u01e7\u01e9\7A\2"+ - "\2\u01e8\u01ea\5H%\2\u01e9\u01e8\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea\u01eb"+ - "\3\2\2\2\u01eb\u01fb\7\n\2\2\u01ec\u01ed\7B\2\2\u01ed\u01fb\7\n\2\2\u01ee"+ - "\u01ef\7C\2\2\u01ef\u01fb\7\n\2\2\u01f0\u01f2\7D\2\2\u01f1\u01f3\5P)\2"+ - "\u01f2\u01f1\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f5"+ - "\7\4\2\2\u01f5\u01f6\5T+\2\u01f6\u01f7\7\u0086\2\2\u01f7\u01fb\3\2\2\2"+ - "\u01f8\u01fb\5N(\2\u01f9\u01fb\7\n\2\2\u01fa\u01a5\3\2\2\2\u01fa\u01a8"+ - "\3\2\2\2\u01fa\u01ad\3\2\2\2\u01fa\u01b0\3\2\2\2\u01fa\u01bc\3\2\2\2\u01fa"+ - "\u01c8\3\2\2\2\u01fa\u01d6\3\2\2\2\u01fa\u01df\3\2\2\2\u01fa\u01e7\3\2"+ - "\2\2\u01fa\u01ec\3\2\2\2\u01fa\u01ee\3\2\2\2\u01fa\u01f0\3\2\2\2\u01fa"+ - "\u01f8\3\2\2\2\u01fa\u01f9\3\2\2\2\u01fb=\3\2\2\2\u01fc\u01fe\5@!\2\u01fd"+ - "\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u01fd\3\2\2\2\u01ff\u0200\3\2"+ - "\2\2\u0200\u0206\3\2\2\2\u0201\u0202\7E\2\2\u0202\u0204\7\13\2\2\u0203"+ - "\u0205\5:\36\2\u0204\u0203\3\2\2\2\u0204\u0205\3\2\2\2\u0205\u0207\3\2"+ - "\2\2\u0206\u0201\3\2\2\2\u0206\u0207\3\2\2\2\u0207?\3\2\2\2\u0208\u0209"+ - "\7F\2\2\u0209\u020a\5J&\2\u020a\u020c\7\13\2\2\u020b\u020d\5:\36\2\u020c"+ - "\u020b\3\2\2\2\u020c\u020d\3\2\2\2\u020dA\3\2\2\2\u020e\u020f\5D#\2\u020f"+ - "\u0211\7\n\2\2\u0210\u0212\5F$\2\u0211\u0210\3\2\2\2\u0211\u0212\3\2\2"+ - "\2\u0212\u0213\3\2\2\2\u0213\u0215\7\n\2\2\u0214\u0216\5H%\2\u0215\u0214"+ - "\3\2\2\2\u0215\u0216\3\2\2\2\u0216\u0227\3\2\2\2\u0217\u021b\5\22\n\2"+ - "\u0218\u021a\5\24\13\2\u0219\u0218\3\2\2\2\u021a\u021d\3\2\2\2\u021b\u0219"+ - "\3\2\2\2\u021b\u021c\3\2\2\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021e"+ - "\u0217\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u0221\7m"+ - "\2\2\u0221\u0222\7\13\2\2\u0222\u0223\5J&\2\u0223\u0224\7\r\2\2\u0224"+ - "\u0225\5J&\2\u0225\u0227\3\2\2\2\u0226\u020e\3\2\2\2\u0226\u021e\3\2\2"+ - "\2\u0227C\3\2\2\2\u0228\u022a\5\n\6\2\u0229\u0228\3\2\2\2\u0229\u022a"+ - "\3\2\2\2\u022a\u022d\3\2\2\2\u022b\u022d\5H%\2\u022c\u0229\3\2\2\2\u022c"+ - "\u022b\3\2\2\2\u022dE\3\2\2\2\u022e\u022f\5H%\2\u022fG\3\2\2\2\u0230\u0231"+ - "\b%\1\2\u0231\u0232\5J&\2\u0232\u0238\3\2\2\2\u0233\u0234\f\3\2\2\u0234"+ - "\u0235\7\f\2\2\u0235\u0237\5J&\2\u0236\u0233\3\2\2\2\u0237\u023a\3\2\2"+ - "\2\u0238\u0236\3\2\2\2\u0238\u0239\3\2\2\2\u0239I\3\2\2\2\u023a\u0238"+ - "\3\2\2\2\u023b\u023c\b&\1\2\u023c\u023d\7\b\2\2\u023d\u023e\5H%\2\u023e"+ - "\u023f\7\t\2\2\u023f\u027d\3\2\2\2\u0240\u0241\7I\2\2\u0241\u0244\7\b"+ - "\2\2\u0242\u0245\5J&\2\u0243\u0245\5\30\r\2\u0244\u0242\3\2\2\2\u0244"+ - "\u0243\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u0247\7\t\2\2\u0247\u027d\3\2"+ - "\2\2\u0248\u0249\7J\2\2\u0249\u024c\7\b\2\2\u024a\u024d\5J&\2\u024b\u024d"+ - "\5\30\r\2\u024c\u024a\3\2\2\2\u024c\u024b\3\2\2\2\u024d\u024e\3\2\2\2"+ - "\u024e\u024f\7\t\2\2\u024f\u027d\3\2\2\2\u0250\u0252\7K\2\2\u0251\u0253"+ - "\7\b\2\2\u0252\u0251\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0254\3\2\2\2\u0254"+ - "\u0256\7m\2\2\u0255\u0257\7\t\2\2\u0256\u0255\3\2\2\2\u0256\u0257\3\2"+ - "\2\2\u0257\u027d\3\2\2\2\u0258\u0259\7\b\2\2\u0259\u025a\5\30\r\2\u025a"+ - "\u025b\7\t\2\2\u025b\u025c\5J&\32\u025c\u027d\3\2\2\2\u025d\u025e\t\2"+ - "\2\2\u025e\u027d\5J&\31\u025f\u0260\7\24\2\2\u0260\u027d\5J&\27\u0261"+ - "\u0262\t\3\2\2\u0262\u027d\5J&\26\u0263\u0264\t\4\2\2\u0264\u027d\5J&"+ - "\22\u0265\u0266\7\4\2\2\u0266\u026b\5J&\2\u0267\u0268\7\f\2\2\u0268\u026a"+ - "\5J&\2\u0269\u0267\3\2\2\2\u026a\u026d\3\2\2\2\u026b\u0269\3\2\2\2\u026b"+ - "\u026c\3\2\2\2\u026c\u026f\3\2\2\2\u026d\u026b\3\2\2\2\u026e\u0270\7\f"+ - "\2\2\u026f\u026e\3\2\2\2\u026f\u0270\3\2\2\2\u0270\u0271\3\2\2\2\u0271"+ - "\u0272\7\5\2\2\u0272\u027d\3\2\2\2\u0273\u027d\7m\2\2\u0274\u027d\7d\2"+ - "\2\u0275\u0277\7n\2\2\u0276\u0275\3\2\2\2\u0277\u0278\3\2\2\2\u0278\u0276"+ - "\3\2\2\2\u0278\u0279\3\2\2\2\u0279\u027d\3\2\2\2\u027a\u027d\7o\2\2\u027b"+ - "\u027d\7U\2\2\u027c\u023b\3\2\2\2\u027c\u0240\3\2\2\2\u027c\u0248\3\2"+ - "\2\2\u027c\u0250\3\2\2\2\u027c\u0258\3\2\2\2\u027c\u025d\3\2\2\2\u027c"+ - "\u025f\3\2\2\2\u027c\u0261\3\2\2\2\u027c\u0263\3\2\2\2\u027c\u0265\3\2"+ - "\2\2\u027c\u0273\3\2\2\2\u027c\u0274\3\2\2\2\u027c\u0276\3\2\2\2\u027c"+ - "\u027a\3\2\2\2\u027c\u027b\3\2\2\2\u027d\u02ba\3\2\2\2\u027e\u027f\f\25"+ - "\2\2\u027f\u0280\t\5\2\2\u0280\u02b9\5J&\26\u0281\u0282\f\24\2\2\u0282"+ - "\u0283\t\6\2\2\u0283\u02b9\5J&\25\u0284\u0285\f\23\2\2\u0285\u0286\t\7"+ - "\2\2\u0286\u02b9\5J&\24\u0287\u0288\f\21\2\2\u0288\u0289\t\b\2\2\u0289"+ - "\u02b9\5J&\22\u028a\u028b\f\20\2\2\u028b\u028c\7\31\2\2\u028c\u02b9\5"+ - "J&\21\u028d\u028e\f\17\2\2\u028e\u028f\7\33\2\2\u028f\u02b9\5J&\20\u0290"+ - "\u0291\f\16\2\2\u0291\u0292\7\34\2\2\u0292\u02b9\5J&\17\u0293\u0294\f"+ - "\r\2\2\u0294\u0295\7%\2\2\u0295\u02b9\5J&\16\u0296\u0297\f\f\2\2\u0297"+ - "\u0298\7&\2\2\u0298\u02b9\5J&\r\u0299\u029a\f\13\2\2\u029a\u029b\7\17"+ - "\2\2\u029b\u029c\5J&\2\u029c\u029d\7\13\2\2\u029d\u029e\5J&\f\u029e\u02b9"+ - "\3\2\2\2\u029f\u02a0\f\n\2\2\u02a0\u02a1\7\'\2\2\u02a1\u02b9\5J&\n\u02a2"+ - "\u02a3\f\t\2\2\u02a3\u02a4\7(\2\2\u02a4\u02b9\5J&\t\u02a5\u02a6\f!\2\2"+ - "\u02a6\u02a7\7\20\2\2\u02a7\u02b9\7m\2\2\u02a8\u02a9\f \2\2\u02a9\u02aa"+ - "\7\21\2\2\u02aa\u02b9\7m\2\2\u02ab\u02ac\f\37\2\2\u02ac\u02ae\7\b\2\2"+ - "\u02ad\u02af\5L\'\2\u02ae\u02ad\3\2\2\2\u02ae\u02af\3\2\2\2\u02af\u02b0"+ - "\3\2\2\2\u02b0\u02b9\7\t\2\2\u02b1\u02b2\f\33\2\2\u02b2\u02b3\7\6\2\2"+ - "\u02b3\u02b4\5H%\2\u02b4\u02b5\7\7\2\2\u02b5\u02b9\3\2\2\2\u02b6\u02b7"+ - "\f\30\2\2\u02b7\u02b9\t\2\2\2\u02b8\u027e\3\2\2\2\u02b8\u0281\3\2\2\2"+ - "\u02b8\u0284\3\2\2\2\u02b8\u0287\3\2\2\2\u02b8\u028a\3\2\2\2\u02b8\u028d"+ - "\3\2\2\2\u02b8\u0290\3\2\2\2\u02b8\u0293\3\2\2\2\u02b8\u0296\3\2\2\2\u02b8"+ - "\u0299\3\2\2\2\u02b8\u029f\3\2\2\2\u02b8\u02a2\3\2\2\2\u02b8\u02a5\3\2"+ - "\2\2\u02b8\u02a8\3\2\2\2\u02b8\u02ab\3\2\2\2\u02b8\u02b1\3\2\2\2\u02b8"+ - "\u02b6\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02b8\3\2\2\2\u02ba\u02bb\3\2"+ - "\2\2\u02bbK\3\2\2\2\u02bc\u02ba\3\2\2\2\u02bd\u02c2\5J&\2\u02be\u02bf"+ - "\7\f\2\2\u02bf\u02c1\5J&\2\u02c0\u02be\3\2\2\2\u02c1\u02c4\3\2\2\2\u02c2"+ - "\u02c0\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3M\3\2\2\2\u02c4\u02c2\3\2\2\2"+ - "\u02c5\u02c7\7L\2\2\u02c6\u02c8\5P)\2\u02c7\u02c6\3\2\2\2\u02c7\u02c8"+ - "\3\2\2\2\u02c8\u02c9\3\2\2\2\u02c9\u02ca\7V\2\2\u02caO\3\2\2\2\u02cb\u02cc"+ - "\7\b\2\2\u02cc\u02d1\5R*\2\u02cd\u02ce\7\f\2\2\u02ce\u02d0\5R*\2\u02cf"+ - "\u02cd\3\2\2\2\u02d0\u02d3\3\2\2\2\u02d1\u02cf\3\2\2\2\u02d1\u02d2\3\2"+ - "\2\2\u02d2\u02d4\3\2\2\2\u02d3\u02d1\3\2\2\2\u02d4\u02d5\7\t\2\2\u02d5"+ - "Q\3\2\2\2\u02d6\u02d7\7M\2\2\u02d7\u02e1\7n\2\2\u02d8\u02d9\7N\2\2\u02d9"+ - "\u02e1\7m\2\2\u02da\u02db\7O\2\2\u02db\u02e1\7n\2\2\u02dc\u02dd\7P\2\2"+ - "\u02dd\u02e1\5J&\2\u02de\u02df\7Q\2\2\u02df\u02e1\5J&\2\u02e0\u02d6\3"+ - "\2\2\2\u02e0\u02d8\3\2\2\2\u02e0\u02da\3\2\2\2\u02e0\u02dc\3\2\2\2\u02e0"+ - "\u02de\3\2\2\2\u02e1S\3\2\2\2\u02e2\u02e4\5V,\2\u02e3\u02e2\3\2\2\2\u02e4"+ - "\u02e7\3\2\2\2\u02e5\u02e3\3\2\2\2\u02e5\u02e6\3\2\2\2\u02e6U\3\2\2\2"+ - "\u02e7\u02e5\3\2\2\2\u02e8\u02ec\5X-\2\u02e9\u02ec\5Z.\2\u02ea\u02ec\5"+ - "\\/\2\u02eb\u02e8\3\2\2\2\u02eb\u02e9\3\2\2\2\u02eb\u02ea\3\2\2\2\u02ec"+ - "W\3\2\2\2\u02ed\u02ee\7\u0093\2\2\u02ee\u02f2\7v\2\2\u02ef\u02f1\7\u0094"+ - "\2\2\u02f0\u02ef\3\2\2\2\u02f1\u02f4\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f2"+ - "\u02f3\3\2\2\2\u02f3\u02fe\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f5\u02f6\7\u0092"+ - "\2\2\u02f6\u02fa\7v\2\2\u02f7\u02f9\7\u0094\2\2\u02f8\u02f7\3\2\2\2\u02f9"+ - "\u02fc\3\2\2\2\u02fa\u02f8\3\2\2\2\u02fa\u02fb\3\2\2\2\u02fb\u02fe\3\2"+ - "\2\2\u02fc\u02fa\3\2\2\2\u02fd\u02ed\3\2\2\2\u02fd\u02f5\3\2\2\2\u02fe"+ - "Y\3\2\2\2\u02ff\u0301\7t\2\2\u0300\u0302\5^\60\2\u0301\u0300\3\2\2\2\u0301"+ - "\u0302\3\2\2\2\u0302\u0306\3\2\2\2\u0303\u0305\7\u0094\2\2\u0304\u0303"+ - "\3\2\2\2\u0305\u0308\3\2\2\2\u0306\u0304\3\2\2\2\u0306\u0307\3\2\2\2\u0307"+ - "[\3\2\2\2\u0308\u0306\3\2\2\2\u0309\u030a\7s\2\2\u030a\u030f\5`\61\2\u030b"+ - "\u030c\7w\2\2\u030c\u030e\5`\61\2\u030d\u030b\3\2\2\2\u030e\u0311\3\2"+ - "\2\2\u030f\u030d\3\2\2\2\u030f\u0310\3\2\2\2\u0310\u0315\3\2\2\2\u0311"+ - "\u030f\3\2\2\2\u0312\u0314\7\u0094\2\2\u0313\u0312\3\2\2\2\u0314\u0317"+ - "\3\2\2\2\u0315\u0313\3\2\2\2\u0315\u0316\3\2\2\2\u0316]\3\2\2\2\u0317"+ - "\u0315\3\2\2\2\u0318\u0346\5`\61\2\u0319\u031a\7u\2\2\u031a\u0346\5`\61"+ - "\2\u031b\u031c\5`\61\2\u031c\u031d\7w\2\2\u031d\u031e\5`\61\2\u031e\u0346"+ - "\3\2\2\2\u031f\u0320\7x\2\2\u0320\u0321\5`\61\2\u0321\u0322\7y\2\2\u0322"+ - "\u0323\7w\2\2\u0323\u0324\7\u0093\2\2\u0324\u0346\3\2\2\2\u0325\u0326"+ - "\7x\2\2\u0326\u0327\7x\2\2\u0327\u0328\5`\61\2\u0328\u0329\7y\2\2\u0329"+ - "\u032a\7y\2\2\u032a\u032b\7w\2\2\u032b\u032c\7\u0093\2\2\u032c\u0346\3"+ - "\2\2\2\u032d\u032e\7x\2\2\u032e\u032f\5`\61\2\u032f\u0330\7w\2\2\u0330"+ - "\u0331\7\u0093\2\2\u0331\u0332\7y\2\2\u0332\u0333\7w\2\2\u0333\u0334\7"+ - "\u0093\2\2\u0334\u0346\3\2\2\2\u0335\u0336\7x\2\2\u0336\u0337\5`\61\2"+ - "\u0337\u0338\7w\2\2\u0338\u0339\7\u0093\2\2\u0339\u033a\7y\2\2\u033a\u0346"+ - "\3\2\2\2\u033b\u033c\7x\2\2\u033c\u033d\5`\61\2\u033d\u033e\7y\2\2\u033e"+ - "\u0346\3\2\2\2\u033f\u0340\7x\2\2\u0340\u0341\7x\2\2\u0341\u0342\5`\61"+ - "\2\u0342\u0343\7y\2\2\u0343\u0344\7y\2\2\u0344\u0346\3\2\2\2\u0345\u0318"+ - "\3\2\2\2\u0345\u0319\3\2\2\2\u0345\u031b\3\2\2\2\u0345\u031f\3\2\2\2\u0345"+ - "\u0325\3\2\2\2\u0345\u032d\3\2\2\2\u0345\u0335\3\2\2\2\u0345\u033b\3\2"+ - "\2\2\u0345\u033f\3\2\2\2\u0346_\3\2\2\2\u0347\u0348\b\61\1\2\u0348\u0349"+ - "\7z\2\2\u0349\u034a\5`\61\2\u034a\u034b\7{\2\2\u034b\u0356\3\2\2\2\u034c"+ - "\u034d\t\t\2\2\u034d\u0356\5`\61\n\u034e\u0356\7\u0093\2\2\u034f\u0356"+ - "\7\u0091\2\2\u0350\u0351\7\u0085\2\2\u0351\u0352\7\u0093\2\2\u0352\u0356"+ - "\7\u0086\2\2\u0353\u0356\7\u0087\2\2\u0354\u0356\7\u0090\2\2\u0355\u0347"+ - "\3\2\2\2\u0355\u034c\3\2\2\2\u0355\u034e\3\2\2\2\u0355\u034f\3\2\2\2\u0355"+ - "\u0350\3\2\2\2\u0355\u0353\3\2\2\2\u0355\u0354\3\2\2\2\u0356\u0365\3\2"+ - "\2\2\u0357\u0358\f\f\2\2\u0358\u0359\7|\2\2\u0359\u0364\5`\61\r\u035a"+ - "\u035b\f\13\2\2\u035b\u035c\t\n\2\2\u035c\u0364\5`\61\f\u035d\u035e\f"+ - "\t\2\2\u035e\u035f\t\13\2\2\u035f\u0364\5`\61\n\u0360\u0361\f\b\2\2\u0361"+ - "\u0362\t\f\2\2\u0362\u0364\5`\61\t\u0363\u0357\3\2\2\2\u0363\u035a\3\2"+ - "\2\2\u0363\u035d\3\2\2\2\u0363\u0360\3\2\2\2\u0364\u0367\3\2\2\2\u0365"+ - "\u0363\3\2\2\2\u0365\u0366\3\2\2\2\u0366a\3\2\2\2\u0367\u0365\3\2\2\2"+ - "Zk|\u0089\u008f\u0095\u009c\u00a3\u00ab\u00b2\u00b9\u00be\u00ca\u00cd"+ + "\"\3\"\5\"\u0212\n\"\3\"\3\"\5\"\u0216\n\"\3\"\3\"\3\"\3\"\3\"\3\"\3\""+ + "\5\"\u021f\n\"\3#\5#\u0222\n#\3#\5#\u0225\n#\3$\3$\3%\3%\3%\3%\3%\3%\7"+ + "%\u022f\n%\f%\16%\u0232\13%\3&\3&\3&\3&\3&\3&\3&\3&\3&\5&\u023d\n&\3&"+ + "\3&\3&\3&\3&\3&\5&\u0245\n&\3&\3&\3&\3&\5&\u024b\n&\3&\3&\5&\u024f\n&"+ + "\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\7&\u0262\n&\f&\16"+ + "&\u0265\13&\3&\5&\u0268\n&\3&\3&\3&\3&\3&\6&\u026f\n&\r&\16&\u0270\3&"+ + "\3&\5&\u0275\n&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&"+ + "\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&"+ + "\3&\3&\3&\3&\3&\3&\3&\5&\u02a7\n&\3&\3&\3&\3&\3&\3&\3&\3&\7&\u02b1\n&"+ + "\f&\16&\u02b4\13&\3\'\3\'\3\'\7\'\u02b9\n\'\f\'\16\'\u02bc\13\'\3(\3("+ + "\5(\u02c0\n(\3(\3(\3)\3)\3)\3)\7)\u02c8\n)\f)\16)\u02cb\13)\3)\3)\3*\3"+ + "*\3*\3*\3*\3*\3*\3*\3*\3*\5*\u02d9\n*\3+\7+\u02dc\n+\f+\16+\u02df\13+"+ + "\3,\3,\3,\5,\u02e4\n,\3-\3-\3-\7-\u02e9\n-\f-\16-\u02ec\13-\3-\3-\3-\7"+ + "-\u02f1\n-\f-\16-\u02f4\13-\5-\u02f6\n-\3.\3.\5.\u02fa\n.\3.\7.\u02fd"+ + "\n.\f.\16.\u0300\13.\3/\3/\3/\3/\7/\u0306\n/\f/\16/\u0309\13/\3/\7/\u030c"+ + "\n/\f/\16/\u030f\13/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60"+ + "\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60"+ + "\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60"+ + "\3\60\3\60\3\60\3\60\3\60\3\60\3\60\5\60\u033e\n\60\3\61\3\61\3\61\3\61"+ + "\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u034e\n\61\3\61"+ + "\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\7\61\u035c\n\61"+ + "\f\61\16\61\u035f\13\61\3\61\2\n\f\30\32\34(HJ`\62\2\4\6\b\n\f\16\20\22"+ + "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`\2\r\3\2"+ + "\27\30\5\2\22\23\31\32RR\4\2!!$$\3\2\35\36\3\2\24\26\3\2\22\23\3\2\37"+ + "$\3\2\177\u0082\3\2}~\3\2\u0083\u0084\3\2\177\u0080\2\u03dd\2b\3\2\2\2"+ + "\4e\3\2\2\2\6k\3\2\2\2\b|\3\2\2\2\n~\3\2\2\2\f\u0081\3\2\2\2\16\u0095"+ + "\3\2\2\2\20\u0097\3\2\2\2\22\u00ab\3\2\2\2\24\u00b5\3\2\2\2\26\u00bc\3"+ + "\2\2\2\30\u00c2\3\2\2\2\32\u00e0\3\2\2\2\34\u00f8\3\2\2\2\36\u0102\3\2"+ + "\2\2 \u0105\3\2\2\2\"\u0111\3\2\2\2$\u0114\3\2\2\2&\u0117\3\2\2\2(\u011f"+ + "\3\2\2\2*\u012a\3\2\2\2,\u012f\3\2\2\2.\u0140\3\2\2\2\60\u0146\3\2\2\2"+ + "\62\u0159\3\2\2\2\64\u015b\3\2\2\2\66\u016f\3\2\2\28\u019e\3\2\2\2:\u01a1"+ + "\3\2\2\2<\u01fa\3\2\2\2>\u01fd\3\2\2\2@\u0208\3\2\2\2B\u021e\3\2\2\2D"+ + "\u0224\3\2\2\2F\u0226\3\2\2\2H\u0228\3\2\2\2J\u0274\3\2\2\2L\u02b5\3\2"+ + "\2\2N\u02bd\3\2\2\2P\u02c3\3\2\2\2R\u02d8\3\2\2\2T\u02dd\3\2\2\2V\u02e3"+ + "\3\2\2\2X\u02f5\3\2\2\2Z\u02f7\3\2\2\2\\\u0301\3\2\2\2^\u033d\3\2\2\2"+ + "`\u034d\3\2\2\2bc\5\6\4\2cd\7\2\2\3d\3\3\2\2\2ef\5T+\2fg\7\2\2\3g\5\3"+ + "\2\2\2hj\5\b\5\2ih\3\2\2\2jm\3\2\2\2ki\3\2\2\2kl\3\2\2\2l\7\3\2\2\2mk"+ + "\3\2\2\2no\5\n\6\2op\7\n\2\2p}\3\2\2\2q}\5,\27\2rs\5 \21\2st\7\n\2\2t"+ + "}\3\2\2\2uv\5&\24\2vw\7\n\2\2w}\3\2\2\2x}\5\64\33\2yz\5\20\t\2z{\7\n\2"+ + "\2{}\3\2\2\2|n\3\2\2\2|q\3\2\2\2|r\3\2\2\2|u\3\2\2\2|x\3\2\2\2|y\3\2\2"+ + "\2}\t\3\2\2\2~\177\5\22\n\2\177\u0080\5\f\7\2\u0080\13\3\2\2\2\u0081\u0082"+ + "\b\7\1\2\u0082\u0083\5\16\b\2\u0083\u0089\3\2\2\2\u0084\u0085\f\3\2\2"+ + "\u0085\u0086\7\f\2\2\u0086\u0088\5\16\b\2\u0087\u0084\3\2\2\2\u0088\u008b"+ + "\3\2\2\2\u0089\u0087\3\2\2\2\u0089\u008a\3\2\2\2\u008a\r\3\2\2\2\u008b"+ + "\u0089\3\2\2\2\u008c\u008f\5\32\16\2\u008d\u008e\7\'\2\2\u008e\u0090\5"+ + "J&\2\u008f\u008d\3\2\2\2\u008f\u0090\3\2\2\2\u0090\u0096\3\2\2\2\u0091"+ + "\u0092\5\32\16\2\u0092\u0093\7\'\2\2\u0093\u0094\5N(\2\u0094\u0096\3\2"+ + "\2\2\u0095\u008c\3\2\2\2\u0095\u0091\3\2\2\2\u0096\17\3\2\2\2\u0097\u0098"+ + "\7)\2\2\u0098\u009c\5\22\n\2\u0099\u009b\5\24\13\2\u009a\u0099\3\2\2\2"+ + "\u009b\u009e\3\2\2\2\u009c\u009a\3\2\2\2\u009c\u009d\3\2\2\2\u009d\u009f"+ + "\3\2\2\2\u009e\u009c\3\2\2\2\u009f\u00a3\7m\2\2\u00a0\u00a2\5\26\f\2\u00a1"+ + "\u00a0\3\2\2\2\u00a2\u00a5\3\2\2\2\u00a3\u00a1\3\2\2\2\u00a3\u00a4\3\2"+ + "\2\2\u00a4\u00a6\3\2\2\2\u00a5\u00a3\3\2\2\2\u00a6\u00a7\b\t\1\2\u00a7"+ + "\21\3\2\2\2\u00a8\u00aa\58\35\2\u00a9\u00a8\3\2\2\2\u00aa\u00ad\3\2\2"+ + "\2\u00ab\u00a9\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\u00ae\3\2\2\2\u00ad\u00ab"+ + "\3\2\2\2\u00ae\u00b2\5\34\17\2\u00af\u00b1\58\35\2\u00b0\u00af\3\2\2\2"+ + "\u00b1\u00b4\3\2\2\2\u00b2\u00b0\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\23"+ + "\3\2\2\2\u00b4\u00b2\3\2\2\2\u00b5\u00b9\7\24\2\2\u00b6\u00b8\58\35\2"+ + "\u00b7\u00b6\3\2\2\2\u00b8\u00bb\3\2\2\2\u00b9\u00b7\3\2\2\2\u00b9\u00ba"+ + "\3\2\2\2\u00ba\25\3\2\2\2\u00bb\u00b9\3\2\2\2\u00bc\u00be\7\6\2\2\u00bd"+ + "\u00bf\5J&\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf\u00c0\3\2\2"+ + "\2\u00c0\u00c1\7\7\2\2\u00c1\27\3\2\2\2\u00c2\u00c3\b\r\1\2\u00c3\u00c4"+ + "\5\34\17\2\u00c4\u00cf\3\2\2\2\u00c5\u00c6\f\4\2\2\u00c6\u00ce\7\24\2"+ + "\2\u00c7\u00c8\f\3\2\2\u00c8\u00ca\7\6\2\2\u00c9\u00cb\5J&\2\u00ca\u00c9"+ + "\3\2\2\2\u00ca\u00cb\3\2\2\2\u00cb\u00cc\3\2\2\2\u00cc\u00ce\7\7\2\2\u00cd"+ + "\u00c5\3\2\2\2\u00cd\u00c7\3\2\2\2\u00ce\u00d1\3\2\2\2\u00cf\u00cd\3\2"+ + "\2\2\u00cf\u00d0\3\2\2\2\u00d0\31\3\2\2\2\u00d1\u00cf\3\2\2\2\u00d2\u00d3"+ + "\b\16\1\2\u00d3\u00e1\7m\2\2\u00d4\u00d8\7\24\2\2\u00d5\u00d7\58\35\2"+ + "\u00d6\u00d5\3\2\2\2\u00d7\u00da\3\2\2\2\u00d8\u00d6\3\2\2\2\u00d8\u00d9"+ + "\3\2\2\2\u00d9\u00db\3\2\2\2\u00da\u00d8\3\2\2\2\u00db\u00e1\5\32\16\4"+ + "\u00dc\u00dd\7\b\2\2\u00dd\u00de\5\32\16\2\u00de\u00df\7\t\2\2\u00df\u00e1"+ + "\3\2\2\2\u00e0\u00d2\3\2\2\2\u00e0\u00d4\3\2\2\2\u00e0\u00dc\3\2\2\2\u00e1"+ + "\u00ea\3\2\2\2\u00e2\u00e3\f\5\2\2\u00e3\u00e5\7\6\2\2\u00e4\u00e6\5J"+ + "&\2\u00e5\u00e4\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6\u00e7\3\2\2\2\u00e7"+ + "\u00e9\7\7\2\2\u00e8\u00e2\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2"+ + "\2\2\u00ea\u00eb\3\2\2\2\u00eb\33\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee"+ + "\b\17\1\2\u00ee\u00f9\7T\2\2\u00ef\u00f1\7S\2\2\u00f0\u00f2\7T\2\2\u00f1"+ + "\u00f0\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2\u00f9\3\2\2\2\u00f3\u00f9\5 "+ + "\21\2\u00f4\u00f9\5\36\20\2\u00f5\u00f9\5&\24\2\u00f6\u00f9\5$\23\2\u00f7"+ + "\u00f9\7\3\2\2\u00f8\u00ed\3\2\2\2\u00f8\u00ef\3\2\2\2\u00f8\u00f3\3\2"+ + "\2\2\u00f8\u00f4\3\2\2\2\u00f8\u00f5\3\2\2\2\u00f8\u00f6\3\2\2\2\u00f8"+ + "\u00f7\3\2\2\2\u00f9\u00ff\3\2\2\2\u00fa\u00fb\f\b\2\2\u00fb\u00fc\7\b"+ + "\2\2\u00fc\u00fe\7\t\2\2\u00fd\u00fa\3\2\2\2\u00fe\u0101\3\2\2\2\u00ff"+ + "\u00fd\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\35\3\2\2\2\u0101\u00ff\3\2\2"+ + "\2\u0102\u0103\7G\2\2\u0103\u0104\7m\2\2\u0104\37\3\2\2\2\u0105\u0107"+ + "\7G\2\2\u0106\u0108\7m\2\2\u0107\u0106\3\2\2\2\u0107\u0108\3\2\2\2\u0108"+ + "\u0109\3\2\2\2\u0109\u010b\7\4\2\2\u010a\u010c\5\"\22\2\u010b\u010a\3"+ + "\2\2\2\u010c\u010d\3\2\2\2\u010d\u010b\3\2\2\2\u010d\u010e\3\2\2\2\u010e"+ + "\u010f\3\2\2\2\u010f\u0110\7\5\2\2\u0110!\3\2\2\2\u0111\u0112\5\n\6\2"+ + "\u0112\u0113\7\n\2\2\u0113#\3\2\2\2\u0114\u0115\7H\2\2\u0115\u0116\7m"+ + "\2\2\u0116%\3\2\2\2\u0117\u0119\7H\2\2\u0118\u011a\7m\2\2\u0119\u0118"+ + "\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011b\3\2\2\2\u011b\u011c\7\4\2\2\u011c"+ + "\u011d\5(\25\2\u011d\u011e\7\5\2\2\u011e\'\3\2\2\2\u011f\u0120\b\25\1"+ + "\2\u0120\u0121\5*\26\2\u0121\u0127\3\2\2\2\u0122\u0123\f\3\2\2\u0123\u0124"+ + "\7\f\2\2\u0124\u0126\5*\26\2\u0125\u0122\3\2\2\2\u0126\u0129\3\2\2\2\u0127"+ + "\u0125\3\2\2\2\u0127\u0128\3\2\2\2\u0128)\3\2\2\2\u0129\u0127\3\2\2\2"+ + "\u012a\u012d\7m\2\2\u012b\u012c\7\'\2\2\u012c\u012e\5J&\2\u012d\u012b"+ + "\3\2\2\2\u012d\u012e\3\2\2\2\u012e+\3\2\2\2\u012f\u0133\5\22\n\2\u0130"+ + "\u0132\5\24\13\2\u0131\u0130\3\2\2\2\u0132\u0135\3\2\2\2\u0133\u0131\3"+ + "\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136\3\2\2\2\u0135\u0133\3\2\2\2\u0136"+ + "\u0137\7m\2\2\u0137\u0139\7\b\2\2\u0138\u013a\5\60\31\2\u0139\u0138\3"+ + "\2\2\2\u0139\u013a\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u013e\7\t\2\2\u013c"+ + "\u013f\5.\30\2\u013d\u013f\7\n\2\2\u013e\u013c\3\2\2\2\u013e\u013d\3\2"+ + "\2\2\u013f-\3\2\2\2\u0140\u0142\7\4\2\2\u0141\u0143\5:\36\2\u0142\u0141"+ + "\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0144\3\2\2\2\u0144\u0145\7\5\2\2\u0145"+ + "/\3\2\2\2\u0146\u014b\5\62\32\2\u0147\u0148\7\f\2\2\u0148\u014a\5\62\32"+ + "\2\u0149\u0147\3\2\2\2\u014a\u014d\3\2\2\2\u014b\u0149\3\2\2\2\u014b\u014c"+ + "\3\2\2\2\u014c\61\3\2\2\2\u014d\u014b\3\2\2\2\u014e\u0152\5\22\n\2\u014f"+ + "\u0151\5\24\13\2\u0150\u014f\3\2\2\2\u0151\u0154\3\2\2\2\u0152\u0150\3"+ + "\2\2\2\u0152\u0153\3\2\2\2\u0153\u0155\3\2\2\2\u0154\u0152\3\2\2\2\u0155"+ + "\u0156\7m\2\2\u0156\u015a\3\2\2\2\u0157\u015a\7T\2\2\u0158\u015a\7\16"+ + "\2\2\u0159\u014e\3\2\2\2\u0159\u0157\3\2\2\2\u0159\u0158\3\2\2\2\u015a"+ + "\63\3\2\2\2\u015b\u015c\7Y\2\2\u015c\u015d\7m\2\2\u015d\u015e\7\b\2\2"+ + "\u015e\u0163\5\66\34\2\u015f\u0160\7\f\2\2\u0160\u0162\5\66\34\2\u0161"+ + "\u015f\3\2\2\2\u0162\u0165\3\2\2\2\u0163\u0161\3\2\2\2\u0163\u0164\3\2"+ + "\2\2\u0164\u0166\3\2\2\2\u0165\u0163\3\2\2\2\u0166\u0167\7\t\2\2\u0167"+ + "\65\3\2\2\2\u0168\u0170\7d\2\2\u0169\u016a\7d\2\2\u016a\u016b\7\r\2\2"+ + "\u016b\u0170\7d\2\2\u016c\u0170\7m\2\2\u016d\u0170\7n\2\2\u016e\u0170"+ + "\7:\2\2\u016f\u0168\3\2\2\2\u016f\u0169\3\2\2\2\u016f\u016c\3\2\2\2\u016f"+ + "\u016d\3\2\2\2\u016f\u016e\3\2\2\2\u0170\67\3\2\2\2\u0171\u019f\7*\2\2"+ + "\u0172\u0173\7-\2\2\u0173\u0174\7\b\2\2\u0174\u0175\7d\2\2\u0175\u019f"+ + "\7\t\2\2\u0176\u017a\7\62\2\2\u0177\u0178\7\b\2\2\u0178\u0179\7m\2\2\u0179"+ + "\u017b\7\t\2\2\u017a\u0177\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u019f\3\2"+ + "\2\2\u017c\u019f\7\65\2\2\u017d\u019f\7\66\2\2\u017e\u017f\7\64\2\2\u017f"+ + "\u0180\7\b\2\2\u0180\u0181\5J&\2\u0181\u0182\7\t\2\2\u0182\u019f\3\2\2"+ + "\2\u0183\u019f\7/\2\2\u0184\u019f\7\60\2\2\u0185\u019f\7\67\2\2\u0186"+ + "\u019f\78\2\2\u0187\u019f\7+\2\2\u0188\u019f\7,\2\2\u0189\u019f\7.\2\2"+ + "\u018a\u019f\79\2\2\u018b\u018f\7\61\2\2\u018c\u018d\7\b\2\2\u018d\u018e"+ + "\7m\2\2\u018e\u0190\7\t\2\2\u018f\u018c\3\2\2\2\u018f\u0190\3\2\2\2\u0190"+ + "\u019f\3\2\2\2\u0191\u0192\7\63\2\2\u0192\u0193\7\b\2\2\u0193\u0198\5"+ + "\66\34\2\u0194\u0195\7\f\2\2\u0195\u0197\5\66\34\2\u0196\u0194\3\2\2\2"+ + "\u0197\u019a\3\2\2\2\u0198\u0196\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019b"+ + "\3\2\2\2\u019a\u0198\3\2\2\2\u019b\u019c\7\t\2\2\u019c\u019f\3\2\2\2\u019d"+ + "\u019f\7:\2\2\u019e\u0171\3\2\2\2\u019e\u0172\3\2\2\2\u019e\u0176\3\2"+ + "\2\2\u019e\u017c\3\2\2\2\u019e\u017d\3\2\2\2\u019e\u017e\3\2\2\2\u019e"+ + "\u0183\3\2\2\2\u019e\u0184\3\2\2\2\u019e\u0185\3\2\2\2\u019e\u0186\3\2"+ + "\2\2\u019e\u0187\3\2\2\2\u019e\u0188\3\2\2\2\u019e\u0189\3\2\2\2\u019e"+ + "\u018a\3\2\2\2\u019e\u018b\3\2\2\2\u019e\u0191\3\2\2\2\u019e\u019d\3\2"+ + "\2\2\u019f9\3\2\2\2\u01a0\u01a2\5<\37\2\u01a1\u01a0\3\2\2\2\u01a2\u01a3"+ + "\3\2\2\2\u01a3\u01a1\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4;\3\2\2\2\u01a5"+ + "\u01a6\5\n\6\2\u01a6\u01a7\7\n\2\2\u01a7\u01fb\3\2\2\2\u01a8\u01aa\7\4"+ + "\2\2\u01a9\u01ab\5:\36\2\u01aa\u01a9\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab"+ + "\u01ac\3\2\2\2\u01ac\u01fb\7\5\2\2\u01ad\u01ae\5H%\2\u01ae\u01af\7\n\2"+ + "\2\u01af\u01fb\3\2\2\2\u01b0\u01b1\7;\2\2\u01b1\u01b2\7\b\2\2\u01b2\u01b3"+ + "\5H%\2\u01b3\u01b4\7\t\2\2\u01b4\u01b7\5<\37\2\u01b5\u01b6\7<\2\2\u01b6"+ + "\u01b8\5<\37\2\u01b7\u01b5\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8\u01fb\3\2"+ + "\2\2\u01b9\u01bb\58\35\2\u01ba\u01b9\3\2\2\2\u01bb\u01be\3\2\2\2\u01bc"+ + "\u01ba\3\2\2\2\u01bc\u01bd\3\2\2\2\u01bd\u01bf\3\2\2\2\u01be\u01bc\3\2"+ + "\2\2\u01bf\u01c0\7=\2\2\u01c0\u01c1\7\b\2\2\u01c1\u01c2\5H%\2\u01c2\u01c3"+ + "\7\t\2\2\u01c3\u01c4\5<\37\2\u01c4\u01fb\3\2\2\2\u01c5\u01c7\58\35\2\u01c6"+ + "\u01c5\3\2\2\2\u01c7\u01ca\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c8\u01c9\3\2"+ + "\2\2\u01c9\u01cb\3\2\2\2\u01ca\u01c8\3\2\2\2\u01cb\u01cc\7>\2\2\u01cc"+ + "\u01cd\5<\37\2\u01cd\u01ce\7=\2\2\u01ce\u01cf\7\b\2\2\u01cf\u01d0\5H%"+ + "\2\u01d0\u01d1\7\t\2\2\u01d1\u01d2\7\n\2\2\u01d2\u01fb\3\2\2\2\u01d3\u01d5"+ + "\58\35\2\u01d4\u01d3\3\2\2\2\u01d5\u01d8\3\2\2\2\u01d6\u01d4\3\2\2\2\u01d6"+ + "\u01d7\3\2\2\2\u01d7\u01d9\3\2\2\2\u01d8\u01d6\3\2\2\2\u01d9\u01da\7?"+ + "\2\2\u01da\u01db\7\b\2\2\u01db\u01dc\5B\"\2\u01dc\u01dd\7\t\2\2\u01dd"+ + "\u01de\5<\37\2\u01de\u01fb\3\2\2\2\u01df\u01e0\7@\2\2\u01e0\u01e1\7\b"+ + "\2\2\u01e1\u01e2\5H%\2\u01e2\u01e3\7\t\2\2\u01e3\u01e4\7\4\2\2\u01e4\u01e5"+ + "\5> \2\u01e5\u01e6\7\5\2\2\u01e6\u01fb\3\2\2\2\u01e7\u01e9\7A\2\2\u01e8"+ + "\u01ea\5H%\2\u01e9\u01e8\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea\u01eb\3\2\2"+ + "\2\u01eb\u01fb\7\n\2\2\u01ec\u01ed\7B\2\2\u01ed\u01fb\7\n\2\2\u01ee\u01ef"+ + "\7C\2\2\u01ef\u01fb\7\n\2\2\u01f0\u01f2\7D\2\2\u01f1\u01f3\5P)\2\u01f2"+ + "\u01f1\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f5\7\4"+ + "\2\2\u01f5\u01f6\5T+\2\u01f6\u01f7\7\u0086\2\2\u01f7\u01fb\3\2\2\2\u01f8"+ + "\u01fb\5N(\2\u01f9\u01fb\7\n\2\2\u01fa\u01a5\3\2\2\2\u01fa\u01a8\3\2\2"+ + "\2\u01fa\u01ad\3\2\2\2\u01fa\u01b0\3\2\2\2\u01fa\u01bc\3\2\2\2\u01fa\u01c8"+ + "\3\2\2\2\u01fa\u01d6\3\2\2\2\u01fa\u01df\3\2\2\2\u01fa\u01e7\3\2\2\2\u01fa"+ + "\u01ec\3\2\2\2\u01fa\u01ee\3\2\2\2\u01fa\u01f0\3\2\2\2\u01fa\u01f8\3\2"+ + "\2\2\u01fa\u01f9\3\2\2\2\u01fb=\3\2\2\2\u01fc\u01fe\5@!\2\u01fd\u01fc"+ + "\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u01fd\3\2\2\2\u01ff\u0200\3\2\2\2\u0200"+ + "\u0206\3\2\2\2\u0201\u0202\7E\2\2\u0202\u0204\7\13\2\2\u0203\u0205\5:"+ + "\36\2\u0204\u0203\3\2\2\2\u0204\u0205\3\2\2\2\u0205\u0207\3\2\2\2\u0206"+ + "\u0201\3\2\2\2\u0206\u0207\3\2\2\2\u0207?\3\2\2\2\u0208\u0209\7F\2\2\u0209"+ + "\u020a\5J&\2\u020a\u020c\7\13\2\2\u020b\u020d\5:\36\2\u020c\u020b\3\2"+ + "\2\2\u020c\u020d\3\2\2\2\u020dA\3\2\2\2\u020e\u020f\5D#\2\u020f\u0211"+ + "\7\n\2\2\u0210\u0212\5F$\2\u0211\u0210\3\2\2\2\u0211\u0212\3\2\2\2\u0212"+ + "\u0213\3\2\2\2\u0213\u0215\7\n\2\2\u0214\u0216\5H%\2\u0215\u0214\3\2\2"+ + "\2\u0215\u0216\3\2\2\2\u0216\u021f\3\2\2\2\u0217\u0218\5\22\n\2\u0218"+ + "\u0219\5\32\16\2\u0219\u021a\7\13\2\2\u021a\u021b\5J&\2\u021b\u021c\7"+ + "\r\2\2\u021c\u021d\5J&\2\u021d\u021f\3\2\2\2\u021e\u020e\3\2\2\2\u021e"+ + "\u0217\3\2\2\2\u021fC\3\2\2\2\u0220\u0222\5\n\6\2\u0221\u0220\3\2\2\2"+ + "\u0221\u0222\3\2\2\2\u0222\u0225\3\2\2\2\u0223\u0225\5H%\2\u0224\u0221"+ + "\3\2\2\2\u0224\u0223\3\2\2\2\u0225E\3\2\2\2\u0226\u0227\5H%\2\u0227G\3"+ + "\2\2\2\u0228\u0229\b%\1\2\u0229\u022a\5J&\2\u022a\u0230\3\2\2\2\u022b"+ + "\u022c\f\3\2\2\u022c\u022d\7\f\2\2\u022d\u022f\5J&\2\u022e\u022b\3\2\2"+ + "\2\u022f\u0232\3\2\2\2\u0230\u022e\3\2\2\2\u0230\u0231\3\2\2\2\u0231I"+ + "\3\2\2\2\u0232\u0230\3\2\2\2\u0233\u0234\b&\1\2\u0234\u0235\7\b\2\2\u0235"+ + "\u0236\5H%\2\u0236\u0237\7\t\2\2\u0237\u0275\3\2\2\2\u0238\u0239\7I\2"+ + "\2\u0239\u023c\7\b\2\2\u023a\u023d\5J&\2\u023b\u023d\5\30\r\2\u023c\u023a"+ + "\3\2\2\2\u023c\u023b\3\2\2\2\u023d\u023e\3\2\2\2\u023e\u023f\7\t\2\2\u023f"+ + "\u0275\3\2\2\2\u0240\u0241\7J\2\2\u0241\u0244\7\b\2\2\u0242\u0245\5J&"+ + "\2\u0243\u0245\5\30\r\2\u0244\u0242\3\2\2\2\u0244\u0243\3\2\2\2\u0245"+ + "\u0246\3\2\2\2\u0246\u0247\7\t\2\2\u0247\u0275\3\2\2\2\u0248\u024a\7K"+ + "\2\2\u0249\u024b\7\b\2\2\u024a\u0249\3\2\2\2\u024a\u024b\3\2\2\2\u024b"+ + "\u024c\3\2\2\2\u024c\u024e\7m\2\2\u024d\u024f\7\t\2\2\u024e\u024d\3\2"+ + "\2\2\u024e\u024f\3\2\2\2\u024f\u0275\3\2\2\2\u0250\u0251\7\b\2\2\u0251"+ + "\u0252\5\30\r\2\u0252\u0253\7\t\2\2\u0253\u0254\5J&\32\u0254\u0275\3\2"+ + "\2\2\u0255\u0256\t\2\2\2\u0256\u0275\5J&\31\u0257\u0258\7\24\2\2\u0258"+ + "\u0275\5J&\27\u0259\u025a\t\3\2\2\u025a\u0275\5J&\26\u025b\u025c\t\4\2"+ + "\2\u025c\u0275\5J&\22\u025d\u025e\7\4\2\2\u025e\u0263\5J&\2\u025f\u0260"+ + "\7\f\2\2\u0260\u0262\5J&\2\u0261\u025f\3\2\2\2\u0262\u0265\3\2\2\2\u0263"+ + "\u0261\3\2\2\2\u0263\u0264\3\2\2\2\u0264\u0267\3\2\2\2\u0265\u0263\3\2"+ + "\2\2\u0266\u0268\7\f\2\2\u0267\u0266\3\2\2\2\u0267\u0268\3\2\2\2\u0268"+ + "\u0269\3\2\2\2\u0269\u026a\7\5\2\2\u026a\u0275\3\2\2\2\u026b\u0275\7m"+ + "\2\2\u026c\u0275\7d\2\2\u026d\u026f\7n\2\2\u026e\u026d\3\2\2\2\u026f\u0270"+ + "\3\2\2\2\u0270\u026e\3\2\2\2\u0270\u0271\3\2\2\2\u0271\u0275\3\2\2\2\u0272"+ + "\u0275\7o\2\2\u0273\u0275\7U\2\2\u0274\u0233\3\2\2\2\u0274\u0238\3\2\2"+ + "\2\u0274\u0240\3\2\2\2\u0274\u0248\3\2\2\2\u0274\u0250\3\2\2\2\u0274\u0255"+ + "\3\2\2\2\u0274\u0257\3\2\2\2\u0274\u0259\3\2\2\2\u0274\u025b\3\2\2\2\u0274"+ + "\u025d\3\2\2\2\u0274\u026b\3\2\2\2\u0274\u026c\3\2\2\2\u0274\u026e\3\2"+ + "\2\2\u0274\u0272\3\2\2\2\u0274\u0273\3\2\2\2\u0275\u02b2\3\2\2\2\u0276"+ + "\u0277\f\25\2\2\u0277\u0278\t\5\2\2\u0278\u02b1\5J&\26\u0279\u027a\f\24"+ + "\2\2\u027a\u027b\t\6\2\2\u027b\u02b1\5J&\25\u027c\u027d\f\23\2\2\u027d"+ + "\u027e\t\7\2\2\u027e\u02b1\5J&\24\u027f\u0280\f\21\2\2\u0280\u0281\t\b"+ + "\2\2\u0281\u02b1\5J&\22\u0282\u0283\f\20\2\2\u0283\u0284\7\31\2\2\u0284"+ + "\u02b1\5J&\21\u0285\u0286\f\17\2\2\u0286\u0287\7\33\2\2\u0287\u02b1\5"+ + "J&\20\u0288\u0289\f\16\2\2\u0289\u028a\7\34\2\2\u028a\u02b1\5J&\17\u028b"+ + "\u028c\f\r\2\2\u028c\u028d\7%\2\2\u028d\u02b1\5J&\16\u028e\u028f\f\f\2"+ + "\2\u028f\u0290\7&\2\2\u0290\u02b1\5J&\r\u0291\u0292\f\13\2\2\u0292\u0293"+ + "\7\17\2\2\u0293\u0294\5J&\2\u0294\u0295\7\13\2\2\u0295\u0296\5J&\f\u0296"+ + "\u02b1\3\2\2\2\u0297\u0298\f\n\2\2\u0298\u0299\7\'\2\2\u0299\u02b1\5J"+ + "&\n\u029a\u029b\f\t\2\2\u029b\u029c\7(\2\2\u029c\u02b1\5J&\t\u029d\u029e"+ + "\f!\2\2\u029e\u029f\7\20\2\2\u029f\u02b1\7m\2\2\u02a0\u02a1\f \2\2\u02a1"+ + "\u02a2\7\21\2\2\u02a2\u02b1\7m\2\2\u02a3\u02a4\f\37\2\2\u02a4\u02a6\7"+ + "\b\2\2\u02a5\u02a7\5L\'\2\u02a6\u02a5\3\2\2\2\u02a6\u02a7\3\2\2\2\u02a7"+ + "\u02a8\3\2\2\2\u02a8\u02b1\7\t\2\2\u02a9\u02aa\f\33\2\2\u02aa\u02ab\7"+ + "\6\2\2\u02ab\u02ac\5H%\2\u02ac\u02ad\7\7\2\2\u02ad\u02b1\3\2\2\2\u02ae"+ + "\u02af\f\30\2\2\u02af\u02b1\t\2\2\2\u02b0\u0276\3\2\2\2\u02b0\u0279\3"+ + "\2\2\2\u02b0\u027c\3\2\2\2\u02b0\u027f\3\2\2\2\u02b0\u0282\3\2\2\2\u02b0"+ + "\u0285\3\2\2\2\u02b0\u0288\3\2\2\2\u02b0\u028b\3\2\2\2\u02b0\u028e\3\2"+ + "\2\2\u02b0\u0291\3\2\2\2\u02b0\u0297\3\2\2\2\u02b0\u029a\3\2\2\2\u02b0"+ + "\u029d\3\2\2\2\u02b0\u02a0\3\2\2\2\u02b0\u02a3\3\2\2\2\u02b0\u02a9\3\2"+ + "\2\2\u02b0\u02ae\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2"+ + "\u02b3\3\2\2\2\u02b3K\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02ba\5J&\2\u02b6"+ + "\u02b7\7\f\2\2\u02b7\u02b9\5J&\2\u02b8\u02b6\3\2\2\2\u02b9\u02bc\3\2\2"+ + "\2\u02ba\u02b8\3\2\2\2\u02ba\u02bb\3\2\2\2\u02bbM\3\2\2\2\u02bc\u02ba"+ + "\3\2\2\2\u02bd\u02bf\7L\2\2\u02be\u02c0\5P)\2\u02bf\u02be\3\2\2\2\u02bf"+ + "\u02c0\3\2\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\7V\2\2\u02c2O\3\2\2\2\u02c3"+ + "\u02c4\7\b\2\2\u02c4\u02c9\5R*\2\u02c5\u02c6\7\f\2\2\u02c6\u02c8\5R*\2"+ + "\u02c7\u02c5\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9\u02c7\3\2\2\2\u02c9\u02ca"+ + "\3\2\2\2\u02ca\u02cc\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02cd\7\t\2\2\u02cd"+ + "Q\3\2\2\2\u02ce\u02cf\7M\2\2\u02cf\u02d9\7n\2\2\u02d0\u02d1\7N\2\2\u02d1"+ + "\u02d9\7m\2\2\u02d2\u02d3\7O\2\2\u02d3\u02d9\7n\2\2\u02d4\u02d5\7P\2\2"+ + "\u02d5\u02d9\5J&\2\u02d6\u02d7\7Q\2\2\u02d7\u02d9\5J&\2\u02d8\u02ce\3"+ + "\2\2\2\u02d8\u02d0\3\2\2\2\u02d8\u02d2\3\2\2\2\u02d8\u02d4\3\2\2\2\u02d8"+ + "\u02d6\3\2\2\2\u02d9S\3\2\2\2\u02da\u02dc\5V,\2\u02db\u02da\3\2\2\2\u02dc"+ + "\u02df\3\2\2\2\u02dd\u02db\3\2\2\2\u02dd\u02de\3\2\2\2\u02deU\3\2\2\2"+ + "\u02df\u02dd\3\2\2\2\u02e0\u02e4\5X-\2\u02e1\u02e4\5Z.\2\u02e2\u02e4\5"+ + "\\/\2\u02e3\u02e0\3\2\2\2\u02e3\u02e1\3\2\2\2\u02e3\u02e2\3\2\2\2\u02e4"+ + "W\3\2\2\2\u02e5\u02e6\7\u0093\2\2\u02e6\u02ea\7v\2\2\u02e7\u02e9\7\u0094"+ + "\2\2\u02e8\u02e7\3\2\2\2\u02e9\u02ec\3\2\2\2\u02ea\u02e8\3\2\2\2\u02ea"+ + "\u02eb\3\2\2\2\u02eb\u02f6\3\2\2\2\u02ec\u02ea\3\2\2\2\u02ed\u02ee\7\u0092"+ + "\2\2\u02ee\u02f2\7v\2\2\u02ef\u02f1\7\u0094\2\2\u02f0\u02ef\3\2\2\2\u02f1"+ + "\u02f4\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3\u02f6\3\2"+ + "\2\2\u02f4\u02f2\3\2\2\2\u02f5\u02e5\3\2\2\2\u02f5\u02ed\3\2\2\2\u02f6"+ + "Y\3\2\2\2\u02f7\u02f9\7t\2\2\u02f8\u02fa\5^\60\2\u02f9\u02f8\3\2\2\2\u02f9"+ + "\u02fa\3\2\2\2\u02fa\u02fe\3\2\2\2\u02fb\u02fd\7\u0094\2\2\u02fc\u02fb"+ + "\3\2\2\2\u02fd\u0300\3\2\2\2\u02fe\u02fc\3\2\2\2\u02fe\u02ff\3\2\2\2\u02ff"+ + "[\3\2\2\2\u0300\u02fe\3\2\2\2\u0301\u0302\7s\2\2\u0302\u0307\5`\61\2\u0303"+ + "\u0304\7w\2\2\u0304\u0306\5`\61\2\u0305\u0303\3\2\2\2\u0306\u0309\3\2"+ + "\2\2\u0307\u0305\3\2\2\2\u0307\u0308\3\2\2\2\u0308\u030d\3\2\2\2\u0309"+ + "\u0307\3\2\2\2\u030a\u030c\7\u0094\2\2\u030b\u030a\3\2\2\2\u030c\u030f"+ + "\3\2\2\2\u030d\u030b\3\2\2\2\u030d\u030e\3\2\2\2\u030e]\3\2\2\2\u030f"+ + "\u030d\3\2\2\2\u0310\u033e\5`\61\2\u0311\u0312\7u\2\2\u0312\u033e\5`\61"+ + "\2\u0313\u0314\5`\61\2\u0314\u0315\7w\2\2\u0315\u0316\5`\61\2\u0316\u033e"+ + "\3\2\2\2\u0317\u0318\7x\2\2\u0318\u0319\5`\61\2\u0319\u031a\7y\2\2\u031a"+ + "\u031b\7w\2\2\u031b\u031c\7\u0093\2\2\u031c\u033e\3\2\2\2\u031d\u031e"+ + "\7x\2\2\u031e\u031f\7x\2\2\u031f\u0320\5`\61\2\u0320\u0321\7y\2\2\u0321"+ + "\u0322\7y\2\2\u0322\u0323\7w\2\2\u0323\u0324\7\u0093\2\2\u0324\u033e\3"+ + "\2\2\2\u0325\u0326\7x\2\2\u0326\u0327\5`\61\2\u0327\u0328\7w\2\2\u0328"+ + "\u0329\7\u0093\2\2\u0329\u032a\7y\2\2\u032a\u032b\7w\2\2\u032b\u032c\7"+ + "\u0093\2\2\u032c\u033e\3\2\2\2\u032d\u032e\7x\2\2\u032e\u032f\5`\61\2"+ + "\u032f\u0330\7w\2\2\u0330\u0331\7\u0093\2\2\u0331\u0332\7y\2\2\u0332\u033e"+ + "\3\2\2\2\u0333\u0334\7x\2\2\u0334\u0335\5`\61\2\u0335\u0336\7y\2\2\u0336"+ + "\u033e\3\2\2\2\u0337\u0338\7x\2\2\u0338\u0339\7x\2\2\u0339\u033a\5`\61"+ + "\2\u033a\u033b\7y\2\2\u033b\u033c\7y\2\2\u033c\u033e\3\2\2\2\u033d\u0310"+ + "\3\2\2\2\u033d\u0311\3\2\2\2\u033d\u0313\3\2\2\2\u033d\u0317\3\2\2\2\u033d"+ + "\u031d\3\2\2\2\u033d\u0325\3\2\2\2\u033d\u032d\3\2\2\2\u033d\u0333\3\2"+ + "\2\2\u033d\u0337\3\2\2\2\u033e_\3\2\2\2\u033f\u0340\b\61\1\2\u0340\u0341"+ + "\7z\2\2\u0341\u0342\5`\61\2\u0342\u0343\7{\2\2\u0343\u034e\3\2\2\2\u0344"+ + "\u0345\t\t\2\2\u0345\u034e\5`\61\n\u0346\u034e\7\u0093\2\2\u0347\u034e"+ + "\7\u0091\2\2\u0348\u0349\7\u0085\2\2\u0349\u034a\7\u0093\2\2\u034a\u034e"+ + "\7\u0086\2\2\u034b\u034e\7\u0087\2\2\u034c\u034e\7\u0090\2\2\u034d\u033f"+ + "\3\2\2\2\u034d\u0344\3\2\2\2\u034d\u0346\3\2\2\2\u034d\u0347\3\2\2\2\u034d"+ + "\u0348\3\2\2\2\u034d\u034b\3\2\2\2\u034d\u034c\3\2\2\2\u034e\u035d\3\2"+ + "\2\2\u034f\u0350\f\f\2\2\u0350\u0351\7|\2\2\u0351\u035c\5`\61\r\u0352"+ + "\u0353\f\13\2\2\u0353\u0354\t\n\2\2\u0354\u035c\5`\61\f\u0355\u0356\f"+ + "\t\2\2\u0356\u0357\t\13\2\2\u0357\u035c\5`\61\n\u0358\u0359\f\b\2\2\u0359"+ + "\u035a\t\f\2\2\u035a\u035c\5`\61\t\u035b\u034f\3\2\2\2\u035b\u0352\3\2"+ + "\2\2\u035b\u0355\3\2\2\2\u035b\u0358\3\2\2\2\u035c\u035f\3\2\2\2\u035d"+ + "\u035b\3\2\2\2\u035d\u035e\3\2\2\2\u035ea\3\2\2\2\u035f\u035d\3\2\2\2"+ + "Xk|\u0089\u008f\u0095\u009c\u00a3\u00ab\u00b2\u00b9\u00be\u00ca\u00cd"+ "\u00cf\u00d8\u00e0\u00e5\u00ea\u00f1\u00f8\u00ff\u0107\u010d\u0119\u0127"+ "\u012d\u0133\u0139\u013e\u0142\u014b\u0152\u0159\u0163\u016f\u017a\u018f"+ "\u0198\u019e\u01a3\u01aa\u01b7\u01bc\u01c8\u01d6\u01e9\u01f2\u01fa\u01ff"+ - "\u0204\u0206\u020c\u0211\u0215\u021b\u021e\u0226\u0229\u022c\u0238\u0244"+ - "\u024c\u0252\u0256\u026b\u026f\u0278\u027c\u02ae\u02b8\u02ba\u02c2\u02c7"+ - "\u02d1\u02e0\u02e5\u02eb\u02f2\u02fa\u02fd\u0301\u0306\u030f\u0315\u0345"+ - "\u0355\u0363\u0365"; + "\u0204\u0206\u020c\u0211\u0215\u021e\u0221\u0224\u0230\u023c\u0244\u024a"+ + "\u024e\u0263\u0267\u0270\u0274\u02a6\u02b0\u02b2\u02ba\u02bf\u02c9\u02d8"+ + "\u02dd\u02e3\u02ea\u02f2\u02f5\u02f9\u02fe\u0307\u030d\u033d\u034d\u035b"+ + "\u035d"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser_new.g4 b/src/main/java/dk/camelot64/kickc/parser/KickCParser_new.g4 index 75bd5954d..fd50428b9 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser_new.g4 +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser_new.g4 @@ -34,26 +34,17 @@ declSeq decl : declVariables ';' + | declFunction | structDef ';' | enumDef ';' - | declFunction | pragma | typeDef ';' ; - -typeDef - : TYPEDEF declType declarator - ; - declVariables : declType declaratorInitList ; -declType - : directive* type directive* - ; - declaratorInitList : declaratorInit | declaratorInitList COMMA declaratorInit @@ -64,12 +55,12 @@ declaratorInit | declarator '=' kasmContent #declVariableInitKasm ; -declarator - : NAME {if(isTypedef) Parser.addTypedef($NAME.text);} #declaratorName - | declarator PAR_BEGIN parameterListDecl? PAR_END #declaratorProcedure - | declarator BRACKET_BEGIN (expr)? BRACKET_END #declaratorArray - | ASTERISK directive* declarator #declaratorPointer - | PAR_BEGIN declarator PAR_END #declaratorPar +typeDef + : TYPEDEF declType declarator + ; + +declType + : directive* type directive* ; typeSpecifier @@ -78,6 +69,14 @@ typeSpecifier | typeSpecifier BRACKET_BEGIN (expr)? BRACKET_END #typeSpecifierArray ; +declarator + : NAME {if(isTypedef) Parser.addTypedef($NAME.text);} #declaratorName + | declarator PAR_BEGIN parameterListDecl? PAR_END #declaratorProcedure + | declarator BRACKET_BEGIN (expr)? BRACKET_END #declaratorArray + | ASTERISK directive* declarator #declaratorPointer + | PAR_BEGIN declarator PAR_END #declaratorPar + ; + type : SIMPLETYPE #typeSimple | SIGNEDNESS SIMPLETYPE? #typeSignedSimple @@ -197,8 +196,7 @@ switchCase: forLoop : forClassicInit ';' forClassicCondition? ';' commaExpr? #forClassic - | declType declarator COLON expr RANGE expr #forRangeDecl - | NAME COLON expr RANGE expr #forRangeName + | declType declarator COLON expr RANGE expr #forRange ; forClassicInit diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java index 6f0bc1352..59d0587c6 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -1583,15 +1583,10 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor= divr16u::divisor#2 Inversing boolean not [74] mul16u::$3 = mul16u::$1 == 0 from [73] mul16u::$2 = mul16u::$1 != 0 @@ -1903,8 +1888,8 @@ Successful SSA optimization Pass2IdenticalPhiElimination Identical Phi Values memset::return#0 memset::str#3 Identical Phi Values render_logo::logo_start#1 render_logo::logo_start#0 Successful SSA optimization Pass2IdenticalPhiElimination -Identified duplicate assignment right side [398] render_logo::$11 = $28 * render_logo::line#10 -Identified duplicate assignment right side [415] render_logo::$18 = $28 * render_logo::line#11 +Identified duplicate assignment right side [397] render_logo::$11 = $28 * render_logo::line1#2 +Identified duplicate assignment right side [414] render_logo::$18 = $28 * render_logo::line2#2 Successful SSA optimization Pass2DuplicateRValueIdentification Simple Condition divr16u::$4 [8] if(divr16u::$2==0) goto divr16u::@2 Simple Condition divr16u::$9 [13] if(divr16u::rem#6(word)SCREEN&$3fff*4 Constant inlined sin16s_gen2::wavelength#0 = XSIN_SIZE Constant inlined main::toD0181_$1 = (word)SCREEN&$3fff*4 Constant inlined main::toD0181_$0 = (word)SCREEN&$3fff +Constant inlined render_logo::line2#0 = 0 Constant inlined main::toD0181_$5 = >(word)LOGO/4&$f Constant inlined main::toD0181_$4 = >(word)LOGO/4 Constant inlined main::toD0181_$3 = >(word)LOGO @@ -2705,30 +2691,33 @@ Constant inlined render_logo::$57 = SCREEN+$28*++0 Constant inlined render_logo::screen_idx#1 = 0 Constant inlined render_logo::$59 = SCREEN+$28*++++0 Constant inlined render_logo::screen_idx#2 = 0 +Constant inlined render_logo::line1#6 = ++++++0 Constant inlined render_logo::$61 = SCREEN+$28*++++++0 +Constant inlined render_logo::line1#8 = ++++++++0 Constant inlined render_logo::$60 = $28*++++++0 Constant inlined render_logo::$63 = SCREEN+$28*++++++++0 Constant inlined render_logo::$62 = $28*++++++++0 Constant inlined render_logo::$65 = SCREEN+$28*++++++++++0 +Constant inlined render_logo::line1#4 = ++++0 Constant inlined render_logo::$64 = $28*++++++++++0 +Constant inlined render_logo::line1#0 = 0 +Constant inlined render_logo::line1#1 = ++0 Constant inlined divr16u::dividend#1 = >PI2_u4f28 Constant inlined divr16u::dividend#2 = main::@2] __b2_from___b1: - // [5] phi main::j#3 = $64 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1 + // [5] phi main::j#2 = $64 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1 ldx #$64 jmp __b2 // [5] phi from main::@2 to main::@2 [phi:main::@2->main::@2] __b2_from___b2: - // [5] phi main::j#3 = main::j#2 [phi:main::@2->main::@2#0] -- register_copy + // [5] phi main::j#2 = main::j#1 [phi:main::@2->main::@2#0] -- register_copy jmp __b2 // main::@2 __b2: - // [6] SCREEN2[main::j#3] = main::j#3 -- pbuc1_derefidx_vbuxx=vbuxx + // [6] SCREEN2[main::j#2] = main::j#2 -- pbuc1_derefidx_vbuxx=vbuxx txa sta SCREEN2,x - // [7] main::j#2 = -- main::j#3 -- vbuxx=_dec_vbuxx + // [7] main::j#1 = -- main::j#2 -- vbuxx=_dec_vbuxx dex - // [8] if(main::j#2!=$ff) goto main::@2 -- vbuxx_neq_vbuc1_then_la1 + // [8] if(main::j#1!=$ff) goto main::@2 -- vbuxx_neq_vbuc1_then_la1 cpx #$ff bne __b2_from___b2 jmp __breturn @@ -260,11 +248,11 @@ byte main::i byte main::i#1 reg byte x 16.5 byte main::i#2 reg byte x 22.0 byte main::j -byte main::j#2 reg byte x 16.5 -byte main::j#3 reg byte x 22.0 +byte main::j#1 reg byte x 16.5 +byte main::j#2 reg byte x 22.0 reg byte x [ main::i#2 main::i#1 ] -reg byte x [ main::j#3 main::j#2 ] +reg byte x [ main::j#2 main::j#1 ] FINAL ASSEMBLER @@ -298,27 +286,27 @@ main: { // [2] SCREEN1[main::i#2] = main::i#2 -- pbuc1_derefidx_vbuxx=vbuxx txa sta SCREEN1,x - // for(byte i : 0..255) + // for(char i : 0..255) // [3] main::i#1 = ++ main::i#2 -- vbuxx=_inc_vbuxx inx // [4] if(main::i#1!=0) goto main::@1 -- vbuxx_neq_0_then_la1 cpx #0 bne __b1 // [5] phi from main::@1 to main::@2 [phi:main::@1->main::@2] - // [5] phi main::j#3 = $64 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1 + // [5] phi main::j#2 = $64 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1 ldx #$64 // [5] phi from main::@2 to main::@2 [phi:main::@2->main::@2] - // [5] phi main::j#3 = main::j#2 [phi:main::@2->main::@2#0] -- register_copy + // [5] phi main::j#2 = main::j#1 [phi:main::@2->main::@2#0] -- register_copy // main::@2 __b2: // SCREEN2[j] = j - // [6] SCREEN2[main::j#3] = main::j#3 -- pbuc1_derefidx_vbuxx=vbuxx + // [6] SCREEN2[main::j#2] = main::j#2 -- pbuc1_derefidx_vbuxx=vbuxx txa sta SCREEN2,x - // for(j : 100..0) - // [7] main::j#2 = -- main::j#3 -- vbuxx=_dec_vbuxx + // for(char j : 100..0) + // [7] main::j#1 = -- main::j#2 -- vbuxx=_dec_vbuxx dex - // [8] if(main::j#2!=$ff) goto main::@2 -- vbuxx_neq_vbuc1_then_la1 + // [8] if(main::j#1!=$ff) goto main::@2 -- vbuxx_neq_vbuc1_then_la1 cpx #$ff bne __b2 // main::@return diff --git a/src/test/ref/forrangemin.sym b/src/test/ref/forrangemin.sym index 7cea0691f..f1f36df8e 100644 --- a/src/test/ref/forrangemin.sym +++ b/src/test/ref/forrangemin.sym @@ -5,8 +5,8 @@ byte main::i byte main::i#1 reg byte x 16.5 byte main::i#2 reg byte x 22.0 byte main::j -byte main::j#2 reg byte x 16.5 -byte main::j#3 reg byte x 22.0 +byte main::j#1 reg byte x 16.5 +byte main::j#2 reg byte x 22.0 reg byte x [ main::i#2 main::i#1 ] -reg byte x [ main::j#3 main::j#2 ] +reg byte x [ main::j#2 main::j#1 ] diff --git a/src/test/ref/millfork-benchmarks/linkedlist-kc.asm b/src/test/ref/millfork-benchmarks/linkedlist-kc.asm index 8f7daaab9..d30ee60ca 100644 --- a/src/test/ref/millfork-benchmarks/linkedlist-kc.asm +++ b/src/test/ref/millfork-benchmarks/linkedlist-kc.asm @@ -47,7 +47,7 @@ main: { __b2: // prepend(i) jsr prepend - // for(i : 0..2999) + // for(unsigned int i : 0..2999) inc.z i bne !+ inc.z i+1 @@ -63,7 +63,7 @@ main: { // print_char((byte)sum()) lda.z __5 jsr print_char - // for(c : 0..4) + // for(unsigned char c : 0..4) inx cpx #5 bne __b1 diff --git a/src/test/ref/millfork-benchmarks/linkedlist-kc.cfg b/src/test/ref/millfork-benchmarks/linkedlist-kc.cfg index 629d1d263..71991f143 100644 --- a/src/test/ref/millfork-benchmarks/linkedlist-kc.cfg +++ b/src/test/ref/millfork-benchmarks/linkedlist-kc.cfg @@ -20,19 +20,19 @@ main: scope:[main] from __start::@1 [6] call start to:main::@1 main::@1: scope:[main] from main main::@7 - [7] main::c#8 = phi( main/0, main::@7/main::c#2 ) + [7] main::c#7 = phi( main/0, main::@7/main::c#1 ) [7] print_char_cursor#48 = phi( main/print_screen#0, main::@7/print_char_cursor#28 ) to:main::@2 main::@2: scope:[main] from main::@1 main::@5 [8] root#22 = phi( main::@1/(struct node*) 0, main::@5/root#12 ) [8] free_#24 = phi( main::@1/0, main::@5/free_#14 ) - [8] main::i#3 = phi( main::@1/0, main::@5/main::i#2 ) - [9] prepend::x#0 = main::i#3 + [8] main::i#2 = phi( main::@1/0, main::@5/main::i#1 ) + [9] prepend::x#0 = main::i#2 [10] call prepend to:main::@5 main::@5: scope:[main] from main::@2 - [11] main::i#2 = ++ main::i#3 - [12] if(main::i#2!=$bb8) goto main::@2 + [11] main::i#1 = ++ main::i#2 + [12] if(main::i#1!=$bb8) goto main::@2 to:main::@3 main::@3: scope:[main] from main::@5 [13] phi() @@ -45,8 +45,8 @@ main::@6: scope:[main] from main::@3 [18] call print_char to:main::@7 main::@7: scope:[main] from main::@6 - [19] main::c#2 = ++ main::c#8 - [20] if(main::c#2!=5) goto main::@1 + [19] main::c#1 = ++ main::c#7 + [20] if(main::c#1!=5) goto main::@1 to:main::@4 main::@4: scope:[main] from main::@7 [21] phi() diff --git a/src/test/ref/millfork-benchmarks/linkedlist-kc.log b/src/test/ref/millfork-benchmarks/linkedlist-kc.log index 1ce681398..5d9ba010f 100644 --- a/src/test/ref/millfork-benchmarks/linkedlist-kc.log +++ b/src/test/ref/millfork-benchmarks/linkedlist-kc.log @@ -248,8 +248,6 @@ main: scope:[main] from __start::@1 print_char_cursor#51 = phi( __start::@1/print_char_cursor#43 ) root#28 = phi( __start::@1/root#24 ) free_#30 = phi( __start::@1/free_#26 ) - main::i#0 = 0 - main::c#0 = 0 call start to:main::@5 main::@5: scope:[main] from main @@ -258,12 +256,12 @@ main::@5: scope:[main] from main print_char_cursor#50 = phi( main/print_char_cursor#51 ) root#25 = phi( main/root#28 ) free_#27 = phi( main/free_#30 ) - main::c#1 = 0 + main::c#0 = 0 to:main::@1 main::@1: scope:[main] from main::@5 main::@9 print_line_cursor#30 = phi( main::@5/print_line_cursor#31, main::@9/print_line_cursor#23 ) Ticks#24 = phi( main::@5/Ticks#25, main::@9/Ticks#18 ) - main::c#9 = phi( main::@5/main::c#1, main::@9/main::c#2 ) + main::c#8 = phi( main::@5/main::c#0, main::@9/main::c#1 ) print_char_cursor#49 = phi( main::@5/print_char_cursor#50, main::@9/print_char_cursor#13 ) root#21 = phi( main::@5/root#25, main::@9/root#26 ) free_#23 = phi( main::@5/free_#27, main::@9/free_#28 ) @@ -272,44 +270,44 @@ main::@1: scope:[main] from main::@5 main::@9 main::@6: scope:[main] from main::@1 print_line_cursor#29 = phi( main::@1/print_line_cursor#30 ) Ticks#23 = phi( main::@1/Ticks#24 ) - main::c#8 = phi( main::@1/main::c#9 ) + main::c#7 = phi( main::@1/main::c#8 ) print_char_cursor#48 = phi( main::@1/print_char_cursor#49 ) root#14 = phi( main::@1/root#1 ) free_#17 = phi( main::@1/free_#1 ) free_#6 = free_#17 root#4 = root#14 - main::i#1 = 0 + main::i#0 = 0 to:main::@2 main::@2: scope:[main] from main::@6 main::@7 print_line_cursor#28 = phi( main::@6/print_line_cursor#29, main::@7/print_line_cursor#27 ) Ticks#22 = phi( main::@6/Ticks#23, main::@7/Ticks#21 ) - main::c#7 = phi( main::@6/main::c#8, main::@7/main::c#6 ) + main::c#6 = phi( main::@6/main::c#7, main::@7/main::c#5 ) print_char_cursor#47 = phi( main::@6/print_char_cursor#48, main::@7/print_char_cursor#46 ) root#22 = phi( main::@6/root#4, main::@7/root#5 ) free_#24 = phi( main::@6/free_#6, main::@7/free_#7 ) - main::i#3 = phi( main::@6/main::i#1, main::@7/main::i#2 ) - prepend::x#0 = main::i#3 + main::i#2 = phi( main::@6/main::i#0, main::@7/main::i#1 ) + prepend::x#0 = main::i#2 call prepend to:main::@7 main::@7: scope:[main] from main::@2 print_line_cursor#27 = phi( main::@2/print_line_cursor#28 ) Ticks#21 = phi( main::@2/Ticks#22 ) - main::c#6 = phi( main::@2/main::c#7 ) + main::c#5 = phi( main::@2/main::c#6 ) print_char_cursor#46 = phi( main::@2/print_char_cursor#47 ) - main::i#4 = phi( main::@2/main::i#3 ) + main::i#3 = phi( main::@2/main::i#2 ) root#15 = phi( main::@2/root#3 ) free_#18 = phi( main::@2/free_#5 ) free_#7 = free_#18 root#5 = root#15 - main::i#2 = main::i#4 + rangenext(0,$bb7) - main::$4 = main::i#2 != rangelast(0,$bb7) + main::i#1 = main::i#3 + rangenext(0,$bb7) + main::$4 = main::i#1 != rangelast(0,$bb7) if(main::$4) goto main::@2 to:main::@3 main::@3: scope:[main] from main::@7 print_line_cursor#26 = phi( main::@7/print_line_cursor#27 ) Ticks#20 = phi( main::@7/Ticks#21 ) free_#32 = phi( main::@7/free_#7 ) - main::c#5 = phi( main::@7/main::c#6 ) + main::c#4 = phi( main::@7/main::c#5 ) print_char_cursor#45 = phi( main::@7/print_char_cursor#46 ) root#20 = phi( main::@7/root#5 ) call sum @@ -320,7 +318,7 @@ main::@8: scope:[main] from main::@3 Ticks#19 = phi( main::@3/Ticks#20 ) root#29 = phi( main::@3/root#20 ) free_#31 = phi( main::@3/free_#32 ) - main::c#4 = phi( main::@3/main::c#5 ) + main::c#3 = phi( main::@3/main::c#4 ) print_char_cursor#40 = phi( main::@3/print_char_cursor#45 ) sum::return#4 = phi( main::@3/sum::return#2 ) main::$5 = sum::return#4 @@ -332,11 +330,11 @@ main::@9: scope:[main] from main::@8 Ticks#18 = phi( main::@8/Ticks#19 ) root#26 = phi( main::@8/root#29 ) free_#28 = phi( main::@8/free_#31 ) - main::c#3 = phi( main::@8/main::c#4 ) + main::c#2 = phi( main::@8/main::c#3 ) print_char_cursor#32 = phi( main::@8/print_char_cursor#9 ) print_char_cursor#13 = print_char_cursor#32 - main::c#2 = main::c#3 + rangenext(0,4) - main::$7 = main::c#2 != rangelast(0,4) + main::c#1 = main::c#2 + rangenext(0,4) + main::$7 = main::c#1 != rangelast(0,4) if(main::$7) goto main::@1 to:main::@4 main::@4: scope:[main] from main::@9 @@ -522,13 +520,11 @@ byte main::c#5 byte main::c#6 byte main::c#7 byte main::c#8 -byte main::c#9 word main::i word main::i#0 word main::i#1 word main::i#2 word main::i#3 -word main::i#4 void prepend(word prepend::x) struct node*~ prepend::$0 struct node**~ prepend::$1 @@ -725,14 +721,10 @@ Adding number conversion cast (unumber) $f in print_uchar::$2 = print_uchar::b#3 Adding number conversion cast (unumber) print_uchar::$2 in print_uchar::$2 = print_uchar::b#3 & (unumber)$f Adding number conversion cast (unumber) 0 in free_#0 = 0 Adding number conversion cast (unumber) 0 in sum::s#1 = 0 -Adding number conversion cast (unumber) 0 in main::c#1 = 0 -Adding number conversion cast (unumber) 0 in main::i#1 = 0 Successful SSA optimization PassNAddNumberTypeConversions Inlining cast free_#0 = (unumber)0 Inlining cast root#0 = (struct node*)0 Inlining cast sum::s#1 = (unumber)0 -Inlining cast main::c#1 = (unumber)0 -Inlining cast main::i#1 = (unumber)0 Successful SSA optimization Pass2InlineCast Simplifying constant integer cast $28 Simplifying constant integer cast 4 @@ -740,8 +732,6 @@ Simplifying constant integer cast $f Simplifying constant integer cast 0 Simplifying constant pointer cast (struct node*) 0 Simplifying constant integer cast 0 -Simplifying constant integer cast 0 -Simplifying constant integer cast 0 Simplifying constant pointer cast (byte*) 1024 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (byte) $28 @@ -749,8 +739,6 @@ Finalized unsigned number type (byte) 4 Finalized unsigned number type (byte) $f Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 0 -Finalized unsigned number type (byte) 0 -Finalized unsigned number type (byte) 0 Successful SSA optimization PassNFinalizeNumberTypeConversions Inferred type updated to byte in print_uchar::$2 = print_uchar::b#3 & $f Alias print_line_cursor#0 = print_ln::$0 print_line_cursor#10 print_char_cursor#0 print_line_cursor#11 print_char_cursor#20 print_line_cursor#1 print_char_cursor#1 @@ -788,14 +776,14 @@ Alias print_char_cursor#50 = print_char_cursor#51 Alias Ticks#25 = Ticks#26 Alias print_line_cursor#31 = print_line_cursor#32 Alias print_char_cursor#48 = print_char_cursor#49 -Alias main::c#8 = main::c#9 +Alias main::c#7 = main::c#8 Alias Ticks#23 = Ticks#24 Alias print_line_cursor#29 = print_line_cursor#30 Alias free_#17 = free_#6 Alias root#14 = root#4 -Alias main::i#3 = main::i#4 +Alias main::i#2 = main::i#3 Alias print_char_cursor#40 = print_char_cursor#46 print_char_cursor#47 print_char_cursor#45 -Alias main::c#3 = main::c#6 main::c#7 main::c#5 main::c#4 +Alias main::c#2 = main::c#5 main::c#6 main::c#4 main::c#3 Alias Ticks#15 = Ticks#21 Ticks#22 Ticks#20 Ticks#19 Ticks#18 Alias print_line_cursor#20 = print_line_cursor#27 print_line_cursor#28 print_line_cursor#26 print_line_cursor#25 print_line_cursor#23 Alias free_#18 = free_#7 free_#32 free_#31 free_#28 free_#29 free_#25 free_#19 free_#8 @@ -843,7 +831,7 @@ Identical Phi Values print_line_cursor#31 print_screen#0 Identical Phi Values free_#17 free_#0 Identical Phi Values root#14 root#0 Identical Phi Values print_char_cursor#40 print_char_cursor#48 -Identical Phi Values main::c#3 main::c#8 +Identical Phi Values main::c#2 main::c#7 Identical Phi Values Ticks#15 Ticks#23 Identical Phi Values print_line_cursor#20 print_line_cursor#29 Identical Phi Values free_#18 free_#15 @@ -864,8 +852,8 @@ Identical Phi Values print_line_cursor#29 print_screen#0 Successful SSA optimization Pass2IdenticalPhiElimination Simple Condition print_ln::$1 [4] if(print_line_cursor#0> 4 [ print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] ( main:3::end:22::print_uint:49::print_uchar:58 [ print_uint::w#0 print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60 [ print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:18 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] Statement [71] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#28 print_uchar::$2 ] ( main:3::end:22::print_uint:49::print_uchar:58 [ print_uint::w#0 print_char_cursor#28 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60 [ print_char_cursor#28 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte a Statement [1] last_time = 0 [ last_time ] ( [ last_time ] { } ) always clobbers reg byte a -Statement [9] prepend::x#0 = main::i#3 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#24 root#22 prepend::x#0 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#24 root#22 prepend::x#0 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a -Statement [12] if(main::i#2!=$bb8) goto main::@2 [ last_time print_char_cursor#48 main::c#8 main::i#2 free_#14 root#12 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::i#2 free_#14 root#12 ] { } ) always clobbers reg byte a -Statement [15] sum::return#2 = sum::s#3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a -Statement [16] main::$5 = sum::return#2 [ last_time print_char_cursor#48 main::c#8 main::$5 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::$5 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a -Statement [17] print_char::ch#2 = (byte)main::$5 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a +Statement [9] prepend::x#0 = main::i#2 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#24 root#22 prepend::x#0 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#24 root#22 prepend::x#0 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a +Statement [12] if(main::i#1!=$bb8) goto main::@2 [ last_time print_char_cursor#48 main::c#7 main::i#1 free_#14 root#12 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 main::i#1 free_#14 root#12 ] { } ) always clobbers reg byte a +Statement [15] sum::return#2 = sum::s#3 [ last_time print_char_cursor#48 main::c#7 sum::return#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 sum::return#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a +Statement [16] main::$5 = sum::return#2 [ last_time print_char_cursor#48 main::c#7 main::$5 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 main::$5 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a +Statement [17] print_char::ch#2 = (byte)main::$5 [ last_time print_char_cursor#48 main::c#7 print_char::ch#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 print_char::ch#2 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a Statement asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 } always clobbers reg byte a reg byte x reg byte y -Statement [28] alloc::return#2 = alloc::return#0 [ root#22 free_#14 prepend::x#0 alloc::return#2 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 free_#14 prepend::x#0 alloc::return#2 ] { { prepend::x#0 = main::i#3 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a -Statement [29] prepend::new#1 = alloc::return#2 [ root#22 free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a -Statement [30] *((struct node**)prepend::new#1) = root#22 [ free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a reg byte y -Statement [31] ((word*)prepend::new#1)[OFFSET_STRUCT_NODE_VALUE] = prepend::x#0 [ free_#14 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#14 prepend::new#1 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a reg byte y -Statement [32] root#12 = prepend::new#1 [ free_#14 root#12 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#14 root#12 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a -Statement [34] sum::current#1 = root#12 [ sum::current#1 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::current#1 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a -Statement [36] if((struct node*)0!=sum::current#3) goto sum::@2 [ sum::s#3 sum::current#3 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::s#3 sum::current#3 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a -Statement [38] sum::s#2 = sum::s#3 + ((word*)sum::current#3)[OFFSET_STRUCT_NODE_VALUE] [ sum::current#3 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::current#3 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y -Statement [39] sum::current#2 = *((struct node**)sum::current#3) [ sum::current#2 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::current#2 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y -Statement [41] *print_char_cursor#27 = print_char::ch#3 [ print_char_cursor#27 ] ( main:3::print_char:18 [ last_time main::c#8 print_char_cursor#27 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:70 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:70 [ print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:73 [ print_uint::w#0 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:73 [ print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte y +Statement [28] alloc::return#2 = alloc::return#0 [ root#22 free_#14 prepend::x#0 alloc::return#2 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 free_#14 prepend::x#0 alloc::return#2 ] { { prepend::x#0 = main::i#2 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a +Statement [29] prepend::new#1 = alloc::return#2 [ root#22 free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a +Statement [30] *((struct node**)prepend::new#1) = root#22 [ free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a reg byte y +Statement [31] ((word*)prepend::new#1)[OFFSET_STRUCT_NODE_VALUE] = prepend::x#0 [ free_#14 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#14 prepend::new#1 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a reg byte y +Statement [32] root#12 = prepend::new#1 [ free_#14 root#12 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#14 root#12 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a +Statement [34] sum::current#1 = root#12 [ sum::current#1 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::current#1 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a +Statement [36] if((struct node*)0!=sum::current#3) goto sum::@2 [ sum::s#3 sum::current#3 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::s#3 sum::current#3 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a +Statement [38] sum::s#2 = sum::s#3 + ((word*)sum::current#3)[OFFSET_STRUCT_NODE_VALUE] [ sum::current#3 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::current#3 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y +Statement [39] sum::current#2 = *((struct node**)sum::current#3) [ sum::current#2 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::current#2 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y +Statement [41] *print_char_cursor#27 = print_char::ch#3 [ print_char_cursor#27 ] ( main:3::print_char:18 [ last_time main::c#7 print_char_cursor#27 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:70 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:70 [ print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:73 [ print_uint::w#0 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:73 [ print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte y Statement [44] Ticks#0 = last_time [ last_time print_char_cursor#28 Ticks#0 ] ( main:3::end:22 [ last_time print_char_cursor#28 Ticks#0 ] { } ) always clobbers reg byte a Statement [46] last_time = last_time - Ticks#0 [ last_time print_char_cursor#28 ] ( main:3::end:22 [ last_time print_char_cursor#28 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a Statement [47] Ticks#1 = last_time [ print_char_cursor#28 Ticks#1 ] ( main:3::end:22 [ print_char_cursor#28 Ticks#1 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a Statement [48] print_uint::w#0 = Ticks#1 [ print_char_cursor#28 print_uint::w#0 ] ( main:3::end:22 [ print_char_cursor#28 print_uint::w#0 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a -Statement [53] alloc::$1 = free_#24 << 2 [ free_#24 alloc::$1 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 prepend::x#0 free_#24 alloc::$1 ] { { prepend::x#0 = main::i#3 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a -Statement [54] alloc::return#0 = heap + alloc::$1 [ free_#24 alloc::return#0 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 prepend::x#0 free_#24 alloc::return#0 ] { { prepend::x#0 = main::i#3 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a +Statement [53] alloc::$1 = free_#24 << 2 [ free_#24 alloc::$1 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 prepend::x#0 free_#24 alloc::$1 ] { { prepend::x#0 = main::i#2 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a +Statement [54] alloc::return#0 = heap + alloc::$1 [ free_#24 alloc::return#0 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 prepend::x#0 free_#24 alloc::return#0 ] { { prepend::x#0 = main::i#2 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a Statement [64] print_line_cursor#0 = print_line_cursor#9 + $28 [ print_char_cursor#28 print_line_cursor#0 ] ( main:3::end:22::print_ln:51 [ print_char_cursor#28 print_line_cursor#0 ] { } ) always clobbers reg byte a Statement [65] if(print_line_cursor#0> 4 [ print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] ( main:3::end:22::print_uint:49::print_uchar:58 [ print_uint::w#0 print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60 [ print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte a Statement [71] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#28 print_uchar::$2 ] ( main:3::end:22::print_uint:49::print_uchar:58 [ print_uint::w#0 print_char_cursor#28 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60 [ print_char_cursor#28 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte a -Potential registers zp[1]:2 [ main::c#8 main::c#2 ] : zp[1]:2 , reg byte x , -Potential registers zp[2]:3 [ main::i#3 main::i#2 ] : zp[2]:3 , +Potential registers zp[1]:2 [ main::c#7 main::c#1 ] : zp[1]:2 , reg byte x , +Potential registers zp[2]:3 [ main::i#2 main::i#1 ] : zp[2]:3 , Potential registers zp[2]:5 [ free_#24 free_#14 ] : zp[2]:5 , Potential registers zp[2]:7 [ root#22 root#12 ] : zp[2]:7 , Potential registers zp[2]:9 [ sum::current#3 sum::current#1 sum::current#2 ] : zp[2]:9 , @@ -1441,7 +1425,7 @@ Uplift Scope [] 114,407.7: zp[2]:14 [ print_char_cursor#27 print_char_cursor#48 Uplift Scope [print_char] 160,310: zp[1]:13 [ print_char::ch#3 print_char::ch#2 print_char::ch#0 print_char::ch#1 ] Uplift Scope [print_uchar] 20,002: zp[1]:41 [ print_uchar::$0 ] 20,002: zp[1]:42 [ print_uchar::$2 ] 9,505: zp[1]:18 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] Uplift Scope [prepend] 6,667.33: zp[2]:29 [ prepend::new#1 ] 1,833.67: zp[2]:21 [ prepend::x#0 ] -Uplift Scope [main] 2,502.5: zp[2]:3 [ main::i#3 main::i#2 ] 168.33: zp[1]:2 [ main::c#8 main::c#2 ] 101: zp[2]:25 [ main::$5 ] +Uplift Scope [main] 2,502.5: zp[2]:3 [ main::i#2 main::i#1 ] 168.33: zp[1]:2 [ main::c#7 main::c#1 ] 101: zp[2]:25 [ main::$5 ] Uplift Scope [print_uint] 701: zp[2]:35 [ print_uint::w#0 ] Uplift Scope [RADIX] Uplift Scope [print_ln] @@ -1459,7 +1443,7 @@ Uplifting [] best 18498 combination zp[2]:14 [ print_char_cursor#27 print_char_c Uplifting [print_char] best 18459 combination reg byte a [ print_char::ch#3 print_char::ch#2 print_char::ch#0 print_char::ch#1 ] Uplifting [print_uchar] best 18441 combination reg byte a [ print_uchar::$0 ] reg byte x [ print_uchar::$2 ] reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] Uplifting [prepend] best 18441 combination zp[2]:29 [ prepend::new#1 ] zp[2]:21 [ prepend::x#0 ] -Uplifting [main] best 18351 combination zp[2]:3 [ main::i#3 main::i#2 ] reg byte x [ main::c#8 main::c#2 ] zp[2]:25 [ main::$5 ] +Uplifting [main] best 18351 combination zp[2]:3 [ main::i#2 main::i#1 ] reg byte x [ main::c#7 main::c#1 ] zp[2]:25 [ main::$5 ] Uplifting [print_uint] best 18351 combination zp[2]:35 [ print_uint::w#0 ] Uplifting [RADIX] best 18351 combination Uplifting [print_ln] best 18351 combination @@ -1470,7 +1454,7 @@ Uplifting [start] best 18351 combination Uplifting [end] best 18351 combination Uplifting [node] best 18351 combination Uplifting [__start] best 18351 combination -Coalescing zero page register [ zp[2]:3 [ main::i#3 main::i#2 ] ] with [ zp[2]:21 [ prepend::x#0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:3 [ main::i#2 main::i#1 ] ] with [ zp[2]:21 [ prepend::x#0 ] ] - score: 1 Coalescing zero page register [ zp[2]:7 [ root#22 root#12 ] ] with [ zp[2]:9 [ sum::current#3 sum::current#1 sum::current#2 ] ] - score: 1 Coalescing zero page register [ zp[2]:11 [ sum::s#3 sum::s#2 ] ] with [ zp[2]:23 [ sum::return#2 ] ] - score: 1 Coalescing zero page register [ zp[2]:27 [ alloc::return#2 ] ] with [ zp[2]:29 [ prepend::new#1 ] ] - score: 1 @@ -1479,12 +1463,12 @@ Coalescing zero page register [ zp[2]:33 [ Ticks#1 ] ] with [ zp[2]:35 [ print_u Coalescing zero page register [ zp[2]:11 [ sum::s#3 sum::s#2 sum::return#2 ] ] with [ zp[2]:25 [ main::$5 ] ] - score: 1 Coalescing zero page register [ zp[2]:27 [ alloc::return#2 prepend::new#1 alloc::return#0 ] ] with [ zp[2]:37 [ alloc::$1 ] ] - score: 1 Coalescing zero page register [ zp[2]:11 [ sum::s#3 sum::s#2 sum::return#2 main::$5 ] ] with [ zp[2]:5 [ free_#24 free_#14 ] ] -Coalescing zero page register [ zp[2]:16 [ print_line_cursor#9 print_line_cursor#0 ] ] with [ zp[2]:3 [ main::i#3 main::i#2 prepend::x#0 ] ] +Coalescing zero page register [ zp[2]:16 [ print_line_cursor#9 print_line_cursor#0 ] ] with [ zp[2]:3 [ main::i#2 main::i#1 prepend::x#0 ] ] Coalescing zero page register [ zp[2]:31 [ Ticks#0 ] ] with [ zp[2]:27 [ alloc::return#2 prepend::new#1 alloc::return#0 alloc::$1 ] ] Allocated (was zp[2]:7) zp[2]:2 [ root#22 root#12 sum::current#3 sum::current#1 sum::current#2 ] Allocated (was zp[2]:11) zp[2]:4 [ sum::s#3 sum::s#2 sum::return#2 main::$5 free_#24 free_#14 ] Allocated (was zp[2]:14) zp[2]:6 [ print_char_cursor#27 print_char_cursor#48 print_char_cursor#28 ] -Allocated (was zp[2]:16) zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#3 main::i#2 prepend::x#0 ] +Allocated (was zp[2]:16) zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#2 main::i#1 prepend::x#0 ] Allocated (was zp[2]:19) zp[2]:10 [ last_time ] Allocated (was zp[2]:31) zp[2]:12 [ Ticks#0 alloc::return#2 prepend::new#1 alloc::return#0 alloc::$1 ] Allocated (was zp[2]:33) zp[2]:14 [ Ticks#1 print_uint::w#0 ] @@ -1546,7 +1530,7 @@ main: { jsr start // [7] phi from main to main::@1 [phi:main->main::@1] __b1_from_main: - // [7] phi main::c#8 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 + // [7] phi main::c#7 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 ldx #0 // [7] phi print_char_cursor#48 = print_screen#0 [phi:main->main::@1#1] -- pbuz1=pbuc1 lda #main::@1] __b1_from___b7: - // [7] phi main::c#8 = main::c#2 [phi:main::@7->main::@1#0] -- register_copy + // [7] phi main::c#7 = main::c#1 [phi:main::@7->main::@1#0] -- register_copy // [7] phi print_char_cursor#48 = print_char_cursor#28 [phi:main::@7->main::@1#1] -- register_copy jmp __b1 // main::@1 @@ -1573,7 +1557,7 @@ main: { sta.z free_ lda #>0 sta.z free_+1 - // [8] phi main::i#3 = 0 [phi:main::@1->main::@2#2] -- vwuz1=vbuc1 + // [8] phi main::i#2 = 0 [phi:main::@1->main::@2#2] -- vwuz1=vwuc1 lda #<0 sta.z i lda #>0 @@ -1583,11 +1567,11 @@ main: { __b2_from___b5: // [8] phi root#22 = root#12 [phi:main::@5->main::@2#0] -- register_copy // [8] phi free_#24 = free_#14 [phi:main::@5->main::@2#1] -- register_copy - // [8] phi main::i#3 = main::i#2 [phi:main::@5->main::@2#2] -- register_copy + // [8] phi main::i#2 = main::i#1 [phi:main::@5->main::@2#2] -- register_copy jmp __b2 // main::@2 __b2: - // [9] prepend::x#0 = main::i#3 + // [9] prepend::x#0 = main::i#2 // [10] call prepend // [26] phi from main::@2 to prepend [phi:main::@2->prepend] prepend_from___b2: @@ -1595,12 +1579,12 @@ main: { jmp __b5 // main::@5 __b5: - // [11] main::i#2 = ++ main::i#3 -- vwuz1=_inc_vwuz1 + // [11] main::i#1 = ++ main::i#2 -- vwuz1=_inc_vwuz1 inc.z i bne !+ inc.z i+1 !: - // [12] if(main::i#2!=$bb8) goto main::@2 -- vwuz1_neq_vwuc1_then_la1 + // [12] if(main::i#1!=$bb8) goto main::@2 -- vwuz1_neq_vwuc1_then_la1 lda.z i+1 cmp #>$bb8 bne __b2_from___b5 @@ -1630,9 +1614,9 @@ main: { jmp __b7 // main::@7 __b7: - // [19] main::c#2 = ++ main::c#8 -- vbuxx=_inc_vbuxx + // [19] main::c#1 = ++ main::c#7 -- vbuxx=_inc_vbuxx inx - // [20] if(main::c#2!=5) goto main::@1 -- vbuxx_neq_vbuc1_then_la1 + // [20] if(main::c#1!=5) goto main::@1 -- vbuxx_neq_vbuc1_then_la1 cpx #5 bne __b1_from___b7 // [21] phi from main::@7 to main::@4 [phi:main::@7->main::@4] @@ -2077,11 +2061,11 @@ volatile word last_time loadstore zp[2]:10 18.454545454545453 void main() word~ main::$5 zp[2]:4 101.0 byte main::c -byte main::c#2 reg byte x 151.5 -byte main::c#8 reg byte x 16.833333333333332 +byte main::c#1 reg byte x 151.5 +byte main::c#7 reg byte x 16.833333333333332 word main::i -word main::i#2 i zp[2]:8 1501.5 -word main::i#3 i zp[2]:8 1001.0 +word main::i#1 i zp[2]:8 1501.5 +word main::i#2 i zp[2]:8 1001.0 void prepend(word prepend::x) struct node* prepend::new struct node* prepend::new#1 new zp[2]:12 6667.333333333333 @@ -2130,12 +2114,12 @@ word sum::s word sum::s#2 s zp[2]:4 100001.0 word sum::s#3 s zp[2]:4 50025.75 -reg byte x [ main::c#8 main::c#2 ] +reg byte x [ main::c#7 main::c#1 ] zp[2]:2 [ root#22 root#12 sum::current#3 sum::current#1 sum::current#2 ] zp[2]:4 [ sum::s#3 sum::s#2 sum::return#2 main::$5 free_#24 free_#14 ] reg byte a [ print_char::ch#3 print_char::ch#2 print_char::ch#0 print_char::ch#1 ] zp[2]:6 [ print_char_cursor#27 print_char_cursor#48 print_char_cursor#28 ] -zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#3 main::i#2 prepend::x#0 ] +zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#2 main::i#1 prepend::x#0 ] reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] zp[2]:10 [ last_time ] zp[2]:12 [ Ticks#0 alloc::return#2 prepend::new#1 alloc::return#0 alloc::$1 ] @@ -2195,7 +2179,7 @@ main: { // [6] call start jsr start // [7] phi from main to main::@1 [phi:main->main::@1] - // [7] phi main::c#8 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 + // [7] phi main::c#7 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 ldx #0 // [7] phi print_char_cursor#48 = print_screen#0 [phi:main->main::@1#1] -- pbuz1=pbuc1 lda #print_screen sta.z print_char_cursor+1 // [7] phi from main::@7 to main::@1 [phi:main::@7->main::@1] - // [7] phi main::c#8 = main::c#2 [phi:main::@7->main::@1#0] -- register_copy + // [7] phi main::c#7 = main::c#1 [phi:main::@7->main::@1#0] -- register_copy // [7] phi print_char_cursor#48 = print_char_cursor#28 [phi:main::@7->main::@1#1] -- register_copy // main::@1 __b1: @@ -2215,28 +2199,28 @@ main: { // [8] phi free_#24 = 0 [phi:main::@1->main::@2#1] -- vwuz1=vbuc1 sta.z free_ sta.z free_+1 - // [8] phi main::i#3 = 0 [phi:main::@1->main::@2#2] -- vwuz1=vbuc1 + // [8] phi main::i#2 = 0 [phi:main::@1->main::@2#2] -- vwuz1=vwuc1 sta.z i sta.z i+1 // [8] phi from main::@5 to main::@2 [phi:main::@5->main::@2] // [8] phi root#22 = root#12 [phi:main::@5->main::@2#0] -- register_copy // [8] phi free_#24 = free_#14 [phi:main::@5->main::@2#1] -- register_copy - // [8] phi main::i#3 = main::i#2 [phi:main::@5->main::@2#2] -- register_copy + // [8] phi main::i#2 = main::i#1 [phi:main::@5->main::@2#2] -- register_copy // main::@2 __b2: // prepend(i) - // [9] prepend::x#0 = main::i#3 + // [9] prepend::x#0 = main::i#2 // [10] call prepend // [26] phi from main::@2 to prepend [phi:main::@2->prepend] jsr prepend // main::@5 - // for(i : 0..2999) - // [11] main::i#2 = ++ main::i#3 -- vwuz1=_inc_vwuz1 + // for(unsigned int i : 0..2999) + // [11] main::i#1 = ++ main::i#2 -- vwuz1=_inc_vwuz1 inc.z i bne !+ inc.z i+1 !: - // [12] if(main::i#2!=$bb8) goto main::@2 -- vwuz1_neq_vwuc1_then_la1 + // [12] if(main::i#1!=$bb8) goto main::@2 -- vwuz1_neq_vwuc1_then_la1 lda.z i+1 cmp #>$bb8 bne __b2 @@ -2260,10 +2244,10 @@ main: { // [40] phi print_char::ch#3 = print_char::ch#2 [phi:main::@6->print_char#1] -- register_copy jsr print_char // main::@7 - // for(c : 0..4) - // [19] main::c#2 = ++ main::c#8 -- vbuxx=_inc_vbuxx + // for(unsigned char c : 0..4) + // [19] main::c#1 = ++ main::c#7 -- vbuxx=_inc_vbuxx inx - // [20] if(main::c#2!=5) goto main::@1 -- vbuxx_neq_vbuc1_then_la1 + // [20] if(main::c#1!=5) goto main::@1 -- vbuxx_neq_vbuc1_then_la1 cpx #5 bne __b1 // [21] phi from main::@7 to main::@4 [phi:main::@7->main::@4] diff --git a/src/test/ref/millfork-benchmarks/linkedlist-kc.sym b/src/test/ref/millfork-benchmarks/linkedlist-kc.sym index d03f363bf..917bc0051 100644 --- a/src/test/ref/millfork-benchmarks/linkedlist-kc.sym +++ b/src/test/ref/millfork-benchmarks/linkedlist-kc.sym @@ -22,11 +22,11 @@ volatile word last_time loadstore zp[2]:10 18.454545454545453 void main() word~ main::$5 zp[2]:4 101.0 byte main::c -byte main::c#2 reg byte x 151.5 -byte main::c#8 reg byte x 16.833333333333332 +byte main::c#1 reg byte x 151.5 +byte main::c#7 reg byte x 16.833333333333332 word main::i -word main::i#2 i zp[2]:8 1501.5 -word main::i#3 i zp[2]:8 1001.0 +word main::i#1 i zp[2]:8 1501.5 +word main::i#2 i zp[2]:8 1001.0 void prepend(word prepend::x) struct node* prepend::new struct node* prepend::new#1 new zp[2]:12 6667.333333333333 @@ -75,12 +75,12 @@ word sum::s word sum::s#2 s zp[2]:4 100001.0 word sum::s#3 s zp[2]:4 50025.75 -reg byte x [ main::c#8 main::c#2 ] +reg byte x [ main::c#7 main::c#1 ] zp[2]:2 [ root#22 root#12 sum::current#3 sum::current#1 sum::current#2 ] zp[2]:4 [ sum::s#3 sum::s#2 sum::return#2 main::$5 free_#24 free_#14 ] reg byte a [ print_char::ch#3 print_char::ch#2 print_char::ch#0 print_char::ch#1 ] zp[2]:6 [ print_char_cursor#27 print_char_cursor#48 print_char_cursor#28 ] -zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#3 main::i#2 prepend::x#0 ] +zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#2 main::i#1 prepend::x#0 ] reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] zp[2]:10 [ last_time ] zp[2]:12 [ Ticks#0 alloc::return#2 prepend::new#1 alloc::return#0 alloc::$1 ]