From 4c71a7ee827b1c6ddeba119d159f654a6e09de77 Mon Sep 17 00:00:00 2001 From: techticks <65084428+tech-ticks@users.noreply.github.com> Date: Fri, 19 Jul 2024 18:01:25 +0200 Subject: [PATCH] Allow multiple operations in `with` blocks (#45) * Allow multiple operations in `with` blocks * Update docs * Add tests, fix miss-indentation --------- Co-authored-by: Capypara --- docs/language_spec.rst | 8 +- explorerscript/antlr/ExplorerScript.g4 | 3 +- explorerscript/antlr/ExplorerScript.interp | 2 +- explorerscript/antlr/ExplorerScriptParser.py | 1088 +++++++++-------- .../compile_handlers/blocks/ctxs/ctx_block.py | 73 +- tests/compiler/entity_context_test.py | 127 ++ 6 files changed, 724 insertions(+), 577 deletions(-) create mode 100644 tests/compiler/entity_context_test.py diff --git a/docs/language_spec.rst b/docs/language_spec.rst index fd2363f..193a576 100644 --- a/docs/language_spec.rst +++ b/docs/language_spec.rst @@ -368,15 +368,19 @@ with-Blocks ~~~~~~~~~~~ Runs a statement in the context of an actor, an object or a performer. Only simple statements are allowed, no blocks -or labels. The blocks can only contain exactly one statement. +or labels. The keywords ``actor``, ``object`` or ``performer`` can be used to specify the type. As identifiers for their IDs integers and constants can be used. +``with`` blocks can contain multiple operations for convenience, +but unlike code in targeted routines, operations in the block are +not executed concurrently. .. code:: ExplorerScript with (actor ACTOR_HELLO_WORLD) { - operation(); + operation1(); + operation2(); } if-Blocks diff --git a/explorerscript/antlr/ExplorerScript.g4 b/explorerscript/antlr/ExplorerScript.g4 index c3a404f..867e28b 100644 --- a/explorerscript/antlr/ExplorerScript.g4 +++ b/explorerscript/antlr/ExplorerScript.g4 @@ -45,9 +45,8 @@ jump: JUMP AT IDENTIFIER; call: CALL AT IDENTIFIER; macro_call: MACRO_CALL OPEN_PAREN arglist? CLOSE_PAREN ';'; -// a ctx block needs exactly one simple statement, we enforce this on parser level. // warning: the parser also accepts labels, which isn't valid! -ctx_block: WITH OPEN_PAREN ctx_header CLOSE_PAREN OPEN_BRACE simple_stmt CLOSE_BRACE; +ctx_block: WITH OPEN_PAREN ctx_header CLOSE_PAREN OPEN_BRACE simple_stmt* CLOSE_BRACE; if_block: IF NOT? OPEN_PAREN if_header (OR if_header)* CLOSE_PAREN OPEN_BRACE stmt* CLOSE_BRACE elseif_block* else_block?; elseif_block: ELSEIF NOT? OPEN_PAREN if_header (OR if_header)* CLOSE_PAREN OPEN_BRACE stmt* CLOSE_BRACE; diff --git a/explorerscript/antlr/ExplorerScript.interp b/explorerscript/antlr/ExplorerScript.interp index 8948681..63cc89d 100644 --- a/explorerscript/antlr/ExplorerScript.interp +++ b/explorerscript/antlr/ExplorerScript.interp @@ -252,4 +252,4 @@ for_target_def_target atn: -[4, 1, 89, 637, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 1, 0, 5, 0, 134, 8, 0, 10, 0, 12, 0, 137, 9, 0, 1, 0, 1, 0, 5, 0, 141, 8, 0, 10, 0, 12, 0, 144, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 156, 8, 2, 1, 2, 1, 2, 5, 2, 160, 8, 2, 10, 2, 12, 2, 163, 9, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 177, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 185, 8, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 3, 8, 202, 8, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 3, 10, 217, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 223, 8, 10, 10, 10, 12, 10, 226, 9, 10, 1, 10, 1, 10, 1, 10, 5, 10, 231, 8, 10, 10, 10, 12, 10, 234, 9, 10, 1, 10, 1, 10, 5, 10, 238, 8, 10, 10, 10, 12, 10, 241, 9, 10, 1, 10, 3, 10, 244, 8, 10, 1, 11, 1, 11, 3, 11, 248, 8, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 254, 8, 11, 10, 11, 12, 11, 257, 9, 11, 1, 11, 1, 11, 1, 11, 5, 11, 262, 8, 11, 10, 11, 12, 11, 265, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 5, 12, 272, 8, 12, 10, 12, 12, 12, 275, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 284, 8, 13, 1, 14, 3, 14, 287, 8, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 295, 8, 15, 1, 16, 3, 16, 298, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 320, 8, 18, 10, 18, 12, 18, 323, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 334, 8, 19, 10, 19, 12, 19, 337, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 345, 8, 20, 10, 20, 12, 20, 348, 9, 20, 1, 20, 3, 20, 351, 8, 20, 1, 21, 1, 21, 1, 21, 5, 21, 356, 8, 21, 10, 21, 12, 21, 359, 9, 21, 1, 21, 3, 21, 362, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 370, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 395, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 3, 30, 410, 8, 30, 1, 31, 1, 31, 1, 31, 5, 31, 415, 8, 31, 10, 31, 12, 31, 418, 9, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 431, 8, 32, 10, 32, 12, 32, 434, 9, 32, 1, 32, 1, 32, 1, 33, 1, 33, 3, 33, 440, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 447, 8, 33, 10, 33, 12, 33, 450, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 461, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 467, 8, 35, 1, 35, 1, 35, 1, 35, 3, 35, 472, 8, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 483, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 3, 46, 522, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 536, 8, 49, 1, 49, 1, 49, 3, 49, 540, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 3, 51, 548, 8, 51, 1, 51, 1, 51, 3, 51, 552, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 4, 53, 562, 8, 53, 11, 53, 12, 53, 563, 1, 53, 3, 53, 567, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 5, 55, 578, 8, 55, 10, 55, 12, 55, 581, 9, 55, 1, 55, 3, 55, 584, 8, 55, 1, 56, 1, 56, 1, 56, 3, 56, 589, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 3, 60, 607, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 613, 8, 61, 10, 61, 12, 61, 616, 9, 61, 1, 61, 3, 61, 619, 8, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 3, 65, 635, 8, 65, 1, 65, 0, 0, 66, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 0, 9, 1, 0, 30, 35, 1, 0, 37, 39, 1, 0, 53, 54, 2, 0, 2, 3, 5, 13, 2, 0, 4, 4, 14, 17, 3, 0, 70, 71, 73, 73, 87, 87, 2, 0, 73, 73, 87, 87, 1, 0, 83, 84, 1, 0, 58, 59, 651, 0, 135, 1, 0, 0, 0, 2, 147, 1, 0, 0, 0, 4, 151, 1, 0, 0, 0, 6, 176, 1, 0, 0, 0, 8, 184, 1, 0, 0, 0, 10, 188, 1, 0, 0, 0, 12, 190, 1, 0, 0, 0, 14, 194, 1, 0, 0, 0, 16, 198, 1, 0, 0, 0, 18, 206, 1, 0, 0, 0, 20, 214, 1, 0, 0, 0, 22, 245, 1, 0, 0, 0, 24, 268, 1, 0, 0, 0, 26, 283, 1, 0, 0, 0, 28, 286, 1, 0, 0, 0, 30, 290, 1, 0, 0, 0, 32, 297, 1, 0, 0, 0, 34, 304, 1, 0, 0, 0, 36, 312, 1, 0, 0, 0, 38, 326, 1, 0, 0, 0, 40, 340, 1, 0, 0, 0, 42, 352, 1, 0, 0, 0, 44, 369, 1, 0, 0, 0, 46, 371, 1, 0, 0, 0, 48, 376, 1, 0, 0, 0, 50, 381, 1, 0, 0, 0, 52, 386, 1, 0, 0, 0, 54, 394, 1, 0, 0, 0, 56, 396, 1, 0, 0, 0, 58, 401, 1, 0, 0, 0, 60, 406, 1, 0, 0, 0, 62, 411, 1, 0, 0, 0, 64, 421, 1, 0, 0, 0, 66, 437, 1, 0, 0, 0, 68, 460, 1, 0, 0, 0, 70, 462, 1, 0, 0, 0, 72, 473, 1, 0, 0, 0, 74, 476, 1, 0, 0, 0, 76, 479, 1, 0, 0, 0, 78, 484, 1, 0, 0, 0, 80, 488, 1, 0, 0, 0, 82, 495, 1, 0, 0, 0, 84, 504, 1, 0, 0, 0, 86, 509, 1, 0, 0, 0, 88, 514, 1, 0, 0, 0, 90, 516, 1, 0, 0, 0, 92, 521, 1, 0, 0, 0, 94, 523, 1, 0, 0, 0, 96, 527, 1, 0, 0, 0, 98, 531, 1, 0, 0, 0, 100, 543, 1, 0, 0, 0, 102, 545, 1, 0, 0, 0, 104, 555, 1, 0, 0, 0, 106, 559, 1, 0, 0, 0, 108, 570, 1, 0, 0, 0, 110, 574, 1, 0, 0, 0, 112, 588, 1, 0, 0, 0, 114, 590, 1, 0, 0, 0, 116, 599, 1, 0, 0, 0, 118, 601, 1, 0, 0, 0, 120, 606, 1, 0, 0, 0, 122, 608, 1, 0, 0, 0, 124, 622, 1, 0, 0, 0, 126, 626, 1, 0, 0, 0, 128, 628, 1, 0, 0, 0, 130, 634, 1, 0, 0, 0, 132, 134, 3, 2, 1, 0, 133, 132, 1, 0, 0, 0, 134, 137, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 142, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 138, 141, 3, 4, 2, 0, 139, 141, 3, 92, 46, 0, 140, 138, 1, 0, 0, 0, 140, 139, 1, 0, 0, 0, 141, 144, 1, 0, 0, 0, 142, 140, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 145, 1, 0, 0, 0, 144, 142, 1, 0, 0, 0, 145, 146, 5, 0, 0, 1, 146, 1, 1, 0, 0, 0, 147, 148, 5, 22, 0, 0, 148, 149, 5, 58, 0, 0, 149, 150, 5, 1, 0, 0, 150, 3, 1, 0, 0, 0, 151, 152, 5, 23, 0, 0, 152, 153, 5, 70, 0, 0, 153, 155, 5, 78, 0, 0, 154, 156, 5, 71, 0, 0, 155, 154, 1, 0, 0, 0, 155, 156, 1, 0, 0, 0, 156, 161, 1, 0, 0, 0, 157, 158, 5, 80, 0, 0, 158, 160, 5, 71, 0, 0, 159, 157, 1, 0, 0, 0, 160, 163, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 164, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, 164, 165, 5, 79, 0, 0, 165, 166, 3, 106, 53, 0, 166, 5, 1, 0, 0, 0, 167, 177, 3, 8, 4, 0, 168, 177, 3, 18, 9, 0, 169, 177, 3, 20, 10, 0, 170, 177, 3, 36, 18, 0, 171, 177, 3, 38, 19, 0, 172, 177, 3, 62, 31, 0, 173, 177, 3, 64, 32, 0, 174, 177, 3, 66, 33, 0, 175, 177, 3, 16, 8, 0, 176, 167, 1, 0, 0, 0, 176, 168, 1, 0, 0, 0, 176, 169, 1, 0, 0, 0, 176, 170, 1, 0, 0, 0, 176, 171, 1, 0, 0, 0, 176, 172, 1, 0, 0, 0, 176, 173, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 176, 175, 1, 0, 0, 0, 177, 7, 1, 0, 0, 0, 178, 185, 3, 102, 51, 0, 179, 185, 3, 118, 59, 0, 180, 185, 3, 10, 5, 0, 181, 185, 3, 12, 6, 0, 182, 185, 3, 14, 7, 0, 183, 185, 3, 68, 34, 0, 184, 178, 1, 0, 0, 0, 184, 179, 1, 0, 0, 0, 184, 180, 1, 0, 0, 0, 184, 181, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 5, 1, 0, 0, 187, 9, 1, 0, 0, 0, 188, 189, 7, 0, 0, 0, 189, 11, 1, 0, 0, 0, 190, 191, 5, 20, 0, 0, 191, 192, 5, 83, 0, 0, 192, 193, 5, 70, 0, 0, 193, 13, 1, 0, 0, 0, 194, 195, 5, 21, 0, 0, 195, 196, 5, 83, 0, 0, 196, 197, 5, 70, 0, 0, 197, 15, 1, 0, 0, 0, 198, 199, 5, 72, 0, 0, 199, 201, 5, 78, 0, 0, 200, 202, 3, 110, 55, 0, 201, 200, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 204, 5, 79, 0, 0, 204, 205, 5, 1, 0, 0, 205, 17, 1, 0, 0, 0, 206, 207, 5, 28, 0, 0, 207, 208, 5, 78, 0, 0, 208, 209, 3, 128, 64, 0, 209, 210, 5, 79, 0, 0, 210, 211, 5, 85, 0, 0, 211, 212, 3, 8, 4, 0, 212, 213, 5, 86, 0, 0, 213, 19, 1, 0, 0, 0, 214, 216, 5, 24, 0, 0, 215, 217, 5, 19, 0, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, 5, 78, 0, 0, 219, 224, 3, 26, 13, 0, 220, 221, 5, 18, 0, 0, 221, 223, 3, 26, 13, 0, 222, 220, 1, 0, 0, 0, 223, 226, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 225, 1, 0, 0, 0, 225, 227, 1, 0, 0, 0, 226, 224, 1, 0, 0, 0, 227, 228, 5, 79, 0, 0, 228, 232, 5, 85, 0, 0, 229, 231, 3, 6, 3, 0, 230, 229, 1, 0, 0, 0, 231, 234, 1, 0, 0, 0, 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 235, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 235, 239, 5, 86, 0, 0, 236, 238, 3, 22, 11, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 243, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 244, 3, 24, 12, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 21, 1, 0, 0, 0, 245, 247, 5, 25, 0, 0, 246, 248, 5, 19, 0, 0, 247, 246, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 250, 5, 78, 0, 0, 250, 255, 3, 26, 13, 0, 251, 252, 5, 18, 0, 0, 252, 254, 3, 26, 13, 0, 253, 251, 1, 0, 0, 0, 254, 257, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 258, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 258, 259, 5, 79, 0, 0, 259, 263, 5, 85, 0, 0, 260, 262, 3, 6, 3, 0, 261, 260, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 266, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 266, 267, 5, 86, 0, 0, 267, 23, 1, 0, 0, 0, 268, 269, 5, 26, 0, 0, 269, 273, 5, 85, 0, 0, 270, 272, 3, 6, 3, 0, 271, 270, 1, 0, 0, 0, 272, 275, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 276, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 276, 277, 5, 86, 0, 0, 277, 25, 1, 0, 0, 0, 278, 284, 3, 30, 15, 0, 279, 284, 3, 32, 16, 0, 280, 284, 3, 28, 14, 0, 281, 284, 3, 34, 17, 0, 282, 284, 3, 102, 51, 0, 283, 278, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 283, 280, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 283, 282, 1, 0, 0, 0, 284, 27, 1, 0, 0, 0, 285, 287, 5, 19, 0, 0, 286, 285, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 289, 7, 1, 0, 0, 289, 29, 1, 0, 0, 0, 290, 291, 3, 100, 50, 0, 291, 294, 3, 88, 44, 0, 292, 295, 3, 84, 42, 0, 293, 295, 3, 100, 50, 0, 294, 292, 1, 0, 0, 0, 294, 293, 1, 0, 0, 0, 295, 31, 1, 0, 0, 0, 296, 298, 5, 19, 0, 0, 297, 296, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 300, 3, 100, 50, 0, 300, 301, 5, 56, 0, 0, 301, 302, 5, 73, 0, 0, 302, 303, 5, 57, 0, 0, 303, 33, 1, 0, 0, 0, 304, 305, 3, 86, 43, 0, 305, 306, 3, 88, 44, 0, 306, 307, 5, 56, 0, 0, 307, 308, 5, 73, 0, 0, 308, 309, 5, 80, 0, 0, 309, 310, 5, 73, 0, 0, 310, 311, 5, 57, 0, 0, 311, 35, 1, 0, 0, 0, 312, 313, 5, 29, 0, 0, 313, 314, 5, 78, 0, 0, 314, 315, 3, 44, 22, 0, 315, 316, 5, 79, 0, 0, 316, 321, 5, 85, 0, 0, 317, 320, 3, 42, 21, 0, 318, 320, 3, 40, 20, 0, 319, 317, 1, 0, 0, 0, 319, 318, 1, 0, 0, 0, 320, 323, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 324, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 324, 325, 5, 86, 0, 0, 325, 37, 1, 0, 0, 0, 326, 327, 7, 2, 0, 0, 327, 328, 5, 78, 0, 0, 328, 329, 3, 100, 50, 0, 329, 330, 5, 79, 0, 0, 330, 335, 5, 85, 0, 0, 331, 334, 3, 42, 21, 0, 332, 334, 3, 40, 20, 0, 333, 331, 1, 0, 0, 0, 333, 332, 1, 0, 0, 0, 334, 337, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 338, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 338, 339, 5, 86, 0, 0, 339, 39, 1, 0, 0, 0, 340, 341, 5, 45, 0, 0, 341, 342, 3, 54, 27, 0, 342, 350, 5, 81, 0, 0, 343, 345, 3, 6, 3, 0, 344, 343, 1, 0, 0, 0, 345, 348, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 351, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 349, 351, 3, 120, 60, 0, 350, 346, 1, 0, 0, 0, 350, 349, 1, 0, 0, 0, 351, 41, 1, 0, 0, 0, 352, 353, 5, 46, 0, 0, 353, 361, 5, 81, 0, 0, 354, 356, 3, 6, 3, 0, 355, 354, 1, 0, 0, 0, 356, 359, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 362, 1, 0, 0, 0, 359, 357, 1, 0, 0, 0, 360, 362, 3, 120, 60, 0, 361, 357, 1, 0, 0, 0, 361, 360, 1, 0, 0, 0, 362, 43, 1, 0, 0, 0, 363, 370, 3, 100, 50, 0, 364, 370, 3, 102, 51, 0, 365, 370, 3, 46, 23, 0, 366, 370, 3, 48, 24, 0, 367, 370, 3, 50, 25, 0, 368, 370, 3, 52, 26, 0, 369, 363, 1, 0, 0, 0, 369, 364, 1, 0, 0, 0, 369, 365, 1, 0, 0, 0, 369, 366, 1, 0, 0, 0, 369, 367, 1, 0, 0, 0, 369, 368, 1, 0, 0, 0, 370, 45, 1, 0, 0, 0, 371, 372, 3, 86, 43, 0, 372, 373, 5, 56, 0, 0, 373, 374, 5, 73, 0, 0, 374, 375, 5, 57, 0, 0, 375, 47, 1, 0, 0, 0, 376, 377, 5, 40, 0, 0, 377, 378, 5, 78, 0, 0, 378, 379, 3, 100, 50, 0, 379, 380, 5, 79, 0, 0, 380, 49, 1, 0, 0, 0, 381, 382, 5, 42, 0, 0, 382, 383, 5, 78, 0, 0, 383, 384, 3, 100, 50, 0, 384, 385, 5, 79, 0, 0, 385, 51, 1, 0, 0, 0, 386, 387, 5, 41, 0, 0, 387, 388, 5, 78, 0, 0, 388, 389, 5, 79, 0, 0, 389, 53, 1, 0, 0, 0, 390, 395, 3, 100, 50, 0, 391, 395, 3, 56, 28, 0, 392, 395, 3, 58, 29, 0, 393, 395, 3, 60, 30, 0, 394, 390, 1, 0, 0, 0, 394, 391, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 393, 1, 0, 0, 0, 395, 55, 1, 0, 0, 0, 396, 397, 5, 44, 0, 0, 397, 398, 5, 78, 0, 0, 398, 399, 3, 120, 60, 0, 399, 400, 5, 79, 0, 0, 400, 57, 1, 0, 0, 0, 401, 402, 5, 43, 0, 0, 402, 403, 5, 78, 0, 0, 403, 404, 3, 100, 50, 0, 404, 405, 5, 79, 0, 0, 405, 59, 1, 0, 0, 0, 406, 409, 3, 88, 44, 0, 407, 410, 3, 84, 42, 0, 408, 410, 3, 100, 50, 0, 409, 407, 1, 0, 0, 0, 409, 408, 1, 0, 0, 0, 410, 61, 1, 0, 0, 0, 411, 412, 5, 27, 0, 0, 412, 416, 5, 85, 0, 0, 413, 415, 3, 6, 3, 0, 414, 413, 1, 0, 0, 0, 415, 418, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 419, 420, 5, 86, 0, 0, 420, 63, 1, 0, 0, 0, 421, 422, 5, 67, 0, 0, 422, 423, 5, 78, 0, 0, 423, 424, 3, 8, 4, 0, 424, 425, 3, 26, 13, 0, 425, 426, 5, 1, 0, 0, 426, 427, 3, 8, 4, 0, 427, 428, 5, 79, 0, 0, 428, 432, 5, 85, 0, 0, 429, 431, 3, 6, 3, 0, 430, 429, 1, 0, 0, 0, 431, 434, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 435, 436, 5, 86, 0, 0, 436, 65, 1, 0, 0, 0, 437, 439, 5, 55, 0, 0, 438, 440, 5, 19, 0, 0, 439, 438, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 5, 78, 0, 0, 442, 443, 3, 26, 13, 0, 443, 444, 5, 79, 0, 0, 444, 448, 5, 85, 0, 0, 445, 447, 3, 6, 3, 0, 446, 445, 1, 0, 0, 0, 447, 450, 1, 0, 0, 0, 448, 446, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 451, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 451, 452, 5, 86, 0, 0, 452, 67, 1, 0, 0, 0, 453, 461, 3, 70, 35, 0, 454, 461, 3, 72, 36, 0, 455, 461, 3, 74, 37, 0, 456, 461, 3, 76, 38, 0, 457, 461, 3, 78, 39, 0, 458, 461, 3, 80, 40, 0, 459, 461, 3, 82, 41, 0, 460, 453, 1, 0, 0, 0, 460, 454, 1, 0, 0, 0, 460, 455, 1, 0, 0, 0, 460, 456, 1, 0, 0, 0, 460, 457, 1, 0, 0, 0, 460, 458, 1, 0, 0, 0, 460, 459, 1, 0, 0, 0, 461, 69, 1, 0, 0, 0, 462, 466, 3, 100, 50, 0, 463, 464, 5, 56, 0, 0, 464, 465, 5, 73, 0, 0, 465, 467, 5, 57, 0, 0, 466, 463, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 471, 3, 90, 45, 0, 469, 472, 3, 100, 50, 0, 470, 472, 3, 84, 42, 0, 471, 469, 1, 0, 0, 0, 471, 470, 1, 0, 0, 0, 472, 71, 1, 0, 0, 0, 473, 474, 5, 47, 0, 0, 474, 475, 3, 100, 50, 0, 475, 73, 1, 0, 0, 0, 476, 477, 5, 49, 0, 0, 477, 478, 3, 100, 50, 0, 478, 75, 1, 0, 0, 0, 479, 482, 5, 48, 0, 0, 480, 483, 5, 51, 0, 0, 481, 483, 3, 86, 43, 0, 482, 480, 1, 0, 0, 0, 482, 481, 1, 0, 0, 0, 483, 77, 1, 0, 0, 0, 484, 485, 5, 52, 0, 0, 485, 486, 5, 4, 0, 0, 486, 487, 3, 100, 50, 0, 487, 79, 1, 0, 0, 0, 488, 489, 5, 42, 0, 0, 489, 490, 5, 78, 0, 0, 490, 491, 3, 100, 50, 0, 491, 492, 5, 79, 0, 0, 492, 493, 5, 4, 0, 0, 493, 494, 3, 100, 50, 0, 494, 81, 1, 0, 0, 0, 495, 496, 3, 100, 50, 0, 496, 497, 5, 4, 0, 0, 497, 498, 5, 50, 0, 0, 498, 499, 5, 56, 0, 0, 499, 500, 5, 73, 0, 0, 500, 501, 5, 80, 0, 0, 501, 502, 5, 73, 0, 0, 502, 503, 5, 57, 0, 0, 503, 83, 1, 0, 0, 0, 504, 505, 5, 36, 0, 0, 505, 506, 5, 78, 0, 0, 506, 507, 3, 100, 50, 0, 507, 508, 5, 79, 0, 0, 508, 85, 1, 0, 0, 0, 509, 510, 5, 50, 0, 0, 510, 511, 5, 78, 0, 0, 511, 512, 3, 100, 50, 0, 512, 513, 5, 79, 0, 0, 513, 87, 1, 0, 0, 0, 514, 515, 7, 3, 0, 0, 515, 89, 1, 0, 0, 0, 516, 517, 7, 4, 0, 0, 517, 91, 1, 0, 0, 0, 518, 522, 3, 96, 48, 0, 519, 522, 3, 94, 47, 0, 520, 522, 3, 98, 49, 0, 521, 518, 1, 0, 0, 0, 521, 519, 1, 0, 0, 0, 521, 520, 1, 0, 0, 0, 522, 93, 1, 0, 0, 0, 523, 524, 5, 62, 0, 0, 524, 525, 5, 73, 0, 0, 525, 526, 3, 106, 53, 0, 526, 95, 1, 0, 0, 0, 527, 528, 5, 61, 0, 0, 528, 529, 5, 70, 0, 0, 529, 530, 3, 106, 53, 0, 530, 97, 1, 0, 0, 0, 531, 532, 5, 62, 0, 0, 532, 533, 5, 73, 0, 0, 533, 535, 3, 130, 65, 0, 534, 536, 5, 78, 0, 0, 535, 534, 1, 0, 0, 0, 535, 536, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 539, 3, 100, 50, 0, 538, 540, 5, 79, 0, 0, 539, 538, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 3, 106, 53, 0, 542, 99, 1, 0, 0, 0, 543, 544, 7, 5, 0, 0, 544, 101, 1, 0, 0, 0, 545, 547, 5, 70, 0, 0, 546, 548, 3, 104, 52, 0, 547, 546, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 551, 5, 78, 0, 0, 550, 552, 3, 110, 55, 0, 551, 550, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 554, 5, 79, 0, 0, 554, 103, 1, 0, 0, 0, 555, 556, 5, 5, 0, 0, 556, 557, 3, 128, 64, 0, 557, 558, 5, 6, 0, 0, 558, 105, 1, 0, 0, 0, 559, 566, 5, 85, 0, 0, 560, 562, 3, 6, 3, 0, 561, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 561, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 567, 1, 0, 0, 0, 565, 567, 3, 108, 54, 0, 566, 561, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 569, 5, 86, 0, 0, 569, 107, 1, 0, 0, 0, 570, 571, 5, 66, 0, 0, 571, 572, 5, 68, 0, 0, 572, 573, 5, 1, 0, 0, 573, 109, 1, 0, 0, 0, 574, 579, 3, 112, 56, 0, 575, 576, 5, 80, 0, 0, 576, 578, 3, 112, 56, 0, 577, 575, 1, 0, 0, 0, 578, 581, 1, 0, 0, 0, 579, 577, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 583, 1, 0, 0, 0, 581, 579, 1, 0, 0, 0, 582, 584, 5, 80, 0, 0, 583, 582, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 111, 1, 0, 0, 0, 585, 589, 3, 100, 50, 0, 586, 589, 3, 120, 60, 0, 587, 589, 3, 114, 57, 0, 588, 585, 1, 0, 0, 0, 588, 586, 1, 0, 0, 0, 588, 587, 1, 0, 0, 0, 589, 113, 1, 0, 0, 0, 590, 591, 5, 69, 0, 0, 591, 592, 5, 5, 0, 0, 592, 593, 5, 58, 0, 0, 593, 594, 5, 80, 0, 0, 594, 595, 3, 116, 58, 0, 595, 596, 5, 80, 0, 0, 596, 597, 3, 116, 58, 0, 597, 598, 5, 6, 0, 0, 598, 115, 1, 0, 0, 0, 599, 600, 7, 6, 0, 0, 600, 117, 1, 0, 0, 0, 601, 602, 7, 7, 0, 0, 602, 603, 5, 70, 0, 0, 603, 119, 1, 0, 0, 0, 604, 607, 3, 126, 63, 0, 605, 607, 3, 122, 61, 0, 606, 604, 1, 0, 0, 0, 606, 605, 1, 0, 0, 0, 607, 121, 1, 0, 0, 0, 608, 609, 5, 85, 0, 0, 609, 614, 3, 124, 62, 0, 610, 611, 5, 80, 0, 0, 611, 613, 3, 124, 62, 0, 612, 610, 1, 0, 0, 0, 613, 616, 1, 0, 0, 0, 614, 612, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 618, 1, 0, 0, 0, 616, 614, 1, 0, 0, 0, 617, 619, 5, 80, 0, 0, 618, 617, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 621, 5, 86, 0, 0, 621, 123, 1, 0, 0, 0, 622, 623, 5, 70, 0, 0, 623, 624, 5, 4, 0, 0, 624, 625, 3, 126, 63, 0, 625, 125, 1, 0, 0, 0, 626, 627, 7, 8, 0, 0, 627, 127, 1, 0, 0, 0, 628, 629, 5, 70, 0, 0, 629, 630, 3, 100, 50, 0, 630, 129, 1, 0, 0, 0, 631, 632, 5, 67, 0, 0, 632, 635, 5, 70, 0, 0, 633, 635, 5, 60, 0, 0, 634, 631, 1, 0, 0, 0, 634, 633, 1, 0, 0, 0, 635, 131, 1, 0, 0, 0, 54, 135, 140, 142, 155, 161, 176, 184, 201, 216, 224, 232, 239, 243, 247, 255, 263, 273, 283, 286, 294, 297, 319, 321, 333, 335, 346, 350, 357, 361, 369, 394, 409, 416, 432, 439, 448, 460, 466, 471, 482, 521, 535, 539, 547, 551, 563, 566, 579, 583, 588, 606, 614, 618, 634] \ No newline at end of file +[4, 1, 89, 642, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 1, 0, 5, 0, 134, 8, 0, 10, 0, 12, 0, 137, 9, 0, 1, 0, 1, 0, 5, 0, 141, 8, 0, 10, 0, 12, 0, 144, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 156, 8, 2, 1, 2, 1, 2, 5, 2, 160, 8, 2, 10, 2, 12, 2, 163, 9, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 177, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 185, 8, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 3, 8, 202, 8, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 213, 8, 9, 10, 9, 12, 9, 216, 9, 9, 1, 9, 1, 9, 1, 10, 1, 10, 3, 10, 222, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 228, 8, 10, 10, 10, 12, 10, 231, 9, 10, 1, 10, 1, 10, 1, 10, 5, 10, 236, 8, 10, 10, 10, 12, 10, 239, 9, 10, 1, 10, 1, 10, 5, 10, 243, 8, 10, 10, 10, 12, 10, 246, 9, 10, 1, 10, 3, 10, 249, 8, 10, 1, 11, 1, 11, 3, 11, 253, 8, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 259, 8, 11, 10, 11, 12, 11, 262, 9, 11, 1, 11, 1, 11, 1, 11, 5, 11, 267, 8, 11, 10, 11, 12, 11, 270, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 5, 12, 277, 8, 12, 10, 12, 12, 12, 280, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 289, 8, 13, 1, 14, 3, 14, 292, 8, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 300, 8, 15, 1, 16, 3, 16, 303, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 325, 8, 18, 10, 18, 12, 18, 328, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 339, 8, 19, 10, 19, 12, 19, 342, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 350, 8, 20, 10, 20, 12, 20, 353, 9, 20, 1, 20, 3, 20, 356, 8, 20, 1, 21, 1, 21, 1, 21, 5, 21, 361, 8, 21, 10, 21, 12, 21, 364, 9, 21, 1, 21, 3, 21, 367, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 375, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 400, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 3, 30, 415, 8, 30, 1, 31, 1, 31, 1, 31, 5, 31, 420, 8, 31, 10, 31, 12, 31, 423, 9, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 436, 8, 32, 10, 32, 12, 32, 439, 9, 32, 1, 32, 1, 32, 1, 33, 1, 33, 3, 33, 445, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 452, 8, 33, 10, 33, 12, 33, 455, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 466, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 472, 8, 35, 1, 35, 1, 35, 1, 35, 3, 35, 477, 8, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 488, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 3, 46, 527, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 541, 8, 49, 1, 49, 1, 49, 3, 49, 545, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 3, 51, 553, 8, 51, 1, 51, 1, 51, 3, 51, 557, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 4, 53, 567, 8, 53, 11, 53, 12, 53, 568, 1, 53, 3, 53, 572, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 5, 55, 583, 8, 55, 10, 55, 12, 55, 586, 9, 55, 1, 55, 3, 55, 589, 8, 55, 1, 56, 1, 56, 1, 56, 3, 56, 594, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 3, 60, 612, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 618, 8, 61, 10, 61, 12, 61, 621, 9, 61, 1, 61, 3, 61, 624, 8, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 3, 65, 640, 8, 65, 1, 65, 0, 0, 66, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 0, 9, 1, 0, 30, 35, 1, 0, 37, 39, 1, 0, 53, 54, 2, 0, 2, 3, 5, 13, 2, 0, 4, 4, 14, 17, 3, 0, 70, 71, 73, 73, 87, 87, 2, 0, 73, 73, 87, 87, 1, 0, 83, 84, 1, 0, 58, 59, 657, 0, 135, 1, 0, 0, 0, 2, 147, 1, 0, 0, 0, 4, 151, 1, 0, 0, 0, 6, 176, 1, 0, 0, 0, 8, 184, 1, 0, 0, 0, 10, 188, 1, 0, 0, 0, 12, 190, 1, 0, 0, 0, 14, 194, 1, 0, 0, 0, 16, 198, 1, 0, 0, 0, 18, 206, 1, 0, 0, 0, 20, 219, 1, 0, 0, 0, 22, 250, 1, 0, 0, 0, 24, 273, 1, 0, 0, 0, 26, 288, 1, 0, 0, 0, 28, 291, 1, 0, 0, 0, 30, 295, 1, 0, 0, 0, 32, 302, 1, 0, 0, 0, 34, 309, 1, 0, 0, 0, 36, 317, 1, 0, 0, 0, 38, 331, 1, 0, 0, 0, 40, 345, 1, 0, 0, 0, 42, 357, 1, 0, 0, 0, 44, 374, 1, 0, 0, 0, 46, 376, 1, 0, 0, 0, 48, 381, 1, 0, 0, 0, 50, 386, 1, 0, 0, 0, 52, 391, 1, 0, 0, 0, 54, 399, 1, 0, 0, 0, 56, 401, 1, 0, 0, 0, 58, 406, 1, 0, 0, 0, 60, 411, 1, 0, 0, 0, 62, 416, 1, 0, 0, 0, 64, 426, 1, 0, 0, 0, 66, 442, 1, 0, 0, 0, 68, 465, 1, 0, 0, 0, 70, 467, 1, 0, 0, 0, 72, 478, 1, 0, 0, 0, 74, 481, 1, 0, 0, 0, 76, 484, 1, 0, 0, 0, 78, 489, 1, 0, 0, 0, 80, 493, 1, 0, 0, 0, 82, 500, 1, 0, 0, 0, 84, 509, 1, 0, 0, 0, 86, 514, 1, 0, 0, 0, 88, 519, 1, 0, 0, 0, 90, 521, 1, 0, 0, 0, 92, 526, 1, 0, 0, 0, 94, 528, 1, 0, 0, 0, 96, 532, 1, 0, 0, 0, 98, 536, 1, 0, 0, 0, 100, 548, 1, 0, 0, 0, 102, 550, 1, 0, 0, 0, 104, 560, 1, 0, 0, 0, 106, 564, 1, 0, 0, 0, 108, 575, 1, 0, 0, 0, 110, 579, 1, 0, 0, 0, 112, 593, 1, 0, 0, 0, 114, 595, 1, 0, 0, 0, 116, 604, 1, 0, 0, 0, 118, 606, 1, 0, 0, 0, 120, 611, 1, 0, 0, 0, 122, 613, 1, 0, 0, 0, 124, 627, 1, 0, 0, 0, 126, 631, 1, 0, 0, 0, 128, 633, 1, 0, 0, 0, 130, 639, 1, 0, 0, 0, 132, 134, 3, 2, 1, 0, 133, 132, 1, 0, 0, 0, 134, 137, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 142, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 138, 141, 3, 4, 2, 0, 139, 141, 3, 92, 46, 0, 140, 138, 1, 0, 0, 0, 140, 139, 1, 0, 0, 0, 141, 144, 1, 0, 0, 0, 142, 140, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 145, 1, 0, 0, 0, 144, 142, 1, 0, 0, 0, 145, 146, 5, 0, 0, 1, 146, 1, 1, 0, 0, 0, 147, 148, 5, 22, 0, 0, 148, 149, 5, 58, 0, 0, 149, 150, 5, 1, 0, 0, 150, 3, 1, 0, 0, 0, 151, 152, 5, 23, 0, 0, 152, 153, 5, 70, 0, 0, 153, 155, 5, 78, 0, 0, 154, 156, 5, 71, 0, 0, 155, 154, 1, 0, 0, 0, 155, 156, 1, 0, 0, 0, 156, 161, 1, 0, 0, 0, 157, 158, 5, 80, 0, 0, 158, 160, 5, 71, 0, 0, 159, 157, 1, 0, 0, 0, 160, 163, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 164, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, 164, 165, 5, 79, 0, 0, 165, 166, 3, 106, 53, 0, 166, 5, 1, 0, 0, 0, 167, 177, 3, 8, 4, 0, 168, 177, 3, 18, 9, 0, 169, 177, 3, 20, 10, 0, 170, 177, 3, 36, 18, 0, 171, 177, 3, 38, 19, 0, 172, 177, 3, 62, 31, 0, 173, 177, 3, 64, 32, 0, 174, 177, 3, 66, 33, 0, 175, 177, 3, 16, 8, 0, 176, 167, 1, 0, 0, 0, 176, 168, 1, 0, 0, 0, 176, 169, 1, 0, 0, 0, 176, 170, 1, 0, 0, 0, 176, 171, 1, 0, 0, 0, 176, 172, 1, 0, 0, 0, 176, 173, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 176, 175, 1, 0, 0, 0, 177, 7, 1, 0, 0, 0, 178, 185, 3, 102, 51, 0, 179, 185, 3, 118, 59, 0, 180, 185, 3, 10, 5, 0, 181, 185, 3, 12, 6, 0, 182, 185, 3, 14, 7, 0, 183, 185, 3, 68, 34, 0, 184, 178, 1, 0, 0, 0, 184, 179, 1, 0, 0, 0, 184, 180, 1, 0, 0, 0, 184, 181, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 5, 1, 0, 0, 187, 9, 1, 0, 0, 0, 188, 189, 7, 0, 0, 0, 189, 11, 1, 0, 0, 0, 190, 191, 5, 20, 0, 0, 191, 192, 5, 83, 0, 0, 192, 193, 5, 70, 0, 0, 193, 13, 1, 0, 0, 0, 194, 195, 5, 21, 0, 0, 195, 196, 5, 83, 0, 0, 196, 197, 5, 70, 0, 0, 197, 15, 1, 0, 0, 0, 198, 199, 5, 72, 0, 0, 199, 201, 5, 78, 0, 0, 200, 202, 3, 110, 55, 0, 201, 200, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 204, 5, 79, 0, 0, 204, 205, 5, 1, 0, 0, 205, 17, 1, 0, 0, 0, 206, 207, 5, 28, 0, 0, 207, 208, 5, 78, 0, 0, 208, 209, 3, 128, 64, 0, 209, 210, 5, 79, 0, 0, 210, 214, 5, 85, 0, 0, 211, 213, 3, 8, 4, 0, 212, 211, 1, 0, 0, 0, 213, 216, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 217, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 217, 218, 5, 86, 0, 0, 218, 19, 1, 0, 0, 0, 219, 221, 5, 24, 0, 0, 220, 222, 5, 19, 0, 0, 221, 220, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 224, 5, 78, 0, 0, 224, 229, 3, 26, 13, 0, 225, 226, 5, 18, 0, 0, 226, 228, 3, 26, 13, 0, 227, 225, 1, 0, 0, 0, 228, 231, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 229, 1, 0, 0, 0, 232, 233, 5, 79, 0, 0, 233, 237, 5, 85, 0, 0, 234, 236, 3, 6, 3, 0, 235, 234, 1, 0, 0, 0, 236, 239, 1, 0, 0, 0, 237, 235, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 240, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 240, 244, 5, 86, 0, 0, 241, 243, 3, 22, 11, 0, 242, 241, 1, 0, 0, 0, 243, 246, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 248, 1, 0, 0, 0, 246, 244, 1, 0, 0, 0, 247, 249, 3, 24, 12, 0, 248, 247, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 21, 1, 0, 0, 0, 250, 252, 5, 25, 0, 0, 251, 253, 5, 19, 0, 0, 252, 251, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 255, 5, 78, 0, 0, 255, 260, 3, 26, 13, 0, 256, 257, 5, 18, 0, 0, 257, 259, 3, 26, 13, 0, 258, 256, 1, 0, 0, 0, 259, 262, 1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 263, 1, 0, 0, 0, 262, 260, 1, 0, 0, 0, 263, 264, 5, 79, 0, 0, 264, 268, 5, 85, 0, 0, 265, 267, 3, 6, 3, 0, 266, 265, 1, 0, 0, 0, 267, 270, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, 271, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 271, 272, 5, 86, 0, 0, 272, 23, 1, 0, 0, 0, 273, 274, 5, 26, 0, 0, 274, 278, 5, 85, 0, 0, 275, 277, 3, 6, 3, 0, 276, 275, 1, 0, 0, 0, 277, 280, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 281, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 281, 282, 5, 86, 0, 0, 282, 25, 1, 0, 0, 0, 283, 289, 3, 30, 15, 0, 284, 289, 3, 32, 16, 0, 285, 289, 3, 28, 14, 0, 286, 289, 3, 34, 17, 0, 287, 289, 3, 102, 51, 0, 288, 283, 1, 0, 0, 0, 288, 284, 1, 0, 0, 0, 288, 285, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 287, 1, 0, 0, 0, 289, 27, 1, 0, 0, 0, 290, 292, 5, 19, 0, 0, 291, 290, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 294, 7, 1, 0, 0, 294, 29, 1, 0, 0, 0, 295, 296, 3, 100, 50, 0, 296, 299, 3, 88, 44, 0, 297, 300, 3, 84, 42, 0, 298, 300, 3, 100, 50, 0, 299, 297, 1, 0, 0, 0, 299, 298, 1, 0, 0, 0, 300, 31, 1, 0, 0, 0, 301, 303, 5, 19, 0, 0, 302, 301, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 305, 3, 100, 50, 0, 305, 306, 5, 56, 0, 0, 306, 307, 5, 73, 0, 0, 307, 308, 5, 57, 0, 0, 308, 33, 1, 0, 0, 0, 309, 310, 3, 86, 43, 0, 310, 311, 3, 88, 44, 0, 311, 312, 5, 56, 0, 0, 312, 313, 5, 73, 0, 0, 313, 314, 5, 80, 0, 0, 314, 315, 5, 73, 0, 0, 315, 316, 5, 57, 0, 0, 316, 35, 1, 0, 0, 0, 317, 318, 5, 29, 0, 0, 318, 319, 5, 78, 0, 0, 319, 320, 3, 44, 22, 0, 320, 321, 5, 79, 0, 0, 321, 326, 5, 85, 0, 0, 322, 325, 3, 42, 21, 0, 323, 325, 3, 40, 20, 0, 324, 322, 1, 0, 0, 0, 324, 323, 1, 0, 0, 0, 325, 328, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 329, 1, 0, 0, 0, 328, 326, 1, 0, 0, 0, 329, 330, 5, 86, 0, 0, 330, 37, 1, 0, 0, 0, 331, 332, 7, 2, 0, 0, 332, 333, 5, 78, 0, 0, 333, 334, 3, 100, 50, 0, 334, 335, 5, 79, 0, 0, 335, 340, 5, 85, 0, 0, 336, 339, 3, 42, 21, 0, 337, 339, 3, 40, 20, 0, 338, 336, 1, 0, 0, 0, 338, 337, 1, 0, 0, 0, 339, 342, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 343, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 343, 344, 5, 86, 0, 0, 344, 39, 1, 0, 0, 0, 345, 346, 5, 45, 0, 0, 346, 347, 3, 54, 27, 0, 347, 355, 5, 81, 0, 0, 348, 350, 3, 6, 3, 0, 349, 348, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 356, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 354, 356, 3, 120, 60, 0, 355, 351, 1, 0, 0, 0, 355, 354, 1, 0, 0, 0, 356, 41, 1, 0, 0, 0, 357, 358, 5, 46, 0, 0, 358, 366, 5, 81, 0, 0, 359, 361, 3, 6, 3, 0, 360, 359, 1, 0, 0, 0, 361, 364, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 367, 1, 0, 0, 0, 364, 362, 1, 0, 0, 0, 365, 367, 3, 120, 60, 0, 366, 362, 1, 0, 0, 0, 366, 365, 1, 0, 0, 0, 367, 43, 1, 0, 0, 0, 368, 375, 3, 100, 50, 0, 369, 375, 3, 102, 51, 0, 370, 375, 3, 46, 23, 0, 371, 375, 3, 48, 24, 0, 372, 375, 3, 50, 25, 0, 373, 375, 3, 52, 26, 0, 374, 368, 1, 0, 0, 0, 374, 369, 1, 0, 0, 0, 374, 370, 1, 0, 0, 0, 374, 371, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 374, 373, 1, 0, 0, 0, 375, 45, 1, 0, 0, 0, 376, 377, 3, 86, 43, 0, 377, 378, 5, 56, 0, 0, 378, 379, 5, 73, 0, 0, 379, 380, 5, 57, 0, 0, 380, 47, 1, 0, 0, 0, 381, 382, 5, 40, 0, 0, 382, 383, 5, 78, 0, 0, 383, 384, 3, 100, 50, 0, 384, 385, 5, 79, 0, 0, 385, 49, 1, 0, 0, 0, 386, 387, 5, 42, 0, 0, 387, 388, 5, 78, 0, 0, 388, 389, 3, 100, 50, 0, 389, 390, 5, 79, 0, 0, 390, 51, 1, 0, 0, 0, 391, 392, 5, 41, 0, 0, 392, 393, 5, 78, 0, 0, 393, 394, 5, 79, 0, 0, 394, 53, 1, 0, 0, 0, 395, 400, 3, 100, 50, 0, 396, 400, 3, 56, 28, 0, 397, 400, 3, 58, 29, 0, 398, 400, 3, 60, 30, 0, 399, 395, 1, 0, 0, 0, 399, 396, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 399, 398, 1, 0, 0, 0, 400, 55, 1, 0, 0, 0, 401, 402, 5, 44, 0, 0, 402, 403, 5, 78, 0, 0, 403, 404, 3, 120, 60, 0, 404, 405, 5, 79, 0, 0, 405, 57, 1, 0, 0, 0, 406, 407, 5, 43, 0, 0, 407, 408, 5, 78, 0, 0, 408, 409, 3, 100, 50, 0, 409, 410, 5, 79, 0, 0, 410, 59, 1, 0, 0, 0, 411, 414, 3, 88, 44, 0, 412, 415, 3, 84, 42, 0, 413, 415, 3, 100, 50, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 61, 1, 0, 0, 0, 416, 417, 5, 27, 0, 0, 417, 421, 5, 85, 0, 0, 418, 420, 3, 6, 3, 0, 419, 418, 1, 0, 0, 0, 420, 423, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 424, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 424, 425, 5, 86, 0, 0, 425, 63, 1, 0, 0, 0, 426, 427, 5, 67, 0, 0, 427, 428, 5, 78, 0, 0, 428, 429, 3, 8, 4, 0, 429, 430, 3, 26, 13, 0, 430, 431, 5, 1, 0, 0, 431, 432, 3, 8, 4, 0, 432, 433, 5, 79, 0, 0, 433, 437, 5, 85, 0, 0, 434, 436, 3, 6, 3, 0, 435, 434, 1, 0, 0, 0, 436, 439, 1, 0, 0, 0, 437, 435, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 440, 1, 0, 0, 0, 439, 437, 1, 0, 0, 0, 440, 441, 5, 86, 0, 0, 441, 65, 1, 0, 0, 0, 442, 444, 5, 55, 0, 0, 443, 445, 5, 19, 0, 0, 444, 443, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 5, 78, 0, 0, 447, 448, 3, 26, 13, 0, 448, 449, 5, 79, 0, 0, 449, 453, 5, 85, 0, 0, 450, 452, 3, 6, 3, 0, 451, 450, 1, 0, 0, 0, 452, 455, 1, 0, 0, 0, 453, 451, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 456, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 456, 457, 5, 86, 0, 0, 457, 67, 1, 0, 0, 0, 458, 466, 3, 70, 35, 0, 459, 466, 3, 72, 36, 0, 460, 466, 3, 74, 37, 0, 461, 466, 3, 76, 38, 0, 462, 466, 3, 78, 39, 0, 463, 466, 3, 80, 40, 0, 464, 466, 3, 82, 41, 0, 465, 458, 1, 0, 0, 0, 465, 459, 1, 0, 0, 0, 465, 460, 1, 0, 0, 0, 465, 461, 1, 0, 0, 0, 465, 462, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 465, 464, 1, 0, 0, 0, 466, 69, 1, 0, 0, 0, 467, 471, 3, 100, 50, 0, 468, 469, 5, 56, 0, 0, 469, 470, 5, 73, 0, 0, 470, 472, 5, 57, 0, 0, 471, 468, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 476, 3, 90, 45, 0, 474, 477, 3, 100, 50, 0, 475, 477, 3, 84, 42, 0, 476, 474, 1, 0, 0, 0, 476, 475, 1, 0, 0, 0, 477, 71, 1, 0, 0, 0, 478, 479, 5, 47, 0, 0, 479, 480, 3, 100, 50, 0, 480, 73, 1, 0, 0, 0, 481, 482, 5, 49, 0, 0, 482, 483, 3, 100, 50, 0, 483, 75, 1, 0, 0, 0, 484, 487, 5, 48, 0, 0, 485, 488, 5, 51, 0, 0, 486, 488, 3, 86, 43, 0, 487, 485, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 77, 1, 0, 0, 0, 489, 490, 5, 52, 0, 0, 490, 491, 5, 4, 0, 0, 491, 492, 3, 100, 50, 0, 492, 79, 1, 0, 0, 0, 493, 494, 5, 42, 0, 0, 494, 495, 5, 78, 0, 0, 495, 496, 3, 100, 50, 0, 496, 497, 5, 79, 0, 0, 497, 498, 5, 4, 0, 0, 498, 499, 3, 100, 50, 0, 499, 81, 1, 0, 0, 0, 500, 501, 3, 100, 50, 0, 501, 502, 5, 4, 0, 0, 502, 503, 5, 50, 0, 0, 503, 504, 5, 56, 0, 0, 504, 505, 5, 73, 0, 0, 505, 506, 5, 80, 0, 0, 506, 507, 5, 73, 0, 0, 507, 508, 5, 57, 0, 0, 508, 83, 1, 0, 0, 0, 509, 510, 5, 36, 0, 0, 510, 511, 5, 78, 0, 0, 511, 512, 3, 100, 50, 0, 512, 513, 5, 79, 0, 0, 513, 85, 1, 0, 0, 0, 514, 515, 5, 50, 0, 0, 515, 516, 5, 78, 0, 0, 516, 517, 3, 100, 50, 0, 517, 518, 5, 79, 0, 0, 518, 87, 1, 0, 0, 0, 519, 520, 7, 3, 0, 0, 520, 89, 1, 0, 0, 0, 521, 522, 7, 4, 0, 0, 522, 91, 1, 0, 0, 0, 523, 527, 3, 96, 48, 0, 524, 527, 3, 94, 47, 0, 525, 527, 3, 98, 49, 0, 526, 523, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 526, 525, 1, 0, 0, 0, 527, 93, 1, 0, 0, 0, 528, 529, 5, 62, 0, 0, 529, 530, 5, 73, 0, 0, 530, 531, 3, 106, 53, 0, 531, 95, 1, 0, 0, 0, 532, 533, 5, 61, 0, 0, 533, 534, 5, 70, 0, 0, 534, 535, 3, 106, 53, 0, 535, 97, 1, 0, 0, 0, 536, 537, 5, 62, 0, 0, 537, 538, 5, 73, 0, 0, 538, 540, 3, 130, 65, 0, 539, 541, 5, 78, 0, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 544, 3, 100, 50, 0, 543, 545, 5, 79, 0, 0, 544, 543, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 547, 3, 106, 53, 0, 547, 99, 1, 0, 0, 0, 548, 549, 7, 5, 0, 0, 549, 101, 1, 0, 0, 0, 550, 552, 5, 70, 0, 0, 551, 553, 3, 104, 52, 0, 552, 551, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 556, 5, 78, 0, 0, 555, 557, 3, 110, 55, 0, 556, 555, 1, 0, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 559, 5, 79, 0, 0, 559, 103, 1, 0, 0, 0, 560, 561, 5, 5, 0, 0, 561, 562, 3, 128, 64, 0, 562, 563, 5, 6, 0, 0, 563, 105, 1, 0, 0, 0, 564, 571, 5, 85, 0, 0, 565, 567, 3, 6, 3, 0, 566, 565, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 572, 1, 0, 0, 0, 570, 572, 3, 108, 54, 0, 571, 566, 1, 0, 0, 0, 571, 570, 1, 0, 0, 0, 572, 573, 1, 0, 0, 0, 573, 574, 5, 86, 0, 0, 574, 107, 1, 0, 0, 0, 575, 576, 5, 66, 0, 0, 576, 577, 5, 68, 0, 0, 577, 578, 5, 1, 0, 0, 578, 109, 1, 0, 0, 0, 579, 584, 3, 112, 56, 0, 580, 581, 5, 80, 0, 0, 581, 583, 3, 112, 56, 0, 582, 580, 1, 0, 0, 0, 583, 586, 1, 0, 0, 0, 584, 582, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 588, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 587, 589, 5, 80, 0, 0, 588, 587, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 111, 1, 0, 0, 0, 590, 594, 3, 100, 50, 0, 591, 594, 3, 120, 60, 0, 592, 594, 3, 114, 57, 0, 593, 590, 1, 0, 0, 0, 593, 591, 1, 0, 0, 0, 593, 592, 1, 0, 0, 0, 594, 113, 1, 0, 0, 0, 595, 596, 5, 69, 0, 0, 596, 597, 5, 5, 0, 0, 597, 598, 5, 58, 0, 0, 598, 599, 5, 80, 0, 0, 599, 600, 3, 116, 58, 0, 600, 601, 5, 80, 0, 0, 601, 602, 3, 116, 58, 0, 602, 603, 5, 6, 0, 0, 603, 115, 1, 0, 0, 0, 604, 605, 7, 6, 0, 0, 605, 117, 1, 0, 0, 0, 606, 607, 7, 7, 0, 0, 607, 608, 5, 70, 0, 0, 608, 119, 1, 0, 0, 0, 609, 612, 3, 126, 63, 0, 610, 612, 3, 122, 61, 0, 611, 609, 1, 0, 0, 0, 611, 610, 1, 0, 0, 0, 612, 121, 1, 0, 0, 0, 613, 614, 5, 85, 0, 0, 614, 619, 3, 124, 62, 0, 615, 616, 5, 80, 0, 0, 616, 618, 3, 124, 62, 0, 617, 615, 1, 0, 0, 0, 618, 621, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 623, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 622, 624, 5, 80, 0, 0, 623, 622, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 626, 5, 86, 0, 0, 626, 123, 1, 0, 0, 0, 627, 628, 5, 70, 0, 0, 628, 629, 5, 4, 0, 0, 629, 630, 3, 126, 63, 0, 630, 125, 1, 0, 0, 0, 631, 632, 7, 8, 0, 0, 632, 127, 1, 0, 0, 0, 633, 634, 5, 70, 0, 0, 634, 635, 3, 100, 50, 0, 635, 129, 1, 0, 0, 0, 636, 637, 5, 67, 0, 0, 637, 640, 5, 70, 0, 0, 638, 640, 5, 60, 0, 0, 639, 636, 1, 0, 0, 0, 639, 638, 1, 0, 0, 0, 640, 131, 1, 0, 0, 0, 55, 135, 140, 142, 155, 161, 176, 184, 201, 214, 221, 229, 237, 244, 248, 252, 260, 268, 278, 288, 291, 299, 302, 324, 326, 338, 340, 351, 355, 362, 366, 374, 399, 414, 421, 437, 444, 453, 465, 471, 476, 487, 526, 540, 544, 552, 556, 568, 571, 584, 588, 593, 611, 619, 623, 639] \ No newline at end of file diff --git a/explorerscript/antlr/ExplorerScriptParser.py b/explorerscript/antlr/ExplorerScriptParser.py index c4a5c3a..116267f 100644 --- a/explorerscript/antlr/ExplorerScriptParser.py +++ b/explorerscript/antlr/ExplorerScriptParser.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,1,89,637,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, + 4,1,89,642,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, 6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13, 2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20, 7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26, @@ -25,218 +25,220 @@ def serializedATN(): 1,2,5,2,160,8,2,10,2,12,2,163,9,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1, 3,1,3,1,3,1,3,1,3,3,3,177,8,3,1,4,1,4,1,4,1,4,1,4,1,4,3,4,185,8, 4,1,4,1,4,1,5,1,5,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,8,1,8,1,8,3, - 8,202,8,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10, - 3,10,217,8,10,1,10,1,10,1,10,1,10,5,10,223,8,10,10,10,12,10,226, - 9,10,1,10,1,10,1,10,5,10,231,8,10,10,10,12,10,234,9,10,1,10,1,10, - 5,10,238,8,10,10,10,12,10,241,9,10,1,10,3,10,244,8,10,1,11,1,11, - 3,11,248,8,11,1,11,1,11,1,11,1,11,5,11,254,8,11,10,11,12,11,257, - 9,11,1,11,1,11,1,11,5,11,262,8,11,10,11,12,11,265,9,11,1,11,1,11, - 1,12,1,12,1,12,5,12,272,8,12,10,12,12,12,275,9,12,1,12,1,12,1,13, - 1,13,1,13,1,13,1,13,3,13,284,8,13,1,14,3,14,287,8,14,1,14,1,14,1, - 15,1,15,1,15,1,15,3,15,295,8,15,1,16,3,16,298,8,16,1,16,1,16,1,16, - 1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18, - 1,18,1,18,1,18,1,18,5,18,320,8,18,10,18,12,18,323,9,18,1,18,1,18, - 1,19,1,19,1,19,1,19,1,19,1,19,1,19,5,19,334,8,19,10,19,12,19,337, - 9,19,1,19,1,19,1,20,1,20,1,20,1,20,5,20,345,8,20,10,20,12,20,348, - 9,20,1,20,3,20,351,8,20,1,21,1,21,1,21,5,21,356,8,21,10,21,12,21, - 359,9,21,1,21,3,21,362,8,21,1,22,1,22,1,22,1,22,1,22,1,22,3,22,370, - 8,22,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,25,1,25, - 1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1,27,3,27,395, - 8,27,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,30,1,30, - 1,30,3,30,410,8,30,1,31,1,31,1,31,5,31,415,8,31,10,31,12,31,418, - 9,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,5,32, - 431,8,32,10,32,12,32,434,9,32,1,32,1,32,1,33,1,33,3,33,440,8,33, - 1,33,1,33,1,33,1,33,1,33,5,33,447,8,33,10,33,12,33,450,9,33,1,33, - 1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34,461,8,34,1,35,1,35, - 1,35,1,35,3,35,467,8,35,1,35,1,35,1,35,3,35,472,8,35,1,36,1,36,1, - 36,1,37,1,37,1,37,1,38,1,38,1,38,3,38,483,8,38,1,39,1,39,1,39,1, - 39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1, - 41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1, - 43,1,44,1,44,1,45,1,45,1,46,1,46,1,46,3,46,522,8,46,1,47,1,47,1, - 47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,3,49,536,8,49,1, - 49,1,49,3,49,540,8,49,1,49,1,49,1,50,1,50,1,51,1,51,3,51,548,8,51, - 1,51,1,51,3,51,552,8,51,1,51,1,51,1,52,1,52,1,52,1,52,1,53,1,53, - 4,53,562,8,53,11,53,12,53,563,1,53,3,53,567,8,53,1,53,1,53,1,54, - 1,54,1,54,1,54,1,55,1,55,1,55,5,55,578,8,55,10,55,12,55,581,9,55, - 1,55,3,55,584,8,55,1,56,1,56,1,56,3,56,589,8,56,1,57,1,57,1,57,1, - 57,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,59,1,59,1,59,1,60,1,60,3, - 60,607,8,60,1,61,1,61,1,61,1,61,5,61,613,8,61,10,61,12,61,616,9, - 61,1,61,3,61,619,8,61,1,61,1,61,1,62,1,62,1,62,1,62,1,63,1,63,1, - 64,1,64,1,64,1,65,1,65,1,65,3,65,635,8,65,1,65,0,0,66,0,2,4,6,8, - 10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52, - 54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96, - 98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130, - 0,9,1,0,30,35,1,0,37,39,1,0,53,54,2,0,2,3,5,13,2,0,4,4,14,17,3,0, - 70,71,73,73,87,87,2,0,73,73,87,87,1,0,83,84,1,0,58,59,651,0,135, - 1,0,0,0,2,147,1,0,0,0,4,151,1,0,0,0,6,176,1,0,0,0,8,184,1,0,0,0, - 10,188,1,0,0,0,12,190,1,0,0,0,14,194,1,0,0,0,16,198,1,0,0,0,18,206, - 1,0,0,0,20,214,1,0,0,0,22,245,1,0,0,0,24,268,1,0,0,0,26,283,1,0, - 0,0,28,286,1,0,0,0,30,290,1,0,0,0,32,297,1,0,0,0,34,304,1,0,0,0, - 36,312,1,0,0,0,38,326,1,0,0,0,40,340,1,0,0,0,42,352,1,0,0,0,44,369, - 1,0,0,0,46,371,1,0,0,0,48,376,1,0,0,0,50,381,1,0,0,0,52,386,1,0, - 0,0,54,394,1,0,0,0,56,396,1,0,0,0,58,401,1,0,0,0,60,406,1,0,0,0, - 62,411,1,0,0,0,64,421,1,0,0,0,66,437,1,0,0,0,68,460,1,0,0,0,70,462, - 1,0,0,0,72,473,1,0,0,0,74,476,1,0,0,0,76,479,1,0,0,0,78,484,1,0, - 0,0,80,488,1,0,0,0,82,495,1,0,0,0,84,504,1,0,0,0,86,509,1,0,0,0, - 88,514,1,0,0,0,90,516,1,0,0,0,92,521,1,0,0,0,94,523,1,0,0,0,96,527, - 1,0,0,0,98,531,1,0,0,0,100,543,1,0,0,0,102,545,1,0,0,0,104,555,1, - 0,0,0,106,559,1,0,0,0,108,570,1,0,0,0,110,574,1,0,0,0,112,588,1, - 0,0,0,114,590,1,0,0,0,116,599,1,0,0,0,118,601,1,0,0,0,120,606,1, - 0,0,0,122,608,1,0,0,0,124,622,1,0,0,0,126,626,1,0,0,0,128,628,1, - 0,0,0,130,634,1,0,0,0,132,134,3,2,1,0,133,132,1,0,0,0,134,137,1, - 0,0,0,135,133,1,0,0,0,135,136,1,0,0,0,136,142,1,0,0,0,137,135,1, - 0,0,0,138,141,3,4,2,0,139,141,3,92,46,0,140,138,1,0,0,0,140,139, - 1,0,0,0,141,144,1,0,0,0,142,140,1,0,0,0,142,143,1,0,0,0,143,145, - 1,0,0,0,144,142,1,0,0,0,145,146,5,0,0,1,146,1,1,0,0,0,147,148,5, - 22,0,0,148,149,5,58,0,0,149,150,5,1,0,0,150,3,1,0,0,0,151,152,5, - 23,0,0,152,153,5,70,0,0,153,155,5,78,0,0,154,156,5,71,0,0,155,154, - 1,0,0,0,155,156,1,0,0,0,156,161,1,0,0,0,157,158,5,80,0,0,158,160, - 5,71,0,0,159,157,1,0,0,0,160,163,1,0,0,0,161,159,1,0,0,0,161,162, - 1,0,0,0,162,164,1,0,0,0,163,161,1,0,0,0,164,165,5,79,0,0,165,166, - 3,106,53,0,166,5,1,0,0,0,167,177,3,8,4,0,168,177,3,18,9,0,169,177, - 3,20,10,0,170,177,3,36,18,0,171,177,3,38,19,0,172,177,3,62,31,0, - 173,177,3,64,32,0,174,177,3,66,33,0,175,177,3,16,8,0,176,167,1,0, - 0,0,176,168,1,0,0,0,176,169,1,0,0,0,176,170,1,0,0,0,176,171,1,0, - 0,0,176,172,1,0,0,0,176,173,1,0,0,0,176,174,1,0,0,0,176,175,1,0, - 0,0,177,7,1,0,0,0,178,185,3,102,51,0,179,185,3,118,59,0,180,185, - 3,10,5,0,181,185,3,12,6,0,182,185,3,14,7,0,183,185,3,68,34,0,184, - 178,1,0,0,0,184,179,1,0,0,0,184,180,1,0,0,0,184,181,1,0,0,0,184, - 182,1,0,0,0,184,183,1,0,0,0,185,186,1,0,0,0,186,187,5,1,0,0,187, - 9,1,0,0,0,188,189,7,0,0,0,189,11,1,0,0,0,190,191,5,20,0,0,191,192, - 5,83,0,0,192,193,5,70,0,0,193,13,1,0,0,0,194,195,5,21,0,0,195,196, - 5,83,0,0,196,197,5,70,0,0,197,15,1,0,0,0,198,199,5,72,0,0,199,201, - 5,78,0,0,200,202,3,110,55,0,201,200,1,0,0,0,201,202,1,0,0,0,202, - 203,1,0,0,0,203,204,5,79,0,0,204,205,5,1,0,0,205,17,1,0,0,0,206, - 207,5,28,0,0,207,208,5,78,0,0,208,209,3,128,64,0,209,210,5,79,0, - 0,210,211,5,85,0,0,211,212,3,8,4,0,212,213,5,86,0,0,213,19,1,0,0, - 0,214,216,5,24,0,0,215,217,5,19,0,0,216,215,1,0,0,0,216,217,1,0, - 0,0,217,218,1,0,0,0,218,219,5,78,0,0,219,224,3,26,13,0,220,221,5, - 18,0,0,221,223,3,26,13,0,222,220,1,0,0,0,223,226,1,0,0,0,224,222, - 1,0,0,0,224,225,1,0,0,0,225,227,1,0,0,0,226,224,1,0,0,0,227,228, - 5,79,0,0,228,232,5,85,0,0,229,231,3,6,3,0,230,229,1,0,0,0,231,234, - 1,0,0,0,232,230,1,0,0,0,232,233,1,0,0,0,233,235,1,0,0,0,234,232, - 1,0,0,0,235,239,5,86,0,0,236,238,3,22,11,0,237,236,1,0,0,0,238,241, - 1,0,0,0,239,237,1,0,0,0,239,240,1,0,0,0,240,243,1,0,0,0,241,239, - 1,0,0,0,242,244,3,24,12,0,243,242,1,0,0,0,243,244,1,0,0,0,244,21, - 1,0,0,0,245,247,5,25,0,0,246,248,5,19,0,0,247,246,1,0,0,0,247,248, - 1,0,0,0,248,249,1,0,0,0,249,250,5,78,0,0,250,255,3,26,13,0,251,252, - 5,18,0,0,252,254,3,26,13,0,253,251,1,0,0,0,254,257,1,0,0,0,255,253, - 1,0,0,0,255,256,1,0,0,0,256,258,1,0,0,0,257,255,1,0,0,0,258,259, - 5,79,0,0,259,263,5,85,0,0,260,262,3,6,3,0,261,260,1,0,0,0,262,265, - 1,0,0,0,263,261,1,0,0,0,263,264,1,0,0,0,264,266,1,0,0,0,265,263, - 1,0,0,0,266,267,5,86,0,0,267,23,1,0,0,0,268,269,5,26,0,0,269,273, - 5,85,0,0,270,272,3,6,3,0,271,270,1,0,0,0,272,275,1,0,0,0,273,271, - 1,0,0,0,273,274,1,0,0,0,274,276,1,0,0,0,275,273,1,0,0,0,276,277, - 5,86,0,0,277,25,1,0,0,0,278,284,3,30,15,0,279,284,3,32,16,0,280, - 284,3,28,14,0,281,284,3,34,17,0,282,284,3,102,51,0,283,278,1,0,0, - 0,283,279,1,0,0,0,283,280,1,0,0,0,283,281,1,0,0,0,283,282,1,0,0, - 0,284,27,1,0,0,0,285,287,5,19,0,0,286,285,1,0,0,0,286,287,1,0,0, - 0,287,288,1,0,0,0,288,289,7,1,0,0,289,29,1,0,0,0,290,291,3,100,50, - 0,291,294,3,88,44,0,292,295,3,84,42,0,293,295,3,100,50,0,294,292, - 1,0,0,0,294,293,1,0,0,0,295,31,1,0,0,0,296,298,5,19,0,0,297,296, - 1,0,0,0,297,298,1,0,0,0,298,299,1,0,0,0,299,300,3,100,50,0,300,301, - 5,56,0,0,301,302,5,73,0,0,302,303,5,57,0,0,303,33,1,0,0,0,304,305, - 3,86,43,0,305,306,3,88,44,0,306,307,5,56,0,0,307,308,5,73,0,0,308, - 309,5,80,0,0,309,310,5,73,0,0,310,311,5,57,0,0,311,35,1,0,0,0,312, - 313,5,29,0,0,313,314,5,78,0,0,314,315,3,44,22,0,315,316,5,79,0,0, - 316,321,5,85,0,0,317,320,3,42,21,0,318,320,3,40,20,0,319,317,1,0, - 0,0,319,318,1,0,0,0,320,323,1,0,0,0,321,319,1,0,0,0,321,322,1,0, - 0,0,322,324,1,0,0,0,323,321,1,0,0,0,324,325,5,86,0,0,325,37,1,0, - 0,0,326,327,7,2,0,0,327,328,5,78,0,0,328,329,3,100,50,0,329,330, - 5,79,0,0,330,335,5,85,0,0,331,334,3,42,21,0,332,334,3,40,20,0,333, - 331,1,0,0,0,333,332,1,0,0,0,334,337,1,0,0,0,335,333,1,0,0,0,335, - 336,1,0,0,0,336,338,1,0,0,0,337,335,1,0,0,0,338,339,5,86,0,0,339, - 39,1,0,0,0,340,341,5,45,0,0,341,342,3,54,27,0,342,350,5,81,0,0,343, - 345,3,6,3,0,344,343,1,0,0,0,345,348,1,0,0,0,346,344,1,0,0,0,346, - 347,1,0,0,0,347,351,1,0,0,0,348,346,1,0,0,0,349,351,3,120,60,0,350, - 346,1,0,0,0,350,349,1,0,0,0,351,41,1,0,0,0,352,353,5,46,0,0,353, - 361,5,81,0,0,354,356,3,6,3,0,355,354,1,0,0,0,356,359,1,0,0,0,357, - 355,1,0,0,0,357,358,1,0,0,0,358,362,1,0,0,0,359,357,1,0,0,0,360, - 362,3,120,60,0,361,357,1,0,0,0,361,360,1,0,0,0,362,43,1,0,0,0,363, - 370,3,100,50,0,364,370,3,102,51,0,365,370,3,46,23,0,366,370,3,48, - 24,0,367,370,3,50,25,0,368,370,3,52,26,0,369,363,1,0,0,0,369,364, - 1,0,0,0,369,365,1,0,0,0,369,366,1,0,0,0,369,367,1,0,0,0,369,368, - 1,0,0,0,370,45,1,0,0,0,371,372,3,86,43,0,372,373,5,56,0,0,373,374, - 5,73,0,0,374,375,5,57,0,0,375,47,1,0,0,0,376,377,5,40,0,0,377,378, - 5,78,0,0,378,379,3,100,50,0,379,380,5,79,0,0,380,49,1,0,0,0,381, - 382,5,42,0,0,382,383,5,78,0,0,383,384,3,100,50,0,384,385,5,79,0, - 0,385,51,1,0,0,0,386,387,5,41,0,0,387,388,5,78,0,0,388,389,5,79, - 0,0,389,53,1,0,0,0,390,395,3,100,50,0,391,395,3,56,28,0,392,395, - 3,58,29,0,393,395,3,60,30,0,394,390,1,0,0,0,394,391,1,0,0,0,394, - 392,1,0,0,0,394,393,1,0,0,0,395,55,1,0,0,0,396,397,5,44,0,0,397, - 398,5,78,0,0,398,399,3,120,60,0,399,400,5,79,0,0,400,57,1,0,0,0, - 401,402,5,43,0,0,402,403,5,78,0,0,403,404,3,100,50,0,404,405,5,79, - 0,0,405,59,1,0,0,0,406,409,3,88,44,0,407,410,3,84,42,0,408,410,3, - 100,50,0,409,407,1,0,0,0,409,408,1,0,0,0,410,61,1,0,0,0,411,412, - 5,27,0,0,412,416,5,85,0,0,413,415,3,6,3,0,414,413,1,0,0,0,415,418, - 1,0,0,0,416,414,1,0,0,0,416,417,1,0,0,0,417,419,1,0,0,0,418,416, - 1,0,0,0,419,420,5,86,0,0,420,63,1,0,0,0,421,422,5,67,0,0,422,423, - 5,78,0,0,423,424,3,8,4,0,424,425,3,26,13,0,425,426,5,1,0,0,426,427, - 3,8,4,0,427,428,5,79,0,0,428,432,5,85,0,0,429,431,3,6,3,0,430,429, - 1,0,0,0,431,434,1,0,0,0,432,430,1,0,0,0,432,433,1,0,0,0,433,435, - 1,0,0,0,434,432,1,0,0,0,435,436,5,86,0,0,436,65,1,0,0,0,437,439, - 5,55,0,0,438,440,5,19,0,0,439,438,1,0,0,0,439,440,1,0,0,0,440,441, - 1,0,0,0,441,442,5,78,0,0,442,443,3,26,13,0,443,444,5,79,0,0,444, - 448,5,85,0,0,445,447,3,6,3,0,446,445,1,0,0,0,447,450,1,0,0,0,448, - 446,1,0,0,0,448,449,1,0,0,0,449,451,1,0,0,0,450,448,1,0,0,0,451, - 452,5,86,0,0,452,67,1,0,0,0,453,461,3,70,35,0,454,461,3,72,36,0, - 455,461,3,74,37,0,456,461,3,76,38,0,457,461,3,78,39,0,458,461,3, - 80,40,0,459,461,3,82,41,0,460,453,1,0,0,0,460,454,1,0,0,0,460,455, - 1,0,0,0,460,456,1,0,0,0,460,457,1,0,0,0,460,458,1,0,0,0,460,459, - 1,0,0,0,461,69,1,0,0,0,462,466,3,100,50,0,463,464,5,56,0,0,464,465, - 5,73,0,0,465,467,5,57,0,0,466,463,1,0,0,0,466,467,1,0,0,0,467,468, - 1,0,0,0,468,471,3,90,45,0,469,472,3,100,50,0,470,472,3,84,42,0,471, - 469,1,0,0,0,471,470,1,0,0,0,472,71,1,0,0,0,473,474,5,47,0,0,474, - 475,3,100,50,0,475,73,1,0,0,0,476,477,5,49,0,0,477,478,3,100,50, - 0,478,75,1,0,0,0,479,482,5,48,0,0,480,483,5,51,0,0,481,483,3,86, - 43,0,482,480,1,0,0,0,482,481,1,0,0,0,483,77,1,0,0,0,484,485,5,52, - 0,0,485,486,5,4,0,0,486,487,3,100,50,0,487,79,1,0,0,0,488,489,5, - 42,0,0,489,490,5,78,0,0,490,491,3,100,50,0,491,492,5,79,0,0,492, - 493,5,4,0,0,493,494,3,100,50,0,494,81,1,0,0,0,495,496,3,100,50,0, - 496,497,5,4,0,0,497,498,5,50,0,0,498,499,5,56,0,0,499,500,5,73,0, - 0,500,501,5,80,0,0,501,502,5,73,0,0,502,503,5,57,0,0,503,83,1,0, - 0,0,504,505,5,36,0,0,505,506,5,78,0,0,506,507,3,100,50,0,507,508, - 5,79,0,0,508,85,1,0,0,0,509,510,5,50,0,0,510,511,5,78,0,0,511,512, - 3,100,50,0,512,513,5,79,0,0,513,87,1,0,0,0,514,515,7,3,0,0,515,89, - 1,0,0,0,516,517,7,4,0,0,517,91,1,0,0,0,518,522,3,96,48,0,519,522, - 3,94,47,0,520,522,3,98,49,0,521,518,1,0,0,0,521,519,1,0,0,0,521, - 520,1,0,0,0,522,93,1,0,0,0,523,524,5,62,0,0,524,525,5,73,0,0,525, - 526,3,106,53,0,526,95,1,0,0,0,527,528,5,61,0,0,528,529,5,70,0,0, - 529,530,3,106,53,0,530,97,1,0,0,0,531,532,5,62,0,0,532,533,5,73, - 0,0,533,535,3,130,65,0,534,536,5,78,0,0,535,534,1,0,0,0,535,536, - 1,0,0,0,536,537,1,0,0,0,537,539,3,100,50,0,538,540,5,79,0,0,539, - 538,1,0,0,0,539,540,1,0,0,0,540,541,1,0,0,0,541,542,3,106,53,0,542, - 99,1,0,0,0,543,544,7,5,0,0,544,101,1,0,0,0,545,547,5,70,0,0,546, - 548,3,104,52,0,547,546,1,0,0,0,547,548,1,0,0,0,548,549,1,0,0,0,549, - 551,5,78,0,0,550,552,3,110,55,0,551,550,1,0,0,0,551,552,1,0,0,0, - 552,553,1,0,0,0,553,554,5,79,0,0,554,103,1,0,0,0,555,556,5,5,0,0, - 556,557,3,128,64,0,557,558,5,6,0,0,558,105,1,0,0,0,559,566,5,85, - 0,0,560,562,3,6,3,0,561,560,1,0,0,0,562,563,1,0,0,0,563,561,1,0, - 0,0,563,564,1,0,0,0,564,567,1,0,0,0,565,567,3,108,54,0,566,561,1, - 0,0,0,566,565,1,0,0,0,567,568,1,0,0,0,568,569,5,86,0,0,569,107,1, - 0,0,0,570,571,5,66,0,0,571,572,5,68,0,0,572,573,5,1,0,0,573,109, - 1,0,0,0,574,579,3,112,56,0,575,576,5,80,0,0,576,578,3,112,56,0,577, - 575,1,0,0,0,578,581,1,0,0,0,579,577,1,0,0,0,579,580,1,0,0,0,580, - 583,1,0,0,0,581,579,1,0,0,0,582,584,5,80,0,0,583,582,1,0,0,0,583, - 584,1,0,0,0,584,111,1,0,0,0,585,589,3,100,50,0,586,589,3,120,60, - 0,587,589,3,114,57,0,588,585,1,0,0,0,588,586,1,0,0,0,588,587,1,0, - 0,0,589,113,1,0,0,0,590,591,5,69,0,0,591,592,5,5,0,0,592,593,5,58, - 0,0,593,594,5,80,0,0,594,595,3,116,58,0,595,596,5,80,0,0,596,597, - 3,116,58,0,597,598,5,6,0,0,598,115,1,0,0,0,599,600,7,6,0,0,600,117, - 1,0,0,0,601,602,7,7,0,0,602,603,5,70,0,0,603,119,1,0,0,0,604,607, - 3,126,63,0,605,607,3,122,61,0,606,604,1,0,0,0,606,605,1,0,0,0,607, - 121,1,0,0,0,608,609,5,85,0,0,609,614,3,124,62,0,610,611,5,80,0,0, - 611,613,3,124,62,0,612,610,1,0,0,0,613,616,1,0,0,0,614,612,1,0,0, - 0,614,615,1,0,0,0,615,618,1,0,0,0,616,614,1,0,0,0,617,619,5,80,0, - 0,618,617,1,0,0,0,618,619,1,0,0,0,619,620,1,0,0,0,620,621,5,86,0, - 0,621,123,1,0,0,0,622,623,5,70,0,0,623,624,5,4,0,0,624,625,3,126, - 63,0,625,125,1,0,0,0,626,627,7,8,0,0,627,127,1,0,0,0,628,629,5,70, - 0,0,629,630,3,100,50,0,630,129,1,0,0,0,631,632,5,67,0,0,632,635, - 5,70,0,0,633,635,5,60,0,0,634,631,1,0,0,0,634,633,1,0,0,0,635,131, - 1,0,0,0,54,135,140,142,155,161,176,184,201,216,224,232,239,243,247, - 255,263,273,283,286,294,297,319,321,333,335,346,350,357,361,369, - 394,409,416,432,439,448,460,466,471,482,521,535,539,547,551,563, - 566,579,583,588,606,614,618,634 + 8,202,8,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,5,9,213,8,9,10,9,12, + 9,216,9,9,1,9,1,9,1,10,1,10,3,10,222,8,10,1,10,1,10,1,10,1,10,5, + 10,228,8,10,10,10,12,10,231,9,10,1,10,1,10,1,10,5,10,236,8,10,10, + 10,12,10,239,9,10,1,10,1,10,5,10,243,8,10,10,10,12,10,246,9,10,1, + 10,3,10,249,8,10,1,11,1,11,3,11,253,8,11,1,11,1,11,1,11,1,11,5,11, + 259,8,11,10,11,12,11,262,9,11,1,11,1,11,1,11,5,11,267,8,11,10,11, + 12,11,270,9,11,1,11,1,11,1,12,1,12,1,12,5,12,277,8,12,10,12,12,12, + 280,9,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,3,13,289,8,13,1,14,3, + 14,292,8,14,1,14,1,14,1,15,1,15,1,15,1,15,3,15,300,8,15,1,16,3,16, + 303,8,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17, + 1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,5,18,325,8,18,10,18, + 12,18,328,9,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,5,19, + 339,8,19,10,19,12,19,342,9,19,1,19,1,19,1,20,1,20,1,20,1,20,5,20, + 350,8,20,10,20,12,20,353,9,20,1,20,3,20,356,8,20,1,21,1,21,1,21, + 5,21,361,8,21,10,21,12,21,364,9,21,1,21,3,21,367,8,21,1,22,1,22, + 1,22,1,22,1,22,1,22,3,22,375,8,22,1,23,1,23,1,23,1,23,1,23,1,24, + 1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26, + 1,27,1,27,1,27,1,27,3,27,400,8,27,1,28,1,28,1,28,1,28,1,28,1,29, + 1,29,1,29,1,29,1,29,1,30,1,30,1,30,3,30,415,8,30,1,31,1,31,1,31, + 5,31,420,8,31,10,31,12,31,423,9,31,1,31,1,31,1,32,1,32,1,32,1,32, + 1,32,1,32,1,32,1,32,1,32,5,32,436,8,32,10,32,12,32,439,9,32,1,32, + 1,32,1,33,1,33,3,33,445,8,33,1,33,1,33,1,33,1,33,1,33,5,33,452,8, + 33,10,33,12,33,455,9,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,3,34,466,8,34,1,35,1,35,1,35,1,35,3,35,472,8,35,1,35,1,35,1, + 35,3,35,477,8,35,1,36,1,36,1,36,1,37,1,37,1,37,1,38,1,38,1,38,3, + 38,488,8,38,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1, + 40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1, + 42,1,42,1,43,1,43,1,43,1,43,1,43,1,44,1,44,1,45,1,45,1,46,1,46,1, + 46,3,46,527,8,46,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1, + 49,1,49,1,49,3,49,541,8,49,1,49,1,49,3,49,545,8,49,1,49,1,49,1,50, + 1,50,1,51,1,51,3,51,553,8,51,1,51,1,51,3,51,557,8,51,1,51,1,51,1, + 52,1,52,1,52,1,52,1,53,1,53,4,53,567,8,53,11,53,12,53,568,1,53,3, + 53,572,8,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1,55,1,55,5,55,583, + 8,55,10,55,12,55,586,9,55,1,55,3,55,589,8,55,1,56,1,56,1,56,3,56, + 594,8,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,58,1,58, + 1,59,1,59,1,59,1,60,1,60,3,60,612,8,60,1,61,1,61,1,61,1,61,5,61, + 618,8,61,10,61,12,61,621,9,61,1,61,3,61,624,8,61,1,61,1,61,1,62, + 1,62,1,62,1,62,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,65,3,65,640, + 8,65,1,65,0,0,66,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34, + 36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78, + 80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116, + 118,120,122,124,126,128,130,0,9,1,0,30,35,1,0,37,39,1,0,53,54,2, + 0,2,3,5,13,2,0,4,4,14,17,3,0,70,71,73,73,87,87,2,0,73,73,87,87,1, + 0,83,84,1,0,58,59,657,0,135,1,0,0,0,2,147,1,0,0,0,4,151,1,0,0,0, + 6,176,1,0,0,0,8,184,1,0,0,0,10,188,1,0,0,0,12,190,1,0,0,0,14,194, + 1,0,0,0,16,198,1,0,0,0,18,206,1,0,0,0,20,219,1,0,0,0,22,250,1,0, + 0,0,24,273,1,0,0,0,26,288,1,0,0,0,28,291,1,0,0,0,30,295,1,0,0,0, + 32,302,1,0,0,0,34,309,1,0,0,0,36,317,1,0,0,0,38,331,1,0,0,0,40,345, + 1,0,0,0,42,357,1,0,0,0,44,374,1,0,0,0,46,376,1,0,0,0,48,381,1,0, + 0,0,50,386,1,0,0,0,52,391,1,0,0,0,54,399,1,0,0,0,56,401,1,0,0,0, + 58,406,1,0,0,0,60,411,1,0,0,0,62,416,1,0,0,0,64,426,1,0,0,0,66,442, + 1,0,0,0,68,465,1,0,0,0,70,467,1,0,0,0,72,478,1,0,0,0,74,481,1,0, + 0,0,76,484,1,0,0,0,78,489,1,0,0,0,80,493,1,0,0,0,82,500,1,0,0,0, + 84,509,1,0,0,0,86,514,1,0,0,0,88,519,1,0,0,0,90,521,1,0,0,0,92,526, + 1,0,0,0,94,528,1,0,0,0,96,532,1,0,0,0,98,536,1,0,0,0,100,548,1,0, + 0,0,102,550,1,0,0,0,104,560,1,0,0,0,106,564,1,0,0,0,108,575,1,0, + 0,0,110,579,1,0,0,0,112,593,1,0,0,0,114,595,1,0,0,0,116,604,1,0, + 0,0,118,606,1,0,0,0,120,611,1,0,0,0,122,613,1,0,0,0,124,627,1,0, + 0,0,126,631,1,0,0,0,128,633,1,0,0,0,130,639,1,0,0,0,132,134,3,2, + 1,0,133,132,1,0,0,0,134,137,1,0,0,0,135,133,1,0,0,0,135,136,1,0, + 0,0,136,142,1,0,0,0,137,135,1,0,0,0,138,141,3,4,2,0,139,141,3,92, + 46,0,140,138,1,0,0,0,140,139,1,0,0,0,141,144,1,0,0,0,142,140,1,0, + 0,0,142,143,1,0,0,0,143,145,1,0,0,0,144,142,1,0,0,0,145,146,5,0, + 0,1,146,1,1,0,0,0,147,148,5,22,0,0,148,149,5,58,0,0,149,150,5,1, + 0,0,150,3,1,0,0,0,151,152,5,23,0,0,152,153,5,70,0,0,153,155,5,78, + 0,0,154,156,5,71,0,0,155,154,1,0,0,0,155,156,1,0,0,0,156,161,1,0, + 0,0,157,158,5,80,0,0,158,160,5,71,0,0,159,157,1,0,0,0,160,163,1, + 0,0,0,161,159,1,0,0,0,161,162,1,0,0,0,162,164,1,0,0,0,163,161,1, + 0,0,0,164,165,5,79,0,0,165,166,3,106,53,0,166,5,1,0,0,0,167,177, + 3,8,4,0,168,177,3,18,9,0,169,177,3,20,10,0,170,177,3,36,18,0,171, + 177,3,38,19,0,172,177,3,62,31,0,173,177,3,64,32,0,174,177,3,66,33, + 0,175,177,3,16,8,0,176,167,1,0,0,0,176,168,1,0,0,0,176,169,1,0,0, + 0,176,170,1,0,0,0,176,171,1,0,0,0,176,172,1,0,0,0,176,173,1,0,0, + 0,176,174,1,0,0,0,176,175,1,0,0,0,177,7,1,0,0,0,178,185,3,102,51, + 0,179,185,3,118,59,0,180,185,3,10,5,0,181,185,3,12,6,0,182,185,3, + 14,7,0,183,185,3,68,34,0,184,178,1,0,0,0,184,179,1,0,0,0,184,180, + 1,0,0,0,184,181,1,0,0,0,184,182,1,0,0,0,184,183,1,0,0,0,185,186, + 1,0,0,0,186,187,5,1,0,0,187,9,1,0,0,0,188,189,7,0,0,0,189,11,1,0, + 0,0,190,191,5,20,0,0,191,192,5,83,0,0,192,193,5,70,0,0,193,13,1, + 0,0,0,194,195,5,21,0,0,195,196,5,83,0,0,196,197,5,70,0,0,197,15, + 1,0,0,0,198,199,5,72,0,0,199,201,5,78,0,0,200,202,3,110,55,0,201, + 200,1,0,0,0,201,202,1,0,0,0,202,203,1,0,0,0,203,204,5,79,0,0,204, + 205,5,1,0,0,205,17,1,0,0,0,206,207,5,28,0,0,207,208,5,78,0,0,208, + 209,3,128,64,0,209,210,5,79,0,0,210,214,5,85,0,0,211,213,3,8,4,0, + 212,211,1,0,0,0,213,216,1,0,0,0,214,212,1,0,0,0,214,215,1,0,0,0, + 215,217,1,0,0,0,216,214,1,0,0,0,217,218,5,86,0,0,218,19,1,0,0,0, + 219,221,5,24,0,0,220,222,5,19,0,0,221,220,1,0,0,0,221,222,1,0,0, + 0,222,223,1,0,0,0,223,224,5,78,0,0,224,229,3,26,13,0,225,226,5,18, + 0,0,226,228,3,26,13,0,227,225,1,0,0,0,228,231,1,0,0,0,229,227,1, + 0,0,0,229,230,1,0,0,0,230,232,1,0,0,0,231,229,1,0,0,0,232,233,5, + 79,0,0,233,237,5,85,0,0,234,236,3,6,3,0,235,234,1,0,0,0,236,239, + 1,0,0,0,237,235,1,0,0,0,237,238,1,0,0,0,238,240,1,0,0,0,239,237, + 1,0,0,0,240,244,5,86,0,0,241,243,3,22,11,0,242,241,1,0,0,0,243,246, + 1,0,0,0,244,242,1,0,0,0,244,245,1,0,0,0,245,248,1,0,0,0,246,244, + 1,0,0,0,247,249,3,24,12,0,248,247,1,0,0,0,248,249,1,0,0,0,249,21, + 1,0,0,0,250,252,5,25,0,0,251,253,5,19,0,0,252,251,1,0,0,0,252,253, + 1,0,0,0,253,254,1,0,0,0,254,255,5,78,0,0,255,260,3,26,13,0,256,257, + 5,18,0,0,257,259,3,26,13,0,258,256,1,0,0,0,259,262,1,0,0,0,260,258, + 1,0,0,0,260,261,1,0,0,0,261,263,1,0,0,0,262,260,1,0,0,0,263,264, + 5,79,0,0,264,268,5,85,0,0,265,267,3,6,3,0,266,265,1,0,0,0,267,270, + 1,0,0,0,268,266,1,0,0,0,268,269,1,0,0,0,269,271,1,0,0,0,270,268, + 1,0,0,0,271,272,5,86,0,0,272,23,1,0,0,0,273,274,5,26,0,0,274,278, + 5,85,0,0,275,277,3,6,3,0,276,275,1,0,0,0,277,280,1,0,0,0,278,276, + 1,0,0,0,278,279,1,0,0,0,279,281,1,0,0,0,280,278,1,0,0,0,281,282, + 5,86,0,0,282,25,1,0,0,0,283,289,3,30,15,0,284,289,3,32,16,0,285, + 289,3,28,14,0,286,289,3,34,17,0,287,289,3,102,51,0,288,283,1,0,0, + 0,288,284,1,0,0,0,288,285,1,0,0,0,288,286,1,0,0,0,288,287,1,0,0, + 0,289,27,1,0,0,0,290,292,5,19,0,0,291,290,1,0,0,0,291,292,1,0,0, + 0,292,293,1,0,0,0,293,294,7,1,0,0,294,29,1,0,0,0,295,296,3,100,50, + 0,296,299,3,88,44,0,297,300,3,84,42,0,298,300,3,100,50,0,299,297, + 1,0,0,0,299,298,1,0,0,0,300,31,1,0,0,0,301,303,5,19,0,0,302,301, + 1,0,0,0,302,303,1,0,0,0,303,304,1,0,0,0,304,305,3,100,50,0,305,306, + 5,56,0,0,306,307,5,73,0,0,307,308,5,57,0,0,308,33,1,0,0,0,309,310, + 3,86,43,0,310,311,3,88,44,0,311,312,5,56,0,0,312,313,5,73,0,0,313, + 314,5,80,0,0,314,315,5,73,0,0,315,316,5,57,0,0,316,35,1,0,0,0,317, + 318,5,29,0,0,318,319,5,78,0,0,319,320,3,44,22,0,320,321,5,79,0,0, + 321,326,5,85,0,0,322,325,3,42,21,0,323,325,3,40,20,0,324,322,1,0, + 0,0,324,323,1,0,0,0,325,328,1,0,0,0,326,324,1,0,0,0,326,327,1,0, + 0,0,327,329,1,0,0,0,328,326,1,0,0,0,329,330,5,86,0,0,330,37,1,0, + 0,0,331,332,7,2,0,0,332,333,5,78,0,0,333,334,3,100,50,0,334,335, + 5,79,0,0,335,340,5,85,0,0,336,339,3,42,21,0,337,339,3,40,20,0,338, + 336,1,0,0,0,338,337,1,0,0,0,339,342,1,0,0,0,340,338,1,0,0,0,340, + 341,1,0,0,0,341,343,1,0,0,0,342,340,1,0,0,0,343,344,5,86,0,0,344, + 39,1,0,0,0,345,346,5,45,0,0,346,347,3,54,27,0,347,355,5,81,0,0,348, + 350,3,6,3,0,349,348,1,0,0,0,350,353,1,0,0,0,351,349,1,0,0,0,351, + 352,1,0,0,0,352,356,1,0,0,0,353,351,1,0,0,0,354,356,3,120,60,0,355, + 351,1,0,0,0,355,354,1,0,0,0,356,41,1,0,0,0,357,358,5,46,0,0,358, + 366,5,81,0,0,359,361,3,6,3,0,360,359,1,0,0,0,361,364,1,0,0,0,362, + 360,1,0,0,0,362,363,1,0,0,0,363,367,1,0,0,0,364,362,1,0,0,0,365, + 367,3,120,60,0,366,362,1,0,0,0,366,365,1,0,0,0,367,43,1,0,0,0,368, + 375,3,100,50,0,369,375,3,102,51,0,370,375,3,46,23,0,371,375,3,48, + 24,0,372,375,3,50,25,0,373,375,3,52,26,0,374,368,1,0,0,0,374,369, + 1,0,0,0,374,370,1,0,0,0,374,371,1,0,0,0,374,372,1,0,0,0,374,373, + 1,0,0,0,375,45,1,0,0,0,376,377,3,86,43,0,377,378,5,56,0,0,378,379, + 5,73,0,0,379,380,5,57,0,0,380,47,1,0,0,0,381,382,5,40,0,0,382,383, + 5,78,0,0,383,384,3,100,50,0,384,385,5,79,0,0,385,49,1,0,0,0,386, + 387,5,42,0,0,387,388,5,78,0,0,388,389,3,100,50,0,389,390,5,79,0, + 0,390,51,1,0,0,0,391,392,5,41,0,0,392,393,5,78,0,0,393,394,5,79, + 0,0,394,53,1,0,0,0,395,400,3,100,50,0,396,400,3,56,28,0,397,400, + 3,58,29,0,398,400,3,60,30,0,399,395,1,0,0,0,399,396,1,0,0,0,399, + 397,1,0,0,0,399,398,1,0,0,0,400,55,1,0,0,0,401,402,5,44,0,0,402, + 403,5,78,0,0,403,404,3,120,60,0,404,405,5,79,0,0,405,57,1,0,0,0, + 406,407,5,43,0,0,407,408,5,78,0,0,408,409,3,100,50,0,409,410,5,79, + 0,0,410,59,1,0,0,0,411,414,3,88,44,0,412,415,3,84,42,0,413,415,3, + 100,50,0,414,412,1,0,0,0,414,413,1,0,0,0,415,61,1,0,0,0,416,417, + 5,27,0,0,417,421,5,85,0,0,418,420,3,6,3,0,419,418,1,0,0,0,420,423, + 1,0,0,0,421,419,1,0,0,0,421,422,1,0,0,0,422,424,1,0,0,0,423,421, + 1,0,0,0,424,425,5,86,0,0,425,63,1,0,0,0,426,427,5,67,0,0,427,428, + 5,78,0,0,428,429,3,8,4,0,429,430,3,26,13,0,430,431,5,1,0,0,431,432, + 3,8,4,0,432,433,5,79,0,0,433,437,5,85,0,0,434,436,3,6,3,0,435,434, + 1,0,0,0,436,439,1,0,0,0,437,435,1,0,0,0,437,438,1,0,0,0,438,440, + 1,0,0,0,439,437,1,0,0,0,440,441,5,86,0,0,441,65,1,0,0,0,442,444, + 5,55,0,0,443,445,5,19,0,0,444,443,1,0,0,0,444,445,1,0,0,0,445,446, + 1,0,0,0,446,447,5,78,0,0,447,448,3,26,13,0,448,449,5,79,0,0,449, + 453,5,85,0,0,450,452,3,6,3,0,451,450,1,0,0,0,452,455,1,0,0,0,453, + 451,1,0,0,0,453,454,1,0,0,0,454,456,1,0,0,0,455,453,1,0,0,0,456, + 457,5,86,0,0,457,67,1,0,0,0,458,466,3,70,35,0,459,466,3,72,36,0, + 460,466,3,74,37,0,461,466,3,76,38,0,462,466,3,78,39,0,463,466,3, + 80,40,0,464,466,3,82,41,0,465,458,1,0,0,0,465,459,1,0,0,0,465,460, + 1,0,0,0,465,461,1,0,0,0,465,462,1,0,0,0,465,463,1,0,0,0,465,464, + 1,0,0,0,466,69,1,0,0,0,467,471,3,100,50,0,468,469,5,56,0,0,469,470, + 5,73,0,0,470,472,5,57,0,0,471,468,1,0,0,0,471,472,1,0,0,0,472,473, + 1,0,0,0,473,476,3,90,45,0,474,477,3,100,50,0,475,477,3,84,42,0,476, + 474,1,0,0,0,476,475,1,0,0,0,477,71,1,0,0,0,478,479,5,47,0,0,479, + 480,3,100,50,0,480,73,1,0,0,0,481,482,5,49,0,0,482,483,3,100,50, + 0,483,75,1,0,0,0,484,487,5,48,0,0,485,488,5,51,0,0,486,488,3,86, + 43,0,487,485,1,0,0,0,487,486,1,0,0,0,488,77,1,0,0,0,489,490,5,52, + 0,0,490,491,5,4,0,0,491,492,3,100,50,0,492,79,1,0,0,0,493,494,5, + 42,0,0,494,495,5,78,0,0,495,496,3,100,50,0,496,497,5,79,0,0,497, + 498,5,4,0,0,498,499,3,100,50,0,499,81,1,0,0,0,500,501,3,100,50,0, + 501,502,5,4,0,0,502,503,5,50,0,0,503,504,5,56,0,0,504,505,5,73,0, + 0,505,506,5,80,0,0,506,507,5,73,0,0,507,508,5,57,0,0,508,83,1,0, + 0,0,509,510,5,36,0,0,510,511,5,78,0,0,511,512,3,100,50,0,512,513, + 5,79,0,0,513,85,1,0,0,0,514,515,5,50,0,0,515,516,5,78,0,0,516,517, + 3,100,50,0,517,518,5,79,0,0,518,87,1,0,0,0,519,520,7,3,0,0,520,89, + 1,0,0,0,521,522,7,4,0,0,522,91,1,0,0,0,523,527,3,96,48,0,524,527, + 3,94,47,0,525,527,3,98,49,0,526,523,1,0,0,0,526,524,1,0,0,0,526, + 525,1,0,0,0,527,93,1,0,0,0,528,529,5,62,0,0,529,530,5,73,0,0,530, + 531,3,106,53,0,531,95,1,0,0,0,532,533,5,61,0,0,533,534,5,70,0,0, + 534,535,3,106,53,0,535,97,1,0,0,0,536,537,5,62,0,0,537,538,5,73, + 0,0,538,540,3,130,65,0,539,541,5,78,0,0,540,539,1,0,0,0,540,541, + 1,0,0,0,541,542,1,0,0,0,542,544,3,100,50,0,543,545,5,79,0,0,544, + 543,1,0,0,0,544,545,1,0,0,0,545,546,1,0,0,0,546,547,3,106,53,0,547, + 99,1,0,0,0,548,549,7,5,0,0,549,101,1,0,0,0,550,552,5,70,0,0,551, + 553,3,104,52,0,552,551,1,0,0,0,552,553,1,0,0,0,553,554,1,0,0,0,554, + 556,5,78,0,0,555,557,3,110,55,0,556,555,1,0,0,0,556,557,1,0,0,0, + 557,558,1,0,0,0,558,559,5,79,0,0,559,103,1,0,0,0,560,561,5,5,0,0, + 561,562,3,128,64,0,562,563,5,6,0,0,563,105,1,0,0,0,564,571,5,85, + 0,0,565,567,3,6,3,0,566,565,1,0,0,0,567,568,1,0,0,0,568,566,1,0, + 0,0,568,569,1,0,0,0,569,572,1,0,0,0,570,572,3,108,54,0,571,566,1, + 0,0,0,571,570,1,0,0,0,572,573,1,0,0,0,573,574,5,86,0,0,574,107,1, + 0,0,0,575,576,5,66,0,0,576,577,5,68,0,0,577,578,5,1,0,0,578,109, + 1,0,0,0,579,584,3,112,56,0,580,581,5,80,0,0,581,583,3,112,56,0,582, + 580,1,0,0,0,583,586,1,0,0,0,584,582,1,0,0,0,584,585,1,0,0,0,585, + 588,1,0,0,0,586,584,1,0,0,0,587,589,5,80,0,0,588,587,1,0,0,0,588, + 589,1,0,0,0,589,111,1,0,0,0,590,594,3,100,50,0,591,594,3,120,60, + 0,592,594,3,114,57,0,593,590,1,0,0,0,593,591,1,0,0,0,593,592,1,0, + 0,0,594,113,1,0,0,0,595,596,5,69,0,0,596,597,5,5,0,0,597,598,5,58, + 0,0,598,599,5,80,0,0,599,600,3,116,58,0,600,601,5,80,0,0,601,602, + 3,116,58,0,602,603,5,6,0,0,603,115,1,0,0,0,604,605,7,6,0,0,605,117, + 1,0,0,0,606,607,7,7,0,0,607,608,5,70,0,0,608,119,1,0,0,0,609,612, + 3,126,63,0,610,612,3,122,61,0,611,609,1,0,0,0,611,610,1,0,0,0,612, + 121,1,0,0,0,613,614,5,85,0,0,614,619,3,124,62,0,615,616,5,80,0,0, + 616,618,3,124,62,0,617,615,1,0,0,0,618,621,1,0,0,0,619,617,1,0,0, + 0,619,620,1,0,0,0,620,623,1,0,0,0,621,619,1,0,0,0,622,624,5,80,0, + 0,623,622,1,0,0,0,623,624,1,0,0,0,624,625,1,0,0,0,625,626,5,86,0, + 0,626,123,1,0,0,0,627,628,5,70,0,0,628,629,5,4,0,0,629,630,3,126, + 63,0,630,125,1,0,0,0,631,632,7,8,0,0,632,127,1,0,0,0,633,634,5,70, + 0,0,634,635,3,100,50,0,635,129,1,0,0,0,636,637,5,67,0,0,637,640, + 5,70,0,0,638,640,5,60,0,0,639,636,1,0,0,0,639,638,1,0,0,0,640,131, + 1,0,0,0,55,135,140,142,155,161,176,184,201,214,221,229,237,244,248, + 252,260,268,278,288,291,299,302,324,326,338,340,351,355,362,366, + 374,399,414,421,437,444,453,465,471,476,487,526,540,544,552,556, + 568,571,584,588,593,611,619,623,639 ] class ExplorerScriptParser ( Parser ): @@ -1229,13 +1231,16 @@ def CLOSE_PAREN(self): def OPEN_BRACE(self): return self.getToken(ExplorerScriptParser.OPEN_BRACE, 0) - def simple_stmt(self): - return self.getTypedRuleContext(ExplorerScriptParser.Simple_stmtContext,0) - - def CLOSE_BRACE(self): return self.getToken(ExplorerScriptParser.CLOSE_BRACE, 0) + def simple_stmt(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(ExplorerScriptParser.Simple_stmtContext) + else: + return self.getTypedRuleContext(ExplorerScriptParser.Simple_stmtContext,i) + + def getRuleIndex(self): return ExplorerScriptParser.RULE_ctx_block @@ -1260,6 +1265,7 @@ def ctx_block(self): localctx = ExplorerScriptParser.Ctx_blockContext(self, self._ctx, self.state) self.enterRule(localctx, 18, self.RULE_ctx_block) + self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) self.state = 206 @@ -1272,9 +1278,17 @@ def ctx_block(self): self.match(ExplorerScriptParser.CLOSE_PAREN) self.state = 210 self.match(ExplorerScriptParser.OPEN_BRACE) - self.state = 211 - self.simple_stmt() - self.state = 212 + self.state = 214 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & 5493227741249536) != 0) or ((((_la - 70)) & ~0x3f) == 0 and ((1 << (_la - 70)) & 155659) != 0): + self.state = 211 + self.simple_stmt() + self.state = 216 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 217 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -1368,63 +1382,63 @@ def if_block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 214 + self.state = 219 self.match(ExplorerScriptParser.IF) - self.state = 216 + self.state = 221 self._errHandler.sync(self) _la = self._input.LA(1) if _la==19: - self.state = 215 + self.state = 220 self.match(ExplorerScriptParser.NOT) - self.state = 218 + self.state = 223 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 219 - self.if_header() self.state = 224 + self.if_header() + self.state = 229 self._errHandler.sync(self) _la = self._input.LA(1) while _la==18: - self.state = 220 + self.state = 225 self.match(ExplorerScriptParser.OR) - self.state = 221 - self.if_header() self.state = 226 + self.if_header() + self.state = 231 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 227 + self.state = 232 self.match(ExplorerScriptParser.CLOSE_PAREN) - self.state = 228 + self.state = 233 self.match(ExplorerScriptParser.OPEN_BRACE) - self.state = 232 + self.state = 237 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & 68543623480737792) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & 1245305) != 0): - self.state = 229 - self.stmt() self.state = 234 + self.stmt() + self.state = 239 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 235 + self.state = 240 self.match(ExplorerScriptParser.CLOSE_BRACE) - self.state = 239 + self.state = 244 self._errHandler.sync(self) _la = self._input.LA(1) while _la==25: - self.state = 236 - self.elseif_block() self.state = 241 + self.elseif_block() + self.state = 246 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 243 + self.state = 248 self._errHandler.sync(self) _la = self._input.LA(1) if _la==26: - self.state = 242 + self.state = 247 self.else_block() @@ -1509,47 +1523,47 @@ def elseif_block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 245 + self.state = 250 self.match(ExplorerScriptParser.ELSEIF) - self.state = 247 + self.state = 252 self._errHandler.sync(self) _la = self._input.LA(1) if _la==19: - self.state = 246 + self.state = 251 self.match(ExplorerScriptParser.NOT) - self.state = 249 + self.state = 254 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 250 - self.if_header() self.state = 255 + self.if_header() + self.state = 260 self._errHandler.sync(self) _la = self._input.LA(1) while _la==18: - self.state = 251 + self.state = 256 self.match(ExplorerScriptParser.OR) - self.state = 252 - self.if_header() self.state = 257 + self.if_header() + self.state = 262 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 258 + self.state = 263 self.match(ExplorerScriptParser.CLOSE_PAREN) - self.state = 259 + self.state = 264 self.match(ExplorerScriptParser.OPEN_BRACE) - self.state = 263 + self.state = 268 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & 68543623480737792) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & 1245305) != 0): - self.state = 260 - self.stmt() self.state = 265 + self.stmt() + self.state = 270 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 266 + self.state = 271 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -1610,21 +1624,21 @@ def else_block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 268 + self.state = 273 self.match(ExplorerScriptParser.ELSE) - self.state = 269 + self.state = 274 self.match(ExplorerScriptParser.OPEN_BRACE) - self.state = 273 + self.state = 278 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & 68543623480737792) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & 1245305) != 0): - self.state = 270 - self.stmt() self.state = 275 + self.stmt() + self.state = 280 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 276 + self.state = 281 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -1688,31 +1702,31 @@ def if_header(self): self.enterRule(localctx, 26, self.RULE_if_header) try: self.enterOuterAlt(localctx, 1) - self.state = 283 + self.state = 288 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,17,self._ctx) + la_ = self._interp.adaptivePredict(self._input,18,self._ctx) if la_ == 1: - self.state = 278 + self.state = 283 self.if_h_op() pass elif la_ == 2: - self.state = 279 + self.state = 284 self.if_h_bit() pass elif la_ == 3: - self.state = 280 + self.state = 285 self.if_h_negatable() pass elif la_ == 4: - self.state = 281 + self.state = 286 self.if_h_scn() pass elif la_ == 5: - self.state = 282 + self.state = 287 self.operation() pass @@ -1772,15 +1786,15 @@ def if_h_negatable(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 286 + self.state = 291 self._errHandler.sync(self) _la = self._input.LA(1) if _la==19: - self.state = 285 + self.state = 290 self.match(ExplorerScriptParser.NOT) - self.state = 288 + self.state = 293 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 962072674304) != 0)): self._errHandler.recoverInline(self) @@ -1844,19 +1858,19 @@ def if_h_op(self): self.enterRule(localctx, 30, self.RULE_if_h_op) try: self.enterOuterAlt(localctx, 1) - self.state = 290 + self.state = 295 self.integer_like() - self.state = 291 + self.state = 296 self.conditional_operator() - self.state = 294 + self.state = 299 self._errHandler.sync(self) token = self._input.LA(1) if token in [36]: - self.state = 292 + self.state = 297 self.value_of() pass elif token in [70, 71, 73, 87]: - self.state = 293 + self.state = 298 self.integer_like() pass else: @@ -1921,21 +1935,21 @@ def if_h_bit(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 297 + self.state = 302 self._errHandler.sync(self) _la = self._input.LA(1) if _la==19: - self.state = 296 + self.state = 301 self.match(ExplorerScriptParser.NOT) - self.state = 299 + self.state = 304 self.integer_like() - self.state = 300 + self.state = 305 self.match(ExplorerScriptParser.OPEN_BRACKET) - self.state = 301 + self.state = 306 self.match(ExplorerScriptParser.INTEGER) - self.state = 302 + self.state = 307 self.match(ExplorerScriptParser.CLOSE_BRACKET) except RecognitionException as re: localctx.exception = re @@ -2002,19 +2016,19 @@ def if_h_scn(self): self.enterRule(localctx, 34, self.RULE_if_h_scn) try: self.enterOuterAlt(localctx, 1) - self.state = 304 + self.state = 309 self.scn_var() - self.state = 305 + self.state = 310 self.conditional_operator() - self.state = 306 + self.state = 311 self.match(ExplorerScriptParser.OPEN_BRACKET) - self.state = 307 + self.state = 312 self.match(ExplorerScriptParser.INTEGER) - self.state = 308 + self.state = 313 self.match(ExplorerScriptParser.COMMA) - self.state = 309 + self.state = 314 self.match(ExplorerScriptParser.INTEGER) - self.state = 310 + self.state = 315 self.match(ExplorerScriptParser.CLOSE_BRACKET) except RecognitionException as re: localctx.exception = re @@ -2092,39 +2106,39 @@ def switch_block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 312 + self.state = 317 self.match(ExplorerScriptParser.SWITCH) - self.state = 313 + self.state = 318 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 314 + self.state = 319 self.switch_header() - self.state = 315 + self.state = 320 self.match(ExplorerScriptParser.CLOSE_PAREN) - self.state = 316 - self.match(ExplorerScriptParser.OPEN_BRACE) self.state = 321 + self.match(ExplorerScriptParser.OPEN_BRACE) + self.state = 326 self._errHandler.sync(self) _la = self._input.LA(1) while _la==45 or _la==46: - self.state = 319 + self.state = 324 self._errHandler.sync(self) token = self._input.LA(1) if token in [46]: - self.state = 317 + self.state = 322 self.default() pass elif token in [45]: - self.state = 318 + self.state = 323 self.single_case_block() pass else: raise NoViableAltException(self) - self.state = 323 + self.state = 328 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 324 + self.state = 329 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -2205,44 +2219,44 @@ def message_switch_block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 326 + self.state = 331 _la = self._input.LA(1) if not(_la==53 or _la==54): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 327 + self.state = 332 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 328 + self.state = 333 self.integer_like() - self.state = 329 + self.state = 334 self.match(ExplorerScriptParser.CLOSE_PAREN) - self.state = 330 - self.match(ExplorerScriptParser.OPEN_BRACE) self.state = 335 + self.match(ExplorerScriptParser.OPEN_BRACE) + self.state = 340 self._errHandler.sync(self) _la = self._input.LA(1) while _la==45 or _la==46: - self.state = 333 + self.state = 338 self._errHandler.sync(self) token = self._input.LA(1) if token in [46]: - self.state = 331 + self.state = 336 self.default() pass elif token in [45]: - self.state = 332 + self.state = 337 self.single_case_block() pass else: raise NoViableAltException(self) - self.state = 337 + self.state = 342 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 338 + self.state = 343 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -2308,29 +2322,29 @@ def single_case_block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 340 + self.state = 345 self.match(ExplorerScriptParser.CASE) - self.state = 341 + self.state = 346 self.case_header() - self.state = 342 + self.state = 347 self.match(ExplorerScriptParser.COLON) - self.state = 350 + self.state = 355 self._errHandler.sync(self) token = self._input.LA(1) if token in [20, 21, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 42, 45, 46, 47, 48, 49, 52, 53, 54, 55, 67, 70, 71, 72, 73, 83, 84, 86, 87]: - self.state = 346 + self.state = 351 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & 68543623480737792) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & 1245305) != 0): - self.state = 343 - self.stmt() self.state = 348 + self.stmt() + self.state = 353 self._errHandler.sync(self) _la = self._input.LA(1) pass elif token in [58, 59, 85]: - self.state = 349 + self.state = 354 self.string() pass else: @@ -2396,27 +2410,27 @@ def default(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 352 + self.state = 357 self.match(ExplorerScriptParser.DEFAULT) - self.state = 353 + self.state = 358 self.match(ExplorerScriptParser.COLON) - self.state = 361 + self.state = 366 self._errHandler.sync(self) token = self._input.LA(1) if token in [20, 21, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 42, 45, 46, 47, 48, 49, 52, 53, 54, 55, 67, 70, 71, 72, 73, 83, 84, 86, 87]: - self.state = 357 + self.state = 362 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & 68543623480737792) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & 1245305) != 0): - self.state = 354 - self.stmt() self.state = 359 + self.stmt() + self.state = 364 self._errHandler.sync(self) _la = self._input.LA(1) pass elif token in [58, 59, 85]: - self.state = 360 + self.state = 365 self.string() pass else: @@ -2487,42 +2501,42 @@ def switch_header(self): localctx = ExplorerScriptParser.Switch_headerContext(self, self._ctx, self.state) self.enterRule(localctx, 44, self.RULE_switch_header) try: - self.state = 369 + self.state = 374 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,29,self._ctx) + la_ = self._interp.adaptivePredict(self._input,30,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 363 + self.state = 368 self.integer_like() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 364 + self.state = 369 self.operation() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 365 + self.state = 370 self.switch_h_scn() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 366 + self.state = 371 self.switch_h_random() pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 367 + self.state = 372 self.switch_h_dungeon_mode() pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 368 + self.state = 373 self.switch_h_sector() pass @@ -2582,13 +2596,13 @@ def switch_h_scn(self): self.enterRule(localctx, 46, self.RULE_switch_h_scn) try: self.enterOuterAlt(localctx, 1) - self.state = 371 + self.state = 376 self.scn_var() - self.state = 372 + self.state = 377 self.match(ExplorerScriptParser.OPEN_BRACKET) - self.state = 373 + self.state = 378 self.match(ExplorerScriptParser.INTEGER) - self.state = 374 + self.state = 379 self.match(ExplorerScriptParser.CLOSE_BRACKET) except RecognitionException as re: localctx.exception = re @@ -2645,13 +2659,13 @@ def switch_h_random(self): self.enterRule(localctx, 48, self.RULE_switch_h_random) try: self.enterOuterAlt(localctx, 1) - self.state = 376 + self.state = 381 self.match(ExplorerScriptParser.RANDOM) - self.state = 377 + self.state = 382 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 378 + self.state = 383 self.integer_like() - self.state = 379 + self.state = 384 self.match(ExplorerScriptParser.CLOSE_PAREN) except RecognitionException as re: localctx.exception = re @@ -2708,13 +2722,13 @@ def switch_h_dungeon_mode(self): self.enterRule(localctx, 50, self.RULE_switch_h_dungeon_mode) try: self.enterOuterAlt(localctx, 1) - self.state = 381 + self.state = 386 self.match(ExplorerScriptParser.DUNGEON_MODE) - self.state = 382 + self.state = 387 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 383 + self.state = 388 self.integer_like() - self.state = 384 + self.state = 389 self.match(ExplorerScriptParser.CLOSE_PAREN) except RecognitionException as re: localctx.exception = re @@ -2767,11 +2781,11 @@ def switch_h_sector(self): self.enterRule(localctx, 52, self.RULE_switch_h_sector) try: self.enterOuterAlt(localctx, 1) - self.state = 386 + self.state = 391 self.match(ExplorerScriptParser.SECTOR) - self.state = 387 + self.state = 392 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 388 + self.state = 393 self.match(ExplorerScriptParser.CLOSE_PAREN) except RecognitionException as re: localctx.exception = re @@ -2830,27 +2844,27 @@ def case_header(self): localctx = ExplorerScriptParser.Case_headerContext(self, self._ctx, self.state) self.enterRule(localctx, 54, self.RULE_case_header) try: - self.state = 394 + self.state = 399 self._errHandler.sync(self) token = self._input.LA(1) if token in [70, 71, 73, 87]: self.enterOuterAlt(localctx, 1) - self.state = 390 + self.state = 395 self.integer_like() pass elif token in [44]: self.enterOuterAlt(localctx, 2) - self.state = 391 + self.state = 396 self.case_h_menu() pass elif token in [43]: self.enterOuterAlt(localctx, 3) - self.state = 392 + self.state = 397 self.case_h_menu2() pass elif token in [2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13]: self.enterOuterAlt(localctx, 4) - self.state = 393 + self.state = 398 self.case_h_op() pass else: @@ -2911,13 +2925,13 @@ def case_h_menu(self): self.enterRule(localctx, 56, self.RULE_case_h_menu) try: self.enterOuterAlt(localctx, 1) - self.state = 396 + self.state = 401 self.match(ExplorerScriptParser.MENU) - self.state = 397 + self.state = 402 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 398 + self.state = 403 self.string() - self.state = 399 + self.state = 404 self.match(ExplorerScriptParser.CLOSE_PAREN) except RecognitionException as re: localctx.exception = re @@ -2974,13 +2988,13 @@ def case_h_menu2(self): self.enterRule(localctx, 58, self.RULE_case_h_menu2) try: self.enterOuterAlt(localctx, 1) - self.state = 401 + self.state = 406 self.match(ExplorerScriptParser.MENU2) - self.state = 402 + self.state = 407 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 403 + self.state = 408 self.integer_like() - self.state = 404 + self.state = 409 self.match(ExplorerScriptParser.CLOSE_PAREN) except RecognitionException as re: localctx.exception = re @@ -3036,17 +3050,17 @@ def case_h_op(self): self.enterRule(localctx, 60, self.RULE_case_h_op) try: self.enterOuterAlt(localctx, 1) - self.state = 406 + self.state = 411 self.conditional_operator() - self.state = 409 + self.state = 414 self._errHandler.sync(self) token = self._input.LA(1) if token in [36]: - self.state = 407 + self.state = 412 self.value_of() pass elif token in [70, 71, 73, 87]: - self.state = 408 + self.state = 413 self.integer_like() pass else: @@ -3111,21 +3125,21 @@ def forever_block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 411 + self.state = 416 self.match(ExplorerScriptParser.FOREVER) - self.state = 412 + self.state = 417 self.match(ExplorerScriptParser.OPEN_BRACE) - self.state = 416 + self.state = 421 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & 68543623480737792) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & 1245305) != 0): - self.state = 413 - self.stmt() self.state = 418 + self.stmt() + self.state = 423 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 419 + self.state = 424 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -3203,33 +3217,33 @@ def for_block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 421 + self.state = 426 self.match(ExplorerScriptParser.FOR) - self.state = 422 + self.state = 427 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 423 + self.state = 428 self.simple_stmt() - self.state = 424 + self.state = 429 self.if_header() - self.state = 425 + self.state = 430 self.match(ExplorerScriptParser.T__0) - self.state = 426 + self.state = 431 self.simple_stmt() - self.state = 427 + self.state = 432 self.match(ExplorerScriptParser.CLOSE_PAREN) - self.state = 428 + self.state = 433 self.match(ExplorerScriptParser.OPEN_BRACE) - self.state = 432 + self.state = 437 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & 68543623480737792) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & 1245305) != 0): - self.state = 429 - self.stmt() self.state = 434 + self.stmt() + self.state = 439 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 435 + self.state = 440 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -3303,35 +3317,35 @@ def while_block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 437 + self.state = 442 self.match(ExplorerScriptParser.WHILE) - self.state = 439 + self.state = 444 self._errHandler.sync(self) _la = self._input.LA(1) if _la==19: - self.state = 438 + self.state = 443 self.match(ExplorerScriptParser.NOT) - self.state = 441 + self.state = 446 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 442 + self.state = 447 self.if_header() - self.state = 443 + self.state = 448 self.match(ExplorerScriptParser.CLOSE_PAREN) - self.state = 444 + self.state = 449 self.match(ExplorerScriptParser.OPEN_BRACE) - self.state = 448 + self.state = 453 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & 68543623480737792) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & 1245305) != 0): - self.state = 445 - self.stmt() self.state = 450 + self.stmt() + self.state = 455 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 451 + self.state = 456 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -3402,48 +3416,48 @@ def assignment(self): localctx = ExplorerScriptParser.AssignmentContext(self, self._ctx, self.state) self.enterRule(localctx, 68, self.RULE_assignment) try: - self.state = 460 + self.state = 465 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,36,self._ctx) + la_ = self._interp.adaptivePredict(self._input,37,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 453 + self.state = 458 self.assignment_regular() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 454 + self.state = 459 self.assignment_clear() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 455 + self.state = 460 self.assignment_initial() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 456 + self.state = 461 self.assignment_reset() pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 457 + self.state = 462 self.assignment_adv_log() pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 458 + self.state = 463 self.assignment_dungeon_mode() pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 459 + self.state = 464 self.assignment_scn() pass @@ -3515,31 +3529,31 @@ def assignment_regular(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 462 + self.state = 467 self.integer_like() - self.state = 466 + self.state = 471 self._errHandler.sync(self) _la = self._input.LA(1) if _la==56: - self.state = 463 + self.state = 468 self.match(ExplorerScriptParser.OPEN_BRACKET) - self.state = 464 + self.state = 469 self.match(ExplorerScriptParser.INTEGER) - self.state = 465 + self.state = 470 self.match(ExplorerScriptParser.CLOSE_BRACKET) - self.state = 468 + self.state = 473 self.assign_operator() - self.state = 471 + self.state = 476 self._errHandler.sync(self) token = self._input.LA(1) if token in [70, 71, 73, 87]: - self.state = 469 + self.state = 474 self.integer_like() pass elif token in [36]: - self.state = 470 + self.state = 475 self.value_of() pass else: @@ -3594,9 +3608,9 @@ def assignment_clear(self): self.enterRule(localctx, 72, self.RULE_assignment_clear) try: self.enterOuterAlt(localctx, 1) - self.state = 473 + self.state = 478 self.match(ExplorerScriptParser.CLEAR) - self.state = 474 + self.state = 479 self.integer_like() except RecognitionException as re: localctx.exception = re @@ -3647,9 +3661,9 @@ def assignment_initial(self): self.enterRule(localctx, 74, self.RULE_assignment_initial) try: self.enterOuterAlt(localctx, 1) - self.state = 476 + self.state = 481 self.match(ExplorerScriptParser.INIT) - self.state = 477 + self.state = 482 self.integer_like() except RecognitionException as re: localctx.exception = re @@ -3703,17 +3717,17 @@ def assignment_reset(self): self.enterRule(localctx, 76, self.RULE_assignment_reset) try: self.enterOuterAlt(localctx, 1) - self.state = 479 + self.state = 484 self.match(ExplorerScriptParser.RESET) - self.state = 482 + self.state = 487 self._errHandler.sync(self) token = self._input.LA(1) if token in [51]: - self.state = 480 + self.state = 485 self.match(ExplorerScriptParser.DUNGEON_RESULT) pass elif token in [50]: - self.state = 481 + self.state = 486 self.scn_var() pass else: @@ -3771,11 +3785,11 @@ def assignment_adv_log(self): self.enterRule(localctx, 78, self.RULE_assignment_adv_log) try: self.enterOuterAlt(localctx, 1) - self.state = 484 + self.state = 489 self.match(ExplorerScriptParser.ADVENTURE_LOG) - self.state = 485 + self.state = 490 self.match(ExplorerScriptParser.ASSIGN) - self.state = 486 + self.state = 491 self.integer_like() except RecognitionException as re: localctx.exception = re @@ -3838,17 +3852,17 @@ def assignment_dungeon_mode(self): self.enterRule(localctx, 80, self.RULE_assignment_dungeon_mode) try: self.enterOuterAlt(localctx, 1) - self.state = 488 + self.state = 493 self.match(ExplorerScriptParser.DUNGEON_MODE) - self.state = 489 + self.state = 494 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 490 + self.state = 495 self.integer_like() - self.state = 491 + self.state = 496 self.match(ExplorerScriptParser.CLOSE_PAREN) - self.state = 492 + self.state = 497 self.match(ExplorerScriptParser.ASSIGN) - self.state = 493 + self.state = 498 self.integer_like() except RecognitionException as re: localctx.exception = re @@ -3917,21 +3931,21 @@ def assignment_scn(self): self.enterRule(localctx, 82, self.RULE_assignment_scn) try: self.enterOuterAlt(localctx, 1) - self.state = 495 + self.state = 500 self.integer_like() - self.state = 496 + self.state = 501 self.match(ExplorerScriptParser.ASSIGN) - self.state = 497 + self.state = 502 self.match(ExplorerScriptParser.SCN) - self.state = 498 + self.state = 503 self.match(ExplorerScriptParser.OPEN_BRACKET) - self.state = 499 + self.state = 504 self.match(ExplorerScriptParser.INTEGER) - self.state = 500 + self.state = 505 self.match(ExplorerScriptParser.COMMA) - self.state = 501 + self.state = 506 self.match(ExplorerScriptParser.INTEGER) - self.state = 502 + self.state = 507 self.match(ExplorerScriptParser.CLOSE_BRACKET) except RecognitionException as re: localctx.exception = re @@ -3988,13 +4002,13 @@ def value_of(self): self.enterRule(localctx, 84, self.RULE_value_of) try: self.enterOuterAlt(localctx, 1) - self.state = 504 + self.state = 509 self.match(ExplorerScriptParser.VALUE) - self.state = 505 + self.state = 510 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 506 + self.state = 511 self.integer_like() - self.state = 507 + self.state = 512 self.match(ExplorerScriptParser.CLOSE_PAREN) except RecognitionException as re: localctx.exception = re @@ -4051,13 +4065,13 @@ def scn_var(self): self.enterRule(localctx, 86, self.RULE_scn_var) try: self.enterOuterAlt(localctx, 1) - self.state = 509 + self.state = 514 self.match(ExplorerScriptParser.SCN) - self.state = 510 + self.state = 515 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 511 + self.state = 516 self.integer_like() - self.state = 512 + self.state = 517 self.match(ExplorerScriptParser.CLOSE_PAREN) except RecognitionException as re: localctx.exception = re @@ -4135,7 +4149,7 @@ def conditional_operator(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 514 + self.state = 519 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 16364) != 0)): self._errHandler.recoverInline(self) @@ -4200,7 +4214,7 @@ def assign_operator(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 516 + self.state = 521 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 245776) != 0)): self._errHandler.recoverInline(self) @@ -4260,24 +4274,24 @@ def funcdef(self): localctx = ExplorerScriptParser.FuncdefContext(self, self._ctx, self.state) self.enterRule(localctx, 92, self.RULE_funcdef) try: - self.state = 521 + self.state = 526 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,40,self._ctx) + la_ = self._interp.adaptivePredict(self._input,41,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 518 + self.state = 523 self.coro_def() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 519 + self.state = 524 self.simple_def() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 520 + self.state = 525 self.for_target_def() pass @@ -4334,11 +4348,11 @@ def simple_def(self): self.enterRule(localctx, 94, self.RULE_simple_def) try: self.enterOuterAlt(localctx, 1) - self.state = 523 + self.state = 528 self.match(ExplorerScriptParser.DEF) - self.state = 524 + self.state = 529 self.match(ExplorerScriptParser.INTEGER) - self.state = 525 + self.state = 530 self.func_suite() except RecognitionException as re: localctx.exception = re @@ -4392,11 +4406,11 @@ def coro_def(self): self.enterRule(localctx, 96, self.RULE_coro_def) try: self.enterOuterAlt(localctx, 1) - self.state = 527 + self.state = 532 self.match(ExplorerScriptParser.CORO) - self.state = 528 + self.state = 533 self.match(ExplorerScriptParser.IDENTIFIER) - self.state = 529 + self.state = 534 self.func_suite() except RecognitionException as re: localctx.exception = re @@ -4465,31 +4479,31 @@ def for_target_def(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 531 + self.state = 536 self.match(ExplorerScriptParser.DEF) - self.state = 532 + self.state = 537 self.match(ExplorerScriptParser.INTEGER) - self.state = 533 + self.state = 538 self.for_target_def_target() - self.state = 535 + self.state = 540 self._errHandler.sync(self) _la = self._input.LA(1) if _la==78: - self.state = 534 + self.state = 539 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 537 + self.state = 542 self.integer_like() - self.state = 539 + self.state = 544 self._errHandler.sync(self) _la = self._input.LA(1) if _la==79: - self.state = 538 + self.state = 543 self.match(ExplorerScriptParser.CLOSE_PAREN) - self.state = 541 + self.state = 546 self.func_suite() except RecognitionException as re: localctx.exception = re @@ -4546,7 +4560,7 @@ def integer_like(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 543 + self.state = 548 _la = self._input.LA(1) if not(((((_la - 70)) & ~0x3f) == 0 and ((1 << (_la - 70)) & 131083) != 0)): self._errHandler.recoverInline(self) @@ -4613,27 +4627,27 @@ def operation(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 545 + self.state = 550 self.match(ExplorerScriptParser.IDENTIFIER) - self.state = 547 + self.state = 552 self._errHandler.sync(self) _la = self._input.LA(1) if _la==5: - self.state = 546 + self.state = 551 self.inline_ctx() - self.state = 549 + self.state = 554 self.match(ExplorerScriptParser.OPEN_PAREN) - self.state = 551 + self.state = 556 self._errHandler.sync(self) _la = self._input.LA(1) if ((((_la - 58)) & ~0x3f) == 0 and ((1 << (_la - 58)) & 671135747) != 0): - self.state = 550 + self.state = 555 self.arglist() - self.state = 553 + self.state = 558 self.match(ExplorerScriptParser.CLOSE_PAREN) except RecognitionException as re: localctx.exception = re @@ -4687,11 +4701,11 @@ def inline_ctx(self): self.enterRule(localctx, 104, self.RULE_inline_ctx) try: self.enterOuterAlt(localctx, 1) - self.state = 555 + self.state = 560 self.match(ExplorerScriptParser.OPEN_SHARP) - self.state = 556 + self.state = 561 self.ctx_header() - self.state = 557 + self.state = 562 self.match(ExplorerScriptParser.CLOSE_SHARP) except RecognitionException as re: localctx.exception = re @@ -4753,19 +4767,19 @@ def func_suite(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 559 + self.state = 564 self.match(ExplorerScriptParser.OPEN_BRACE) - self.state = 566 + self.state = 571 self._errHandler.sync(self) token = self._input.LA(1) if token in [20, 21, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 42, 47, 48, 49, 52, 53, 54, 55, 67, 70, 71, 72, 73, 83, 84, 87]: - self.state = 561 + self.state = 566 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 560 + self.state = 565 self.stmt() - self.state = 563 + self.state = 568 self._errHandler.sync(self) _la = self._input.LA(1) if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & 68543623480737792) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & 1245305) != 0)): @@ -4773,13 +4787,13 @@ def func_suite(self): pass elif token in [66]: - self.state = 565 + self.state = 570 self.func_alias() pass else: raise NoViableAltException(self) - self.state = 568 + self.state = 573 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -4829,11 +4843,11 @@ def func_alias(self): self.enterRule(localctx, 108, self.RULE_func_alias) try: self.enterOuterAlt(localctx, 1) - self.state = 570 + self.state = 575 self.match(ExplorerScriptParser.ALIAS) - self.state = 571 + self.state = 576 self.match(ExplorerScriptParser.PREVIOUS) - self.state = 572 + self.state = 577 self.match(ExplorerScriptParser.T__0) except RecognitionException as re: localctx.exception = re @@ -4891,26 +4905,26 @@ def arglist(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 574 - self.pos_argument() self.state = 579 + self.pos_argument() + self.state = 584 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,47,self._ctx) + _alt = self._interp.adaptivePredict(self._input,48,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 575 + self.state = 580 self.match(ExplorerScriptParser.COMMA) - self.state = 576 + self.state = 581 self.pos_argument() - self.state = 581 + self.state = 586 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,47,self._ctx) + _alt = self._interp.adaptivePredict(self._input,48,self._ctx) - self.state = 583 + self.state = 588 self._errHandler.sync(self) _la = self._input.LA(1) if _la==80: - self.state = 582 + self.state = 587 self.match(ExplorerScriptParser.COMMA) @@ -4967,22 +4981,22 @@ def pos_argument(self): localctx = ExplorerScriptParser.Pos_argumentContext(self, self._ctx, self.state) self.enterRule(localctx, 112, self.RULE_pos_argument) try: - self.state = 588 + self.state = 593 self._errHandler.sync(self) token = self._input.LA(1) if token in [70, 71, 73, 87]: self.enterOuterAlt(localctx, 1) - self.state = 585 + self.state = 590 self.integer_like() pass elif token in [58, 59, 85]: self.enterOuterAlt(localctx, 2) - self.state = 586 + self.state = 591 self.string() pass elif token in [69]: self.enterOuterAlt(localctx, 3) - self.state = 587 + self.state = 592 self.position_marker() pass else: @@ -5055,21 +5069,21 @@ def position_marker(self): self.enterRule(localctx, 114, self.RULE_position_marker) try: self.enterOuterAlt(localctx, 1) - self.state = 590 + self.state = 595 self.match(ExplorerScriptParser.POSITION) - self.state = 591 + self.state = 596 self.match(ExplorerScriptParser.OPEN_SHARP) - self.state = 592 + self.state = 597 self.match(ExplorerScriptParser.STRING_LITERAL) - self.state = 593 + self.state = 598 self.match(ExplorerScriptParser.COMMA) - self.state = 594 + self.state = 599 self.position_marker_arg() - self.state = 595 + self.state = 600 self.match(ExplorerScriptParser.COMMA) - self.state = 596 + self.state = 601 self.position_marker_arg() - self.state = 597 + self.state = 602 self.match(ExplorerScriptParser.CLOSE_SHARP) except RecognitionException as re: localctx.exception = re @@ -5120,7 +5134,7 @@ def position_marker_arg(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 599 + self.state = 604 _la = self._input.LA(1) if not(_la==73 or _la==87): self._errHandler.recoverInline(self) @@ -5179,14 +5193,14 @@ def label(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 601 + self.state = 606 _la = self._input.LA(1) if not(_la==83 or _la==84): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 602 + self.state = 607 self.match(ExplorerScriptParser.IDENTIFIER) except RecognitionException as re: localctx.exception = re @@ -5237,17 +5251,17 @@ def string(self): localctx = ExplorerScriptParser.StringContext(self, self._ctx, self.state) self.enterRule(localctx, 120, self.RULE_string) try: - self.state = 606 + self.state = 611 self._errHandler.sync(self) token = self._input.LA(1) if token in [58, 59]: self.enterOuterAlt(localctx, 1) - self.state = 604 + self.state = 609 self.string_value() pass elif token in [85]: self.enterOuterAlt(localctx, 2) - self.state = 605 + self.state = 610 self.lang_string() pass else: @@ -5315,32 +5329,32 @@ def lang_string(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 608 + self.state = 613 self.match(ExplorerScriptParser.OPEN_BRACE) - self.state = 609 - self.lang_string_argument() self.state = 614 + self.lang_string_argument() + self.state = 619 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,51,self._ctx) + _alt = self._interp.adaptivePredict(self._input,52,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 610 + self.state = 615 self.match(ExplorerScriptParser.COMMA) - self.state = 611 + self.state = 616 self.lang_string_argument() - self.state = 616 + self.state = 621 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,51,self._ctx) + _alt = self._interp.adaptivePredict(self._input,52,self._ctx) - self.state = 618 + self.state = 623 self._errHandler.sync(self) _la = self._input.LA(1) if _la==80: - self.state = 617 + self.state = 622 self.match(ExplorerScriptParser.COMMA) - self.state = 620 + self.state = 625 self.match(ExplorerScriptParser.CLOSE_BRACE) except RecognitionException as re: localctx.exception = re @@ -5394,11 +5408,11 @@ def lang_string_argument(self): self.enterRule(localctx, 124, self.RULE_lang_string_argument) try: self.enterOuterAlt(localctx, 1) - self.state = 622 + self.state = 627 self.match(ExplorerScriptParser.IDENTIFIER) - self.state = 623 + self.state = 628 self.match(ExplorerScriptParser.ASSIGN) - self.state = 624 + self.state = 629 self.string_value() except RecognitionException as re: localctx.exception = re @@ -5449,7 +5463,7 @@ def string_value(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 626 + self.state = 631 _la = self._input.LA(1) if not(_la==58 or _la==59): self._errHandler.recoverInline(self) @@ -5505,9 +5519,9 @@ def ctx_header(self): self.enterRule(localctx, 128, self.RULE_ctx_header) try: self.enterOuterAlt(localctx, 1) - self.state = 628 + self.state = 633 self.match(ExplorerScriptParser.IDENTIFIER) - self.state = 629 + self.state = 634 self.integer_like() except RecognitionException as re: localctx.exception = re @@ -5559,19 +5573,19 @@ def for_target_def_target(self): localctx = ExplorerScriptParser.For_target_def_targetContext(self, self._ctx, self.state) self.enterRule(localctx, 130, self.RULE_for_target_def_target) try: - self.state = 634 + self.state = 639 self._errHandler.sync(self) token = self._input.LA(1) if token in [67]: self.enterOuterAlt(localctx, 1) - self.state = 631 + self.state = 636 self.match(ExplorerScriptParser.FOR) - self.state = 632 + self.state = 637 self.match(ExplorerScriptParser.IDENTIFIER) pass elif token in [60]: self.enterOuterAlt(localctx, 2) - self.state = 633 + self.state = 638 self.match(ExplorerScriptParser.FOR_TARGET) pass else: diff --git a/explorerscript/ssb_converting/compiler/compile_handlers/blocks/ctxs/ctx_block.py b/explorerscript/ssb_converting/compiler/compile_handlers/blocks/ctxs/ctx_block.py index c49e043..767014c 100644 --- a/explorerscript/ssb_converting/compiler/compile_handlers/blocks/ctxs/ctx_block.py +++ b/explorerscript/ssb_converting/compiler/compile_handlers/blocks/ctxs/ctx_block.py @@ -75,50 +75,58 @@ class CtxBlockCompileHandler( AbstractComplexStatementCompileHandler[ExplorerScriptParser.Ctx_blockContext, _SupportedHandlers] ): - """Collects the lives/object/actor opcodes and the opcode after that""" + """ + Compiles a `with` block. + The compiled code contains pairs of an lives/object/performer opcode and an opcode that reference the given actor/object/performer. + """ def __init__(self, ctx: ExplorerScriptParser.Ctx_blockContext, compiler_ctx: CompilerCtx): super().__init__(ctx, compiler_ctx) self._for_id: SsbOpParam | None = None - self._sub_stmt: _SupportedHandlers | None = None + self._sub_stmts: list[_SupportedHandlers] = [] def collect(self) -> list[SsbOperation]: ops = [] if self._for_id is None: raise SsbCompilerError(_("No target ID set for with(){} block.")) - if self._sub_stmt is None: - raise SsbCompilerError(_("A with(){} block needs exactly one statement.")) + + if len(self._sub_stmts) == 0: + raise SsbCompilerError(_("A with(){} block needs at least one statement.")) + for_type = str(self.ctx.ctx_header().IDENTIFIER()) - if for_type == "actor": - ops.append(self._generate_operation(OPS_CTX_LIVES, [self._for_id])) - elif for_type == "object": - ops.append(self._generate_operation(OPS_CTX_OBJECT, [self._for_id])) - elif for_type == "performer": - ops.append(self._generate_operation(OPS_CTX_PERFORMER, [self._for_id])) - else: - raise SsbCompilerError(f(_("Invalid with(){{}} target type '{for_type}'."))) - - assert not isinstance(self._sub_stmt, IntegerLikeCompileHandler) - - sub_ops = self._sub_stmt.collect() - if len(sub_ops) != 1: - if isinstance(self._sub_stmt, OperationCompileHandler): - if self._sub_stmt.ctx.inline_ctx() is not None: - # Provide a more specific error when an inline context is used in the operation. + for sub_stmt in self._sub_stmts: + if for_type == "actor": + ops.append(self._generate_operation(OPS_CTX_LIVES, [self._for_id])) + elif for_type == "object": + ops.append(self._generate_operation(OPS_CTX_OBJECT, [self._for_id])) + elif for_type == "performer": + ops.append(self._generate_operation(OPS_CTX_PERFORMER, [self._for_id])) + else: + raise SsbCompilerError(f(_("Invalid with(){{}} target type '{for_type}'."))) + + assert not isinstance(sub_stmt, IntegerLikeCompileHandler) + sub_ops = sub_stmt.collect() + if len(sub_ops) != 1: + if isinstance(sub_stmt, OperationCompileHandler): + if sub_stmt.ctx.inline_ctx() is not None: + # Provide a more specific error when an inline context is used in the operation. + raise SsbCompilerError( + _( + "Operations inside with(){} blocks cannot contain an inline `actor`, `object` or `performer` context." + ) + ) + + assert not isinstance(sub_stmt, IntegerLikeCompileHandler) + sub_ops = sub_stmt.collect() + if len(sub_ops) != 1: raise SsbCompilerError( _( - "Operations inside with(){} blocks cannot contain an inline `actor`, `object` or `performer` context." + "Each statement inside a with(){} block needs to contain exactly one binary operation. " + "The handler for it generated multiple operations." ) ) - - raise SsbCompilerError( - _( - "A with(){} block needs exactly one binary operation. " - "The handler for it generated multiple operations." - ) - ) - ops += sub_ops + ops += sub_ops return ops @@ -132,8 +140,7 @@ def add(self, obj: _SupportedHandlers) -> None: or isinstance(obj, CallCompileHandler) or isinstance(obj, AbstractAssignmentCompileHandler) ): - self._check_sub_stmt() - self._sub_stmt = obj + self._sub_stmts.append(obj) return if isinstance(obj, LabelCompileHandler): raise SsbCompilerError(_("A with(){} block can not contain labels.")) @@ -144,7 +151,3 @@ def add(self, obj: _SupportedHandlers) -> None: return self._raise_add_error(obj) - - def _check_sub_stmt(self) -> None: - if self._sub_stmt is not None: - raise SsbCompilerError(_("A with(){} block needs exactly one statement.")) diff --git a/tests/compiler/entity_context_test.py b/tests/compiler/entity_context_test.py new file mode 100644 index 0000000..9333055 --- /dev/null +++ b/tests/compiler/entity_context_test.py @@ -0,0 +1,127 @@ +# MIT License +# +# Copyright (c) 2020-2024 Capypara and the SkyTemple Contributors +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +import unittest + +from explorerscript.ssb_converting.ssb_compiler import ExplorerScriptSsbCompiler +from explorerscript.ssb_script.ssb_converting.ssb_decompiler import SsbScriptSsbDecompiler + +INLINE_CTX = """ +def 0 { + operation_actor1(12); + operation_actor2(34); + operation_no_entity(BAZ); + operation_object1(XYZ); + operation_object2(0); + operation_object3(); + operation_performer(); +} +""" + +SINGLE_WITH = """ +def 0 { + with (actor ACTOR_FOO) { + operation_actor1(12); + } + with (actor ACTOR_FOO) { + operation_actor2(34); + } + operation_no_entity(BAZ); + with (object OBJECT_BAR) { + operation_object1(XYZ); + } + with (object OBJECT_BAR) { + operation_object2(0); + } + with (object OBJECT_BAZ) { + operation_object3(); + } + with (performer 9) { + operation_performer(); + } +} +""" + +MULTI_WITH = """ +def 0 { + with (actor ACTOR_FOO) { + operation_actor1(12); + operation_actor2(34); + } + operation_no_entity(BAZ); + with (object OBJECT_BAR) { + operation_object1(XYZ); + operation_object2(0); + } + with (object OBJECT_BAZ) { + operation_object3(); + } + with (performer 9) { + operation_performer(); + } +} +""" + +EXPECTED_SSBSCRIPT = """ +def 0 { + lives(ACTOR_FOO); + operation_actor1(12); + lives(ACTOR_FOO); + operation_actor2(34); + operation_no_entity(BAZ); + object(OBJECT_BAR); + operation_object1(XYZ); + object(OBJECT_BAR); + operation_object2(0); + object(OBJECT_BAZ); + operation_object3(); + performer(9); + operation_performer(); +} +""" + + +class StringTestCase(unittest.TestCase): + """ + Tests with-statements and inline context statements. + """ + + def test_inline_ctx(self) -> None: + self.do_test(INLINE_CTX) + + def test_single_with(self) -> None: + self.do_test(SINGLE_WITH) + + def test_multi_with(self) -> None: + self.do_test(MULTI_WITH) + + def do_test(self, exps_src: str) -> None: + compiler = ExplorerScriptSsbCompiler("N/A", []) + compiler.compile(exps_src, "/dev/null") + assert compiler.routine_infos is not None + assert compiler.routine_ops is not None + produced_ssb_script, _ = SsbScriptSsbDecompiler( + compiler.routine_infos, + compiler.routine_ops, # type: ignore + [], + ).convert() + self.assertEqual(EXPECTED_SSBSCRIPT, produced_ssb_script)