From 0a2ae945e21d9ce89701867166649f791202f430 Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Sun, 13 Oct 2024 17:34:47 +0800 Subject: [PATCH 01/15] a case shows that block can have inputs --- benchmarks/wasm/block.wat | 19 +++++++++++++++++++ src/test/scala/genwasym/TestEval.scala | 2 ++ 2 files changed, 21 insertions(+) create mode 100644 benchmarks/wasm/block.wat diff --git a/benchmarks/wasm/block.wat b/benchmarks/wasm/block.wat new file mode 100644 index 000000000..555dc64cc --- /dev/null +++ b/benchmarks/wasm/block.wat @@ -0,0 +1,19 @@ +(module + (func $test_block (param i32 i32 i32) (result i32) + local.get 0 + local.get 1 + local.get 2 + block (param i32 i32 i32) (result i32 i32) + i32.add + end + i32.add + ) + + (func $real_main (result i32) + i32.const 1 + i32.const 3 + i32.const 5 + call $test_block + ) + (export "real_main" (func $real_main)) +) diff --git a/src/test/scala/genwasym/TestEval.scala b/src/test/scala/genwasym/TestEval.scala index b5d958fc8..65847088e 100644 --- a/src/test/scala/genwasym/TestEval.scala +++ b/src/test/scala/genwasym/TestEval.scala @@ -47,6 +47,8 @@ class TestEval extends FunSuite { } } + test("block") { testFile("./benchmarks/wasm/block.wat", Some("$real_main"), Some(9)) } + // FIXME: //test("tribonacci-ret") { testFile("./benchmarks/wasm/tribonacci_ret.wat", None, Some(504)) } From 001eb3c3079f72b125b25a30e16425883e2d6f3e Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Sun, 13 Oct 2024 20:47:38 +0800 Subject: [PATCH 02/15] now block instructions can accept input --- grammar/WatParser.g4 | 7 +- src/main/java/wasm/WatParser.java | 1792 +++++++++++++------------- src/main/scala/wasm/AST.scala | 18 +- src/main/scala/wasm/MiniWasm.scala | 23 +- src/main/scala/wasm/Parser.scala | 10 +- src/main/scala/wasm/attic/Eval.scala | 9 +- 6 files changed, 916 insertions(+), 943 deletions(-) diff --git a/grammar/WatParser.g4 b/grammar/WatParser.g4 index 3b88865c0..e2a23a816 100644 --- a/grammar/WatParser.g4 +++ b/grammar/WatParser.g4 @@ -203,12 +203,13 @@ blockInstr | IF bindVar? block (ELSE bindVar? instrList)? END bindVar? ; +// treat blockType as an alias to function type blockType - : LPAR RESULT valType RPAR + : funcType ; block - : blockType? instrList + : blockType instrList ; foldedInstr @@ -221,7 +222,7 @@ expr | BLOCK bindVar? block | LOOP bindVar? block // | IF bindVar? ifBlock - | IF bindVar? blockType? foldedInstr* LPAR THEN instrList (LPAR ELSE instrList RPAR)? + | IF bindVar? blockType foldedInstr* LPAR THEN instrList (LPAR ELSE instrList RPAR)? ; callExprType diff --git a/src/main/java/wasm/WatParser.java b/src/main/java/wasm/WatParser.java index 4a4d2de1c..94912d400 100644 --- a/src/main/java/wasm/WatParser.java +++ b/src/main/java/wasm/WatParser.java @@ -2601,12 +2601,9 @@ public final BlockInstrContext blockInstr() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class BlockTypeContext extends ParserRuleContext { - public TerminalNode LPAR() { return getToken(WatParser.LPAR, 0); } - public TerminalNode RESULT() { return getToken(WatParser.RESULT, 0); } - public ValTypeContext valType() { - return getRuleContext(ValTypeContext.class,0); + public FuncTypeContext funcType() { + return getRuleContext(FuncTypeContext.class,0); } - public TerminalNode RPAR() { return getToken(WatParser.RPAR, 0); } public BlockTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -2633,13 +2630,7 @@ public final BlockTypeContext blockType() throws RecognitionException { enterOuterAlt(_localctx, 1); { setState(418); - match(LPAR); - setState(419); - match(RESULT); - setState(420); - valType(); - setState(421); - match(RPAR); + funcType(); } } catch (RecognitionException re) { @@ -2655,12 +2646,12 @@ public final BlockTypeContext blockType() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class BlockContext extends ParserRuleContext { - public InstrListContext instrList() { - return getRuleContext(InstrListContext.class,0); - } public BlockTypeContext blockType() { return getRuleContext(BlockTypeContext.class,0); } + public InstrListContext instrList() { + return getRuleContext(InstrListContext.class,0); + } public BlockContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -2686,17 +2677,9 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(424); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { - case 1: - { - setState(423); - blockType(); - } - break; - } - setState(426); + setState(420); + blockType(); + setState(421); instrList(); } } @@ -2743,11 +2726,11 @@ public final FoldedInstrContext foldedInstr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(428); + setState(423); match(LPAR); - setState(429); + setState(424); expr(); - setState(430); + setState(425); match(RPAR); } } @@ -2786,6 +2769,9 @@ public BindVarContext bindVar() { } public TerminalNode LOOP() { return getToken(WatParser.LOOP, 0); } public TerminalNode IF() { return getToken(WatParser.IF, 0); } + public BlockTypeContext blockType() { + return getRuleContext(BlockTypeContext.class,0); + } public List LPAR() { return getTokens(WatParser.LPAR); } public TerminalNode LPAR(int i) { return getToken(WatParser.LPAR, i); @@ -2797,9 +2783,6 @@ public List instrList() { public InstrListContext instrList(int i) { return getRuleContext(InstrListContext.class,i); } - public BlockTypeContext blockType() { - return getRuleContext(BlockTypeContext.class,0); - } public List foldedInstr() { return getRuleContexts(FoldedInstrContext.class); } @@ -2833,138 +2816,130 @@ public final ExprContext expr() throws RecognitionException { int _la; try { int _alt; - setState(474); + setState(467); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(432); + setState(427); plainInstr(); - setState(436); + setState(431); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,37,_ctx); + _alt = getInterpreter().adaptivePredict(_input,36,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(433); + setState(428); expr(); } } } - setState(438); + setState(433); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,37,_ctx); + _alt = getInterpreter().adaptivePredict(_input,36,_ctx); } } break; case 2: enterOuterAlt(_localctx, 2); { - setState(439); + setState(434); match(CALL_INDIRECT); - setState(440); + setState(435); callExprType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(441); + setState(436); match(BLOCK); - setState(443); + setState(438); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { - setState(442); + setState(437); bindVar(); } break; } - setState(445); + setState(440); block(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(446); + setState(441); match(LOOP); - setState(448); + setState(443); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { case 1: { - setState(447); + setState(442); bindVar(); } break; } - setState(450); + setState(445); block(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(451); + setState(446); match(IF); - setState(453); + setState(448); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(452); + setState(447); bindVar(); } } - setState(456); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { - case 1: - { - setState(455); - blockType(); - } - break; - } - setState(461); + setState(450); + blockType(); + setState(454); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,42,_ctx); + _alt = getInterpreter().adaptivePredict(_input,40,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(458); + setState(451); foldedInstr(); } } } - setState(463); + setState(456); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,42,_ctx); + _alt = getInterpreter().adaptivePredict(_input,40,_ctx); } - setState(464); + setState(457); match(LPAR); - setState(465); + setState(458); match(THEN); - setState(466); + setState(459); instrList(); - setState(472); + setState(465); _errHandler.sync(this); _la = _input.LA(1); if (_la==LPAR) { { - setState(467); + setState(460); match(LPAR); - setState(468); + setState(461); match(ELSE); - setState(469); + setState(462); instrList(); - setState(470); + setState(463); match(RPAR); } } @@ -3017,17 +2992,17 @@ public final CallExprTypeContext callExprType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(477); + setState(470); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: { - setState(476); + setState(469); typeUse(); } break; } - setState(479); + setState(472); callExprParams(); } } @@ -3092,41 +3067,41 @@ public final CallExprParamsContext callExprParams() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(492); + setState(485); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,47,_ctx); + _alt = getInterpreter().adaptivePredict(_input,45,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(481); + setState(474); match(LPAR); - setState(482); + setState(475); match(PARAM); - setState(486); + setState(479); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3200L) != 0) || _la==V128) { { { - setState(483); + setState(476); valType(); } } - setState(488); + setState(481); _errHandler.sync(this); _la = _input.LA(1); } - setState(489); + setState(482); match(RPAR); } } } - setState(494); + setState(487); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,47,_ctx); + _alt = getInterpreter().adaptivePredict(_input,45,_ctx); } - setState(495); + setState(488); callExprResults(); } } @@ -3194,53 +3169,53 @@ public final CallExprResultsContext callExprResults() throws RecognitionExceptio int _alt; enterOuterAlt(_localctx, 1); { - setState(508); + setState(501); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(497); + setState(490); match(LPAR); - setState(498); + setState(491); match(RESULT); - setState(502); + setState(495); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3200L) != 0) || _la==V128) { { { - setState(499); + setState(492); valType(); } } - setState(504); + setState(497); _errHandler.sync(this); _la = _input.LA(1); } - setState(505); + setState(498); match(RPAR); } } - setState(510); + setState(503); _errHandler.sync(this); _la = _input.LA(1); } - setState(514); + setState(507); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,50,_ctx); + _alt = getInterpreter().adaptivePredict(_input,48,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(511); + setState(504); expr(); } } } - setState(516); + setState(509); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,50,_ctx); + _alt = getInterpreter().adaptivePredict(_input,48,_ctx); } } } @@ -3292,28 +3267,28 @@ public final InstrListContext instrList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(520); + setState(513); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,51,_ctx); + _alt = getInterpreter().adaptivePredict(_input,49,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(517); + setState(510); instr(); } } } - setState(522); + setState(515); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,51,_ctx); + _alt = getInterpreter().adaptivePredict(_input,49,_ctx); } - setState(524); + setState(517); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(523); + setState(516); callIndirectInstr(); } break; @@ -3361,7 +3336,7 @@ public final ConstExprContext constExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(526); + setState(519); instrList(); } } @@ -3413,23 +3388,23 @@ public final FunctionContext function() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(528); + setState(521); match(LPAR); - setState(529); + setState(522); match(FUNC); - setState(531); + setState(524); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(530); + setState(523); bindVar(); } } - setState(533); + setState(526); funcFields(); - setState(534); + setState(527); match(RPAR); } } @@ -3487,51 +3462,51 @@ public final FuncFieldsContext funcFields() throws RecognitionException { FuncFieldsContext _localctx = new FuncFieldsContext(_ctx, getState()); enterRule(_localctx, 80, RULE_funcFields); try { - setState(549); + setState(542); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(537); + setState(530); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(536); + setState(529); typeUse(); } break; } - setState(539); + setState(532); funcFieldsBody(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(540); + setState(533); inlineImport(); - setState(542); + setState(535); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { - setState(541); + setState(534); typeUse(); } break; } - setState(544); + setState(537); funcType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(546); + setState(539); inlineExport(); - setState(547); + setState(540); funcFields(); } break; @@ -3581,9 +3556,9 @@ public final FuncFieldsBodyContext funcFieldsBody() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(551); + setState(544); funcType(); - setState(552); + setState(545); funcBody(); } } @@ -3654,18 +3629,18 @@ public final FuncBodyContext funcBody() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(570); + setState(563); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,59,_ctx); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(554); + setState(547); match(LPAR); - setState(555); + setState(548); match(LOCAL); - setState(565); + setState(558); _errHandler.sync(this); switch (_input.LA(1)) { case RPAR: @@ -3674,17 +3649,17 @@ public final FuncBodyContext funcBody() throws RecognitionException { case EXTERNREF: case V128: { - setState(559); + setState(552); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3200L) != 0) || _la==V128) { { { - setState(556); + setState(549); valType(); } } - setState(561); + setState(554); _errHandler.sync(this); _la = _input.LA(1); } @@ -3692,25 +3667,25 @@ public final FuncBodyContext funcBody() throws RecognitionException { break; case VAR: { - setState(562); + setState(555); bindVar(); - setState(563); + setState(556); valType(); } break; default: throw new NoViableAltException(this); } - setState(567); + setState(560); match(RPAR); } } } - setState(572); + setState(565); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,59,_ctx); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); } - setState(573); + setState(566); instrList(); } } @@ -3759,19 +3734,19 @@ public final OffsetContext offset() throws RecognitionException { OffsetContext _localctx = new OffsetContext(_ctx, getState()); enterRule(_localctx, 86, RULE_offset); try { - setState(581); + setState(574); _errHandler.sync(this); switch (_input.LA(1)) { case LPAR: enterOuterAlt(_localctx, 1); { - setState(575); + setState(568); match(LPAR); - setState(576); + setState(569); match(OFFSET); - setState(577); + setState(570); constExpr(); - setState(578); + setState(571); match(RPAR); } break; @@ -3810,7 +3785,7 @@ public final OffsetContext offset() throws RecognitionException { case CONVERT: enterOuterAlt(_localctx, 2); { - setState(580); + setState(573); expr(); } break; @@ -3876,84 +3851,84 @@ public final ElemContext elem() throws RecognitionException { enterRule(_localctx, 88, RULE_elem); int _la; try { - setState(613); + setState(606); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(583); + setState(576); match(LPAR); - setState(584); + setState(577); match(ELEM); - setState(586); + setState(579); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAT || _la==VAR) { { - setState(585); + setState(578); idx(); } } - setState(588); + setState(581); match(LPAR); - setState(589); + setState(582); instr(); - setState(590); + setState(583); match(RPAR); - setState(594); + setState(587); _errHandler.sync(this); _la = _input.LA(1); while (_la==NAT || _la==VAR) { { { - setState(591); + setState(584); idx(); } } - setState(596); + setState(589); _errHandler.sync(this); _la = _input.LA(1); } - setState(597); + setState(590); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(599); + setState(592); match(LPAR); - setState(600); + setState(593); match(ELEM); - setState(602); + setState(595); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAT || _la==VAR) { { - setState(601); + setState(594); idx(); } } - setState(604); + setState(597); offset(); - setState(608); + setState(601); _errHandler.sync(this); _la = _input.LA(1); while (_la==NAT || _la==VAR) { { { - setState(605); + setState(598); idx(); } } - setState(610); + setState(603); _errHandler.sync(this); _la = _input.LA(1); } - setState(611); + setState(604); match(RPAR); } break; @@ -4007,23 +3982,23 @@ public final TableContext table() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(615); + setState(608); match(LPAR); - setState(616); + setState(609); match(TABLE); - setState(618); + setState(611); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(617); + setState(610); bindVar(); } } - setState(620); + setState(613); tableField(); - setState(621); + setState(614); match(RPAR); } } @@ -4088,58 +4063,58 @@ public final TableFieldContext tableField() throws RecognitionException { enterRule(_localctx, 92, RULE_tableField); int _la; try { - setState(641); + setState(634); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(623); + setState(616); tableType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(624); + setState(617); inlineImport(); - setState(625); + setState(618); tableType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(627); + setState(620); inlineExport(); - setState(628); + setState(621); tableField(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(630); + setState(623); refType(); - setState(631); + setState(624); match(LPAR); - setState(632); + setState(625); match(ELEM); - setState(636); + setState(629); _errHandler.sync(this); _la = _input.LA(1); while (_la==NAT || _la==VAR) { { { - setState(633); + setState(626); idx(); } } - setState(638); + setState(631); _errHandler.sync(this); _la = _input.LA(1); } - setState(639); + setState(632); match(RPAR); } break; @@ -4204,84 +4179,84 @@ public final DataContext data() throws RecognitionException { enterRule(_localctx, 94, RULE_data); int _la; try { - setState(673); + setState(666); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(643); + setState(636); match(LPAR); - setState(644); + setState(637); match(DATA); - setState(646); + setState(639); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAT || _la==VAR) { { - setState(645); + setState(638); idx(); } } - setState(648); + setState(641); match(LPAR); - setState(649); + setState(642); instr(); - setState(650); + setState(643); match(RPAR); - setState(654); + setState(647); _errHandler.sync(this); _la = _input.LA(1); while (_la==STRING_) { { { - setState(651); + setState(644); match(STRING_); } } - setState(656); + setState(649); _errHandler.sync(this); _la = _input.LA(1); } - setState(657); + setState(650); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(659); + setState(652); match(LPAR); - setState(660); + setState(653); match(DATA); - setState(662); + setState(655); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAT || _la==VAR) { { - setState(661); + setState(654); idx(); } } - setState(664); + setState(657); offset(); - setState(668); + setState(661); _errHandler.sync(this); _la = _input.LA(1); while (_la==STRING_) { { { - setState(665); + setState(658); match(STRING_); } } - setState(670); + setState(663); _errHandler.sync(this); _la = _input.LA(1); } - setState(671); + setState(664); match(RPAR); } break; @@ -4335,23 +4310,23 @@ public final MemoryContext memory() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(675); + setState(668); match(LPAR); - setState(676); + setState(669); match(MEMORY); - setState(678); + setState(671); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(677); + setState(670); bindVar(); } } - setState(680); + setState(673); memoryField(); - setState(681); + setState(674); match(RPAR); } } @@ -4411,56 +4386,56 @@ public final MemoryFieldContext memoryField() throws RecognitionException { enterRule(_localctx, 98, RULE_memoryField); int _la; try { - setState(699); + setState(692); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(683); + setState(676); memoryType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(684); + setState(677); inlineImport(); - setState(685); + setState(678); memoryType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(687); + setState(680); inlineExport(); - setState(688); + setState(681); memoryField(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(690); + setState(683); match(LPAR); - setState(691); + setState(684); match(DATA); - setState(695); + setState(688); _errHandler.sync(this); _la = _input.LA(1); while (_la==STRING_) { { { - setState(692); + setState(685); match(STRING_); } } - setState(697); + setState(690); _errHandler.sync(this); _la = _input.LA(1); } - setState(698); + setState(691); match(RPAR); } break; @@ -4514,23 +4489,23 @@ public final GlobalContext global() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(701); + setState(694); match(LPAR); - setState(702); + setState(695); match(GLOBAL); - setState(704); + setState(697); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(703); + setState(696); bindVar(); } } - setState(706); + setState(699); globalField(); - setState(707); + setState(700); match(RPAR); } } @@ -4585,33 +4560,33 @@ public final GlobalFieldContext globalField() throws RecognitionException { GlobalFieldContext _localctx = new GlobalFieldContext(_ctx, getState()); enterRule(_localctx, 102, RULE_globalField); try { - setState(718); + setState(711); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(709); + setState(702); globalType(); - setState(710); + setState(703); constExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(712); + setState(705); inlineImport(); - setState(713); + setState(706); globalType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(715); + setState(708); inlineExport(); - setState(716); + setState(709); globalField(); } break; @@ -4678,121 +4653,121 @@ public final ImportDescContext importDesc() throws RecognitionException { enterRule(_localctx, 104, RULE_importDesc); int _la; try { - setState(760); + setState(753); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(720); + setState(713); match(LPAR); - setState(721); + setState(714); match(FUNC); - setState(723); + setState(716); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(722); + setState(715); bindVar(); } } - setState(725); + setState(718); typeUse(); - setState(726); + setState(719); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(728); + setState(721); match(LPAR); - setState(729); + setState(722); match(FUNC); - setState(731); + setState(724); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(730); + setState(723); bindVar(); } } - setState(733); + setState(726); funcType(); - setState(734); + setState(727); match(RPAR); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(736); + setState(729); match(LPAR); - setState(737); + setState(730); match(TABLE); - setState(739); + setState(732); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(738); + setState(731); bindVar(); } } - setState(741); + setState(734); tableType(); - setState(742); + setState(735); match(RPAR); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(744); + setState(737); match(LPAR); - setState(745); + setState(738); match(MEMORY); - setState(747); + setState(740); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(746); + setState(739); bindVar(); } } - setState(749); + setState(742); memoryType(); - setState(750); + setState(743); match(RPAR); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(752); + setState(745); match(LPAR); - setState(753); + setState(746); match(GLOBAL); - setState(755); + setState(748); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(754); + setState(747); bindVar(); } } - setState(757); + setState(750); globalType(); - setState(758); + setState(751); match(RPAR); } break; @@ -4848,17 +4823,17 @@ public final SimportContext simport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(762); + setState(755); match(LPAR); - setState(763); + setState(756); match(IMPORT); - setState(764); + setState(757); name(); - setState(765); + setState(758); name(); - setState(766); + setState(759); importDesc(); - setState(767); + setState(760); match(RPAR); } } @@ -4909,15 +4884,15 @@ public final InlineImportContext inlineImport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(769); + setState(762); match(LPAR); - setState(770); + setState(763); match(IMPORT); - setState(771); + setState(764); name(); - setState(772); + setState(765); name(); - setState(773); + setState(766); match(RPAR); } } @@ -4966,58 +4941,58 @@ public final ExportDescContext exportDesc() throws RecognitionException { ExportDescContext _localctx = new ExportDescContext(_ctx, getState()); enterRule(_localctx, 110, RULE_exportDesc); try { - setState(795); + setState(788); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(775); + setState(768); match(LPAR); - setState(776); + setState(769); match(FUNC); - setState(777); + setState(770); idx(); - setState(778); + setState(771); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(780); + setState(773); match(LPAR); - setState(781); + setState(774); match(TABLE); - setState(782); + setState(775); idx(); - setState(783); + setState(776); match(RPAR); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(785); + setState(778); match(LPAR); - setState(786); + setState(779); match(MEMORY); - setState(787); + setState(780); idx(); - setState(788); + setState(781); match(RPAR); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(790); + setState(783); match(LPAR); - setState(791); + setState(784); match(GLOBAL); - setState(792); + setState(785); idx(); - setState(793); + setState(786); match(RPAR); } break; @@ -5070,15 +5045,15 @@ public final Export_Context export_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(797); + setState(790); match(LPAR); - setState(798); + setState(791); match(EXPORT); - setState(799); + setState(792); name(); - setState(800); + setState(793); exportDesc(); - setState(801); + setState(794); match(RPAR); } } @@ -5126,13 +5101,13 @@ public final InlineExportContext inlineExport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(803); + setState(796); match(LPAR); - setState(804); + setState(797); match(EXPORT); - setState(805); + setState(798); name(); - setState(806); + setState(799); match(RPAR); } } @@ -5184,23 +5159,23 @@ public final TypeDefContext typeDef() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(808); + setState(801); match(LPAR); - setState(809); + setState(802); match(TYPE); - setState(811); + setState(804); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(810); + setState(803); bindVar(); } } - setState(813); + setState(806); defType(); - setState(814); + setState(807); match(RPAR); } } @@ -5248,13 +5223,13 @@ public final Start_Context start_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(816); + setState(809); match(LPAR); - setState(817); + setState(810); match(START_); - setState(818); + setState(811); idx(); - setState(819); + setState(812); match(RPAR); } } @@ -5324,76 +5299,76 @@ public final ModuleFieldContext moduleField() throws RecognitionException { ModuleFieldContext _localctx = new ModuleFieldContext(_ctx, getState()); enterRule(_localctx, 120, RULE_moduleField); try { - setState(831); + setState(824); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(821); + setState(814); typeDef(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(822); + setState(815); global(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(823); + setState(816); table(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(824); + setState(817); memory(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(825); + setState(818); function(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(826); + setState(819); elem(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(827); + setState(820); data(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(828); + setState(821); start_(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(829); + setState(822); simport(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(830); + setState(823); export_(); } break; @@ -5448,35 +5423,35 @@ public final Module_Context module_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(833); + setState(826); match(LPAR); - setState(834); + setState(827); match(MODULE); - setState(836); + setState(829); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(835); + setState(828); match(VAR); } } - setState(841); + setState(834); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(838); + setState(831); moduleField(); } } - setState(843); + setState(836); _errHandler.sync(this); _la = _input.LA(1); } - setState(844); + setState(837); match(RPAR); } } @@ -5530,34 +5505,34 @@ public final ScriptModuleContext scriptModule() throws RecognitionException { enterRule(_localctx, 124, RULE_scriptModule); int _la; try { - setState(860); + setState(853); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(846); + setState(839); module_(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(847); + setState(840); match(LPAR); - setState(848); + setState(841); match(MODULE); - setState(850); + setState(843); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(849); + setState(842); match(VAR); } } - setState(852); + setState(845); _la = _input.LA(1); if ( !(_la==BIN || _la==QUOTE) ) { _errHandler.recoverInline(this); @@ -5567,21 +5542,21 @@ public final ScriptModuleContext scriptModule() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(856); + setState(849); _errHandler.sync(this); _la = _input.LA(1); while (_la==STRING_) { { { - setState(853); + setState(846); match(STRING_); } } - setState(858); + setState(851); _errHandler.sync(this); _la = _input.LA(1); } - setState(859); + setState(852); match(RPAR); } break; @@ -5635,54 +5610,54 @@ public final Action_Context action_() throws RecognitionException { enterRule(_localctx, 126, RULE_action_); int _la; try { - setState(879); + setState(872); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(862); + setState(855); match(LPAR); - setState(863); + setState(856); match(INVOKE); - setState(865); + setState(858); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(864); + setState(857); match(VAR); } } - setState(867); + setState(860); name(); - setState(868); + setState(861); constList(); - setState(869); + setState(862); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(871); + setState(864); match(LPAR); - setState(872); + setState(865); match(GET); - setState(874); + setState(867); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(873); + setState(866); match(VAR); } } - setState(876); + setState(869); name(); - setState(877); + setState(870); match(RPAR); } break; @@ -5744,137 +5719,137 @@ public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); enterRule(_localctx, 128, RULE_assertion); try { - setState(933); + setState(926); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(881); + setState(874); match(LPAR); - setState(882); + setState(875); match(ASSERT_MALFORMED); - setState(883); + setState(876); scriptModule(); - setState(884); + setState(877); match(STRING_); - setState(885); + setState(878); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(887); + setState(880); match(LPAR); - setState(888); + setState(881); match(ASSERT_INVALID); - setState(889); + setState(882); scriptModule(); - setState(890); + setState(883); match(STRING_); - setState(891); + setState(884); match(RPAR); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(893); + setState(886); match(LPAR); - setState(894); + setState(887); match(ASSERT_UNLINKABLE); - setState(895); + setState(888); scriptModule(); - setState(896); + setState(889); match(STRING_); - setState(897); + setState(890); match(RPAR); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(899); + setState(892); match(LPAR); - setState(900); + setState(893); match(ASSERT_TRAP); - setState(901); + setState(894); scriptModule(); - setState(902); + setState(895); match(STRING_); - setState(903); + setState(896); match(RPAR); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(905); + setState(898); match(LPAR); - setState(906); + setState(899); match(ASSERT_RETURN); - setState(907); + setState(900); action_(); - setState(908); + setState(901); constList(); - setState(909); + setState(902); match(RPAR); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(911); + setState(904); match(LPAR); - setState(912); + setState(905); match(ASSERT_RETURN_CANONICAL_NAN); - setState(913); + setState(906); action_(); - setState(914); + setState(907); match(RPAR); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(916); + setState(909); match(LPAR); - setState(917); + setState(910); match(ASSERT_RETURN_ARITHMETIC_NAN); - setState(918); + setState(911); action_(); - setState(919); + setState(912); match(RPAR); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(921); + setState(914); match(LPAR); - setState(922); + setState(915); match(ASSERT_TRAP); - setState(923); + setState(916); action_(); - setState(924); + setState(917); match(STRING_); - setState(925); + setState(918); match(RPAR); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(927); + setState(920); match(LPAR); - setState(928); + setState(921); match(ASSERT_EXHAUSTION); - setState(929); + setState(922); action_(); - setState(930); + setState(923); match(STRING_); - setState(931); + setState(924); match(RPAR); } break; @@ -5936,57 +5911,57 @@ public final CmdContext cmd() throws RecognitionException { enterRule(_localctx, 130, RULE_cmd); int _la; try { - setState(947); + setState(940); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(935); + setState(928); action_(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(936); + setState(929); assertion(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(937); + setState(930); scriptModule(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(938); + setState(931); match(LPAR); - setState(939); + setState(932); match(REGISTER); - setState(940); + setState(933); name(); - setState(942); + setState(935); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(941); + setState(934); match(VAR); } } - setState(944); + setState(937); match(RPAR); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(946); + setState(939); meta(); } break; @@ -6042,108 +6017,108 @@ public final MetaContext meta() throws RecognitionException { enterRule(_localctx, 132, RULE_meta); int _la; try { - setState(981); + setState(974); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,104,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(949); + setState(942); match(LPAR); - setState(950); + setState(943); match(SCRIPT); - setState(952); + setState(945); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(951); + setState(944); match(VAR); } } - setState(957); + setState(950); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(954); + setState(947); cmd(); } } - setState(959); + setState(952); _errHandler.sync(this); _la = _input.LA(1); } - setState(960); + setState(953); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(961); + setState(954); match(LPAR); - setState(962); + setState(955); match(INPUT); - setState(964); + setState(957); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(963); + setState(956); match(VAR); } } - setState(966); + setState(959); match(STRING_); - setState(967); + setState(960); match(RPAR); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(968); + setState(961); match(LPAR); - setState(969); + setState(962); match(OUTPUT); - setState(971); + setState(964); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(970); + setState(963); match(VAR); } } - setState(973); + setState(966); match(STRING_); - setState(974); + setState(967); match(RPAR); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(975); + setState(968); match(LPAR); - setState(976); + setState(969); match(OUTPUT); - setState(978); + setState(971); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(977); + setState(970); match(VAR); } } - setState(980); + setState(973); match(RPAR); } break; @@ -6193,13 +6168,13 @@ public final WconstContext wconst() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(983); + setState(976); match(LPAR); - setState(984); + setState(977); match(CONST); - setState(985); + setState(978); literal(); - setState(986); + setState(979); match(RPAR); } } @@ -6248,17 +6223,17 @@ public final ConstListContext constList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(991); + setState(984); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(988); + setState(981); wconst(); } } - setState(993); + setState(986); _errHandler.sync(this); _la = _input.LA(1); } @@ -6314,48 +6289,48 @@ public final ScriptContext script() throws RecognitionException { enterRule(_localctx, 138, RULE_script); int _la; try { - setState(1008); + setState(1001); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(997); + setState(990); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(994); + setState(987); cmd(); } } - setState(999); + setState(992); _errHandler.sync(this); _la = _input.LA(1); } - setState(1000); + setState(993); match(EOF); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1002); + setState(995); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(1001); + setState(994); moduleField(); } } - setState(1004); + setState(997); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==LPAR ); - setState(1006); + setState(999); match(EOF); } break; @@ -6408,36 +6383,36 @@ public final ModuleContext module() throws RecognitionException { enterRule(_localctx, 140, RULE_module); int _la; try { - setState(1020); + setState(1013); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1010); + setState(1003); module_(); - setState(1011); + setState(1004); match(EOF); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1016); + setState(1009); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(1013); + setState(1006); moduleField(); } } - setState(1018); + setState(1011); _errHandler.sync(this); _la = _input.LA(1); } - setState(1019); + setState(1012); match(EOF); } break; @@ -6455,7 +6430,7 @@ public final ModuleContext module() throws RecognitionException { } public static final String _serializedATN = - "\u0004\u0001\u0093\u03ff\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u0093\u03f8\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -6516,72 +6491,71 @@ public final ModuleContext module() throws RecognitionException { "\u0001\u001d\u0001\u001d\u0003\u001d\u0193\b\u001d\u0001\u001d\u0001\u001d"+ "\u0001\u001d\u0003\u001d\u0198\b\u001d\u0001\u001d\u0003\u001d\u019b\b"+ "\u001d\u0001\u001d\u0001\u001d\u0003\u001d\u019f\b\u001d\u0003\u001d\u01a1"+ - "\b\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ - "\u001f\u0003\u001f\u01a9\b\u001f\u0001\u001f\u0001\u001f\u0001 \u0001"+ - " \u0001 \u0001 \u0001!\u0001!\u0005!\u01b3\b!\n!\f!\u01b6\t!\u0001!\u0001"+ - "!\u0001!\u0001!\u0003!\u01bc\b!\u0001!\u0001!\u0001!\u0003!\u01c1\b!\u0001"+ - "!\u0001!\u0001!\u0003!\u01c6\b!\u0001!\u0003!\u01c9\b!\u0001!\u0005!\u01cc"+ - "\b!\n!\f!\u01cf\t!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0003!\u01d9\b!\u0003!\u01db\b!\u0001\"\u0003\"\u01de\b\"\u0001\"\u0001"+ - "\"\u0001#\u0001#\u0001#\u0005#\u01e5\b#\n#\f#\u01e8\t#\u0001#\u0005#\u01eb"+ - "\b#\n#\f#\u01ee\t#\u0001#\u0001#\u0001$\u0001$\u0001$\u0005$\u01f5\b$"+ - "\n$\f$\u01f8\t$\u0001$\u0005$\u01fb\b$\n$\f$\u01fe\t$\u0001$\u0005$\u0201"+ - "\b$\n$\f$\u0204\t$\u0001%\u0005%\u0207\b%\n%\f%\u020a\t%\u0001%\u0003"+ - "%\u020d\b%\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0003\'\u0214\b\'\u0001"+ - "\'\u0001\'\u0001\'\u0001(\u0003(\u021a\b(\u0001(\u0001(\u0001(\u0003("+ - "\u021f\b(\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u0226\b(\u0001)\u0001"+ - ")\u0001)\u0001*\u0001*\u0001*\u0005*\u022e\b*\n*\f*\u0231\t*\u0001*\u0001"+ - "*\u0001*\u0003*\u0236\b*\u0001*\u0005*\u0239\b*\n*\f*\u023c\t*\u0001*"+ - "\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u0246\b+\u0001"+ - ",\u0001,\u0001,\u0003,\u024b\b,\u0001,\u0001,\u0001,\u0001,\u0005,\u0251"+ - "\b,\n,\f,\u0254\t,\u0001,\u0001,\u0001,\u0001,\u0001,\u0003,\u025b\b,"+ - "\u0001,\u0001,\u0005,\u025f\b,\n,\f,\u0262\t,\u0001,\u0001,\u0003,\u0266"+ - "\b,\u0001-\u0001-\u0001-\u0003-\u026b\b-\u0001-\u0001-\u0001-\u0001.\u0001"+ + "\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + " \u0001 \u0001 \u0001 \u0001!\u0001!\u0005!\u01ae\b!\n!\f!\u01b1\t!\u0001"+ + "!\u0001!\u0001!\u0001!\u0003!\u01b7\b!\u0001!\u0001!\u0001!\u0003!\u01bc"+ + "\b!\u0001!\u0001!\u0001!\u0003!\u01c1\b!\u0001!\u0001!\u0005!\u01c5\b"+ + "!\n!\f!\u01c8\t!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0003!\u01d2\b!\u0003!\u01d4\b!\u0001\"\u0003\"\u01d7\b\"\u0001\"\u0001"+ + "\"\u0001#\u0001#\u0001#\u0005#\u01de\b#\n#\f#\u01e1\t#\u0001#\u0005#\u01e4"+ + "\b#\n#\f#\u01e7\t#\u0001#\u0001#\u0001$\u0001$\u0001$\u0005$\u01ee\b$"+ + "\n$\f$\u01f1\t$\u0001$\u0005$\u01f4\b$\n$\f$\u01f7\t$\u0001$\u0005$\u01fa"+ + "\b$\n$\f$\u01fd\t$\u0001%\u0005%\u0200\b%\n%\f%\u0203\t%\u0001%\u0003"+ + "%\u0206\b%\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0003\'\u020d\b\'\u0001"+ + "\'\u0001\'\u0001\'\u0001(\u0003(\u0213\b(\u0001(\u0001(\u0001(\u0003("+ + "\u0218\b(\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u021f\b(\u0001)\u0001"+ + ")\u0001)\u0001*\u0001*\u0001*\u0005*\u0227\b*\n*\f*\u022a\t*\u0001*\u0001"+ + "*\u0001*\u0003*\u022f\b*\u0001*\u0005*\u0232\b*\n*\f*\u0235\t*\u0001*"+ + "\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u023f\b+\u0001"+ + ",\u0001,\u0001,\u0003,\u0244\b,\u0001,\u0001,\u0001,\u0001,\u0005,\u024a"+ + "\b,\n,\f,\u024d\t,\u0001,\u0001,\u0001,\u0001,\u0001,\u0003,\u0254\b,"+ + "\u0001,\u0001,\u0005,\u0258\b,\n,\f,\u025b\t,\u0001,\u0001,\u0003,\u025f"+ + "\b,\u0001-\u0001-\u0001-\u0003-\u0264\b-\u0001-\u0001-\u0001-\u0001.\u0001"+ ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ - ".\u027b\b.\n.\f.\u027e\t.\u0001.\u0001.\u0003.\u0282\b.\u0001/\u0001/"+ - "\u0001/\u0003/\u0287\b/\u0001/\u0001/\u0001/\u0001/\u0005/\u028d\b/\n"+ - "/\f/\u0290\t/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u0297\b/\u0001"+ - "/\u0001/\u0005/\u029b\b/\n/\f/\u029e\t/\u0001/\u0001/\u0003/\u02a2\b/"+ - "\u00010\u00010\u00010\u00030\u02a7\b0\u00010\u00010\u00010\u00011\u0001"+ - "1\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00051\u02b6"+ - "\b1\n1\f1\u02b9\t1\u00011\u00031\u02bc\b1\u00012\u00012\u00012\u00032"+ - "\u02c1\b2\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ - "3\u00013\u00013\u00013\u00033\u02cf\b3\u00014\u00014\u00014\u00034\u02d4"+ - "\b4\u00014\u00014\u00014\u00014\u00014\u00014\u00034\u02dc\b4\u00014\u0001"+ - "4\u00014\u00014\u00014\u00014\u00034\u02e4\b4\u00014\u00014\u00014\u0001"+ - "4\u00014\u00014\u00034\u02ec\b4\u00014\u00014\u00014\u00014\u00014\u0001"+ - "4\u00034\u02f4\b4\u00014\u00014\u00014\u00034\u02f9\b4\u00015\u00015\u0001"+ + ".\u0274\b.\n.\f.\u0277\t.\u0001.\u0001.\u0003.\u027b\b.\u0001/\u0001/"+ + "\u0001/\u0003/\u0280\b/\u0001/\u0001/\u0001/\u0001/\u0005/\u0286\b/\n"+ + "/\f/\u0289\t/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u0290\b/\u0001"+ + "/\u0001/\u0005/\u0294\b/\n/\f/\u0297\t/\u0001/\u0001/\u0003/\u029b\b/"+ + "\u00010\u00010\u00010\u00030\u02a0\b0\u00010\u00010\u00010\u00011\u0001"+ + "1\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00051\u02af"+ + "\b1\n1\f1\u02b2\t1\u00011\u00031\u02b5\b1\u00012\u00012\u00012\u00032"+ + "\u02ba\b2\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00013\u00013\u00013\u00033\u02c8\b3\u00014\u00014\u00014\u00034\u02cd"+ + "\b4\u00014\u00014\u00014\u00014\u00014\u00014\u00034\u02d5\b4\u00014\u0001"+ + "4\u00014\u00014\u00014\u00014\u00034\u02dd\b4\u00014\u00014\u00014\u0001"+ + "4\u00014\u00014\u00034\u02e5\b4\u00014\u00014\u00014\u00014\u00014\u0001"+ + "4\u00034\u02ed\b4\u00014\u00014\u00014\u00034\u02f2\b4\u00015\u00015\u0001"+ "5\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u0001"+ "6\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ "7\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ - "7\u00037\u031c\b7\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u0001"+ - "9\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0003:\u032c\b:\u0001:\u0001"+ + "7\u00037\u0315\b7\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u0001"+ + "9\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0003:\u0325\b:\u0001:\u0001"+ ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001"+ - "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0003<\u0340\b<\u0001=\u0001"+ - "=\u0001=\u0003=\u0345\b=\u0001=\u0005=\u0348\b=\n=\f=\u034b\t=\u0001="+ - "\u0001=\u0001>\u0001>\u0001>\u0001>\u0003>\u0353\b>\u0001>\u0001>\u0005"+ - ">\u0357\b>\n>\f>\u035a\t>\u0001>\u0003>\u035d\b>\u0001?\u0001?\u0001?"+ - "\u0003?\u0362\b?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0003"+ - "?\u036b\b?\u0001?\u0001?\u0001?\u0003?\u0370\b?\u0001@\u0001@\u0001@\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0003<\u0339\b<\u0001=\u0001"+ + "=\u0001=\u0003=\u033e\b=\u0001=\u0005=\u0341\b=\n=\f=\u0344\t=\u0001="+ + "\u0001=\u0001>\u0001>\u0001>\u0001>\u0003>\u034c\b>\u0001>\u0001>\u0005"+ + ">\u0350\b>\n>\f>\u0353\t>\u0001>\u0003>\u0356\b>\u0001?\u0001?\u0001?"+ + "\u0003?\u035b\b?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0003"+ + "?\u0364\b?\u0001?\u0001?\u0001?\u0003?\u0369\b?\u0001@\u0001@\u0001@\u0001"+ "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0003@\u03a6"+ - "\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0003A\u03af\bA\u0001"+ - "A\u0001A\u0001A\u0003A\u03b4\bA\u0001B\u0001B\u0001B\u0003B\u03b9\bB\u0001"+ - "B\u0005B\u03bc\bB\nB\fB\u03bf\tB\u0001B\u0001B\u0001B\u0001B\u0003B\u03c5"+ - "\bB\u0001B\u0001B\u0001B\u0001B\u0001B\u0003B\u03cc\bB\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0003B\u03d3\bB\u0001B\u0003B\u03d6\bB\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001D\u0005D\u03de\bD\nD\fD\u03e1\tD\u0001E\u0005E\u03e4"+ - "\bE\nE\fE\u03e7\tE\u0001E\u0001E\u0004E\u03eb\bE\u000bE\fE\u03ec\u0001"+ - "E\u0001E\u0003E\u03f1\bE\u0001F\u0001F\u0001F\u0001F\u0005F\u03f7\bF\n"+ - "F\fF\u03fa\tF\u0001F\u0003F\u03fd\bF\u0001F\u0000\u0000G\u0000\u0002\u0004"+ + "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0003@\u039f"+ + "\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0003A\u03a8\bA\u0001"+ + "A\u0001A\u0001A\u0003A\u03ad\bA\u0001B\u0001B\u0001B\u0003B\u03b2\bB\u0001"+ + "B\u0005B\u03b5\bB\nB\fB\u03b8\tB\u0001B\u0001B\u0001B\u0001B\u0003B\u03be"+ + "\bB\u0001B\u0001B\u0001B\u0001B\u0001B\u0003B\u03c5\bB\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0003B\u03cc\bB\u0001B\u0003B\u03cf\bB\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001D\u0005D\u03d7\bD\nD\fD\u03da\tD\u0001E\u0005E\u03dd"+ + "\bE\nE\fE\u03e0\tE\u0001E\u0001E\u0004E\u03e4\bE\u000bE\fE\u03e5\u0001"+ + "E\u0001E\u0003E\u03ea\bE\u0001F\u0001F\u0001F\u0001F\u0005F\u03f0\bF\n"+ + "F\fF\u03f3\tF\u0001F\u0003F\u03f6\bF\u0001F\u0000\u0000G\u0000\u0002\u0004"+ "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ "$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086"+ "\u0088\u008a\u008c\u0000\u0006\u0001\u0000\u0004\u0005\u0001\u0000\n\u000b"+ "\u0001\u0000qr\u0001\u0000\u0003\u0005\u0002\u0000\u0003\u0003\u0090\u0090"+ - "\u0001\u0000\u0080\u0081\u0469\u0000\u008e\u0001\u0000\u0000\u0000\u0002"+ + "\u0001\u0000\u0080\u0081\u0460\u0000\u008e\u0001\u0000\u0000\u0000\u0002"+ "\u0090\u0001\u0000\u0000\u0000\u0004\u0092\u0001\u0000\u0000\u0000\u0006"+ "\u0094\u0001\u0000\u0000\u0000\b\u0096\u0001\u0000\u0000\u0000\n\u009b"+ "\u0001\u0000\u0000\u0000\f\u009d\u0001\u0000\u0000\u0000\u000e\u00a5\u0001"+ @@ -6595,25 +6569,25 @@ public final ModuleContext module() throws RecognitionException { "\u0001\u0000\u0000\u0000.\u0134\u0001\u0000\u0000\u00000\u0139\u0001\u0000"+ "\u0000\u00002\u013c\u0001\u0000\u0000\u00004\u014d\u0001\u0000\u0000\u0000"+ "6\u0169\u0001\u0000\u0000\u00008\u0179\u0001\u0000\u0000\u0000:\u01a0"+ - "\u0001\u0000\u0000\u0000<\u01a2\u0001\u0000\u0000\u0000>\u01a8\u0001\u0000"+ - "\u0000\u0000@\u01ac\u0001\u0000\u0000\u0000B\u01da\u0001\u0000\u0000\u0000"+ - "D\u01dd\u0001\u0000\u0000\u0000F\u01ec\u0001\u0000\u0000\u0000H\u01fc"+ - "\u0001\u0000\u0000\u0000J\u0208\u0001\u0000\u0000\u0000L\u020e\u0001\u0000"+ - "\u0000\u0000N\u0210\u0001\u0000\u0000\u0000P\u0225\u0001\u0000\u0000\u0000"+ - "R\u0227\u0001\u0000\u0000\u0000T\u023a\u0001\u0000\u0000\u0000V\u0245"+ - "\u0001\u0000\u0000\u0000X\u0265\u0001\u0000\u0000\u0000Z\u0267\u0001\u0000"+ - "\u0000\u0000\\\u0281\u0001\u0000\u0000\u0000^\u02a1\u0001\u0000\u0000"+ - "\u0000`\u02a3\u0001\u0000\u0000\u0000b\u02bb\u0001\u0000\u0000\u0000d"+ - "\u02bd\u0001\u0000\u0000\u0000f\u02ce\u0001\u0000\u0000\u0000h\u02f8\u0001"+ - "\u0000\u0000\u0000j\u02fa\u0001\u0000\u0000\u0000l\u0301\u0001\u0000\u0000"+ - "\u0000n\u031b\u0001\u0000\u0000\u0000p\u031d\u0001\u0000\u0000\u0000r"+ - "\u0323\u0001\u0000\u0000\u0000t\u0328\u0001\u0000\u0000\u0000v\u0330\u0001"+ - "\u0000\u0000\u0000x\u033f\u0001\u0000\u0000\u0000z\u0341\u0001\u0000\u0000"+ - "\u0000|\u035c\u0001\u0000\u0000\u0000~\u036f\u0001\u0000\u0000\u0000\u0080"+ - "\u03a5\u0001\u0000\u0000\u0000\u0082\u03b3\u0001\u0000\u0000\u0000\u0084"+ - "\u03d5\u0001\u0000\u0000\u0000\u0086\u03d7\u0001\u0000\u0000\u0000\u0088"+ - "\u03df\u0001\u0000\u0000\u0000\u008a\u03f0\u0001\u0000\u0000\u0000\u008c"+ - "\u03fc\u0001\u0000\u0000\u0000\u008e\u008f\u0007\u0000\u0000\u0000\u008f"+ + "\u0001\u0000\u0000\u0000<\u01a2\u0001\u0000\u0000\u0000>\u01a4\u0001\u0000"+ + "\u0000\u0000@\u01a7\u0001\u0000\u0000\u0000B\u01d3\u0001\u0000\u0000\u0000"+ + "D\u01d6\u0001\u0000\u0000\u0000F\u01e5\u0001\u0000\u0000\u0000H\u01f5"+ + "\u0001\u0000\u0000\u0000J\u0201\u0001\u0000\u0000\u0000L\u0207\u0001\u0000"+ + "\u0000\u0000N\u0209\u0001\u0000\u0000\u0000P\u021e\u0001\u0000\u0000\u0000"+ + "R\u0220\u0001\u0000\u0000\u0000T\u0233\u0001\u0000\u0000\u0000V\u023e"+ + "\u0001\u0000\u0000\u0000X\u025e\u0001\u0000\u0000\u0000Z\u0260\u0001\u0000"+ + "\u0000\u0000\\\u027a\u0001\u0000\u0000\u0000^\u029a\u0001\u0000\u0000"+ + "\u0000`\u029c\u0001\u0000\u0000\u0000b\u02b4\u0001\u0000\u0000\u0000d"+ + "\u02b6\u0001\u0000\u0000\u0000f\u02c7\u0001\u0000\u0000\u0000h\u02f1\u0001"+ + "\u0000\u0000\u0000j\u02f3\u0001\u0000\u0000\u0000l\u02fa\u0001\u0000\u0000"+ + "\u0000n\u0314\u0001\u0000\u0000\u0000p\u0316\u0001\u0000\u0000\u0000r"+ + "\u031c\u0001\u0000\u0000\u0000t\u0321\u0001\u0000\u0000\u0000v\u0329\u0001"+ + "\u0000\u0000\u0000x\u0338\u0001\u0000\u0000\u0000z\u033a\u0001\u0000\u0000"+ + "\u0000|\u0355\u0001\u0000\u0000\u0000~\u0368\u0001\u0000\u0000\u0000\u0080"+ + "\u039e\u0001\u0000\u0000\u0000\u0082\u03ac\u0001\u0000\u0000\u0000\u0084"+ + "\u03ce\u0001\u0000\u0000\u0000\u0086\u03d0\u0001\u0000\u0000\u0000\u0088"+ + "\u03d8\u0001\u0000\u0000\u0000\u008a\u03e9\u0001\u0000\u0000\u0000\u008c"+ + "\u03f5\u0001\u0000\u0000\u0000\u008e\u008f\u0007\u0000\u0000\u0000\u008f"+ "\u0001\u0001\u0000\u0000\u0000\u0090\u0091\u0005\u0006\u0000\u0000\u0091"+ "\u0003\u0001\u0000\u0000\u0000\u0092\u0093\u0005\u0007\u0000\u0000\u0093"+ "\u0005\u0001\u0000\u0000\u0000\u0094\u0095\u0007\u0001\u0000\u0000\u0095"+ @@ -6778,355 +6752,351 @@ public final ModuleContext module() throws RecognitionException { "\"\u0011\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019e\u019f\u0001\u0000"+ "\u0000\u0000\u019f\u01a1\u0001\u0000\u0000\u0000\u01a0\u017e\u0001\u0000"+ "\u0000\u0000\u01a0\u0187\u0001\u0000\u0000\u0000\u01a0\u0190\u0001\u0000"+ - "\u0000\u0000\u01a1;\u0001\u0000\u0000\u0000\u01a2\u01a3\u0005\u0001\u0000"+ - "\u0000\u01a3\u01a4\u0005u\u0000\u0000\u01a4\u01a5\u0003\n\u0005\u0000"+ - "\u01a5\u01a6\u0005\u0002\u0000\u0000\u01a6=\u0001\u0000\u0000\u0000\u01a7"+ - "\u01a9\u0003<\u001e\u0000\u01a8\u01a7\u0001\u0000\u0000\u0000\u01a8\u01a9"+ - "\u0001\u0000\u0000\u0000\u01a9\u01aa\u0001\u0000\u0000\u0000\u01aa\u01ab"+ - "\u0003J%\u0000\u01ab?\u0001\u0000\u0000\u0000\u01ac\u01ad\u0005\u0001"+ - "\u0000\u0000\u01ad\u01ae\u0003B!\u0000\u01ae\u01af\u0005\u0002\u0000\u0000"+ - "\u01afA\u0001\u0000\u0000\u0000\u01b0\u01b4\u0003&\u0013\u0000\u01b1\u01b3"+ - "\u0003B!\u0000\u01b2\u01b1\u0001\u0000\u0000\u0000\u01b3\u01b6\u0001\u0000"+ - "\u0000\u0000\u01b4\u01b2\u0001\u0000\u0000\u0000\u01b4\u01b5\u0001\u0000"+ - "\u0000\u0000\u01b5\u01db\u0001\u0000\u0000\u0000\u01b6\u01b4\u0001\u0000"+ - "\u0000\u0000\u01b7\u01b8\u0005\u001f\u0000\u0000\u01b8\u01db\u0003D\""+ - "\u0000\u01b9\u01bb\u0005\u0013\u0000\u0000\u01ba\u01bc\u0003\"\u0011\u0000"+ - "\u01bb\u01ba\u0001\u0000\u0000\u0000\u01bb\u01bc\u0001\u0000\u0000\u0000"+ - "\u01bc\u01bd\u0001\u0000\u0000\u0000\u01bd\u01db\u0003>\u001f\u0000\u01be"+ - "\u01c0\u0005\u0014\u0000\u0000\u01bf\u01c1\u0003\"\u0011\u0000\u01c0\u01bf"+ - "\u0001\u0000\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000\u01c1\u01c2"+ - "\u0001\u0000\u0000\u0000\u01c2\u01db\u0003>\u001f\u0000\u01c3\u01c5\u0005"+ - "\u001a\u0000\u0000\u01c4\u01c6\u0003\"\u0011\u0000\u01c5\u01c4\u0001\u0000"+ - "\u0000\u0000\u01c5\u01c6\u0001\u0000\u0000\u0000\u01c6\u01c8\u0001\u0000"+ - "\u0000\u0000\u01c7\u01c9\u0003<\u001e\u0000\u01c8\u01c7\u0001\u0000\u0000"+ - "\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\u01cd\u0001\u0000\u0000"+ - "\u0000\u01ca\u01cc\u0003@ \u0000\u01cb\u01ca\u0001\u0000\u0000\u0000\u01cc"+ - "\u01cf\u0001\u0000\u0000\u0000\u01cd\u01cb\u0001\u0000\u0000\u0000\u01cd"+ - "\u01ce\u0001\u0000\u0000\u0000\u01ce\u01d0\u0001\u0000\u0000\u0000\u01cf"+ - "\u01cd\u0001\u0000\u0000\u0000\u01d0\u01d1\u0005\u0001\u0000\u0000\u01d1"+ - "\u01d2\u0005\u001b\u0000\u0000\u01d2\u01d8\u0003J%\u0000\u01d3\u01d4\u0005"+ - "\u0001\u0000\u0000\u01d4\u01d5\u0005\u001c\u0000\u0000\u01d5\u01d6\u0003"+ - "J%\u0000\u01d6\u01d7\u0005\u0002\u0000\u0000\u01d7\u01d9\u0001\u0000\u0000"+ - "\u0000\u01d8\u01d3\u0001\u0000\u0000\u0000\u01d8\u01d9\u0001\u0000\u0000"+ - "\u0000\u01d9\u01db\u0001\u0000\u0000\u0000\u01da\u01b0\u0001\u0000\u0000"+ - "\u0000\u01da\u01b7\u0001\u0000\u0000\u0000\u01da\u01b9\u0001\u0000\u0000"+ - "\u0000\u01da\u01be\u0001\u0000\u0000\u0000\u01da\u01c3\u0001\u0000\u0000"+ - "\u0000\u01dbC\u0001\u0000\u0000\u0000\u01dc\u01de\u0003\u001c\u000e\u0000"+ - "\u01dd\u01dc\u0001\u0000\u0000\u0000\u01dd\u01de\u0001\u0000\u0000\u0000"+ - "\u01de\u01df\u0001\u0000\u0000\u0000\u01df\u01e0\u0003F#\u0000\u01e0E"+ - "\u0001\u0000\u0000\u0000\u01e1\u01e2\u0005\u0001\u0000\u0000\u01e2\u01e6"+ - "\u0005t\u0000\u0000\u01e3\u01e5\u0003\n\u0005\u0000\u01e4\u01e3\u0001"+ - "\u0000\u0000\u0000\u01e5\u01e8\u0001\u0000\u0000\u0000\u01e6\u01e4\u0001"+ - "\u0000\u0000\u0000\u01e6\u01e7\u0001\u0000\u0000\u0000\u01e7\u01e9\u0001"+ - "\u0000\u0000\u0000\u01e8\u01e6\u0001\u0000\u0000\u0000\u01e9\u01eb\u0005"+ - "\u0002\u0000\u0000\u01ea\u01e1\u0001\u0000\u0000\u0000\u01eb\u01ee\u0001"+ - "\u0000\u0000\u0000\u01ec\u01ea\u0001\u0000\u0000\u0000\u01ec\u01ed\u0001"+ - "\u0000\u0000\u0000\u01ed\u01ef\u0001\u0000\u0000\u0000\u01ee\u01ec\u0001"+ - "\u0000\u0000\u0000\u01ef\u01f0\u0003H$\u0000\u01f0G\u0001\u0000\u0000"+ - "\u0000\u01f1\u01f2\u0005\u0001\u0000\u0000\u01f2\u01f6\u0005u\u0000\u0000"+ - "\u01f3\u01f5\u0003\n\u0005\u0000\u01f4\u01f3\u0001\u0000\u0000\u0000\u01f5"+ - "\u01f8\u0001\u0000\u0000\u0000\u01f6\u01f4\u0001\u0000\u0000\u0000\u01f6"+ - "\u01f7\u0001\u0000\u0000\u0000\u01f7\u01f9\u0001\u0000\u0000\u0000\u01f8"+ - "\u01f6\u0001\u0000\u0000\u0000\u01f9\u01fb\u0005\u0002\u0000\u0000\u01fa"+ - "\u01f1\u0001\u0000\u0000\u0000\u01fb\u01fe\u0001\u0000\u0000\u0000\u01fc"+ - "\u01fa\u0001\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd"+ - "\u0202\u0001\u0000\u0000\u0000\u01fe\u01fc\u0001\u0000\u0000\u0000\u01ff"+ - "\u0201\u0003B!\u0000\u0200\u01ff\u0001\u0000\u0000\u0000\u0201\u0204\u0001"+ - "\u0000\u0000\u0000\u0202\u0200\u0001\u0000\u0000\u0000\u0202\u0203\u0001"+ - "\u0000\u0000\u0000\u0203I\u0001\u0000\u0000\u0000\u0204\u0202\u0001\u0000"+ - "\u0000\u0000\u0205\u0207\u0003$\u0012\u0000\u0206\u0205\u0001\u0000\u0000"+ - "\u0000\u0207\u020a\u0001\u0000\u0000\u0000\u0208\u0206\u0001\u0000\u0000"+ - "\u0000\u0208\u0209\u0001\u0000\u0000\u0000\u0209\u020c\u0001\u0000\u0000"+ - "\u0000\u020a\u0208\u0001\u0000\u0000\u0000\u020b\u020d\u00032\u0019\u0000"+ - "\u020c\u020b\u0001\u0000\u0000\u0000\u020c\u020d\u0001\u0000\u0000\u0000"+ - "\u020dK\u0001\u0000\u0000\u0000\u020e\u020f\u0003J%\u0000\u020fM\u0001"+ - "\u0000\u0000\u0000\u0210\u0211\u0005\u0001\u0000\u0000\u0211\u0213\u0005"+ - "q\u0000\u0000\u0212\u0214\u0003\"\u0011\u0000\u0213\u0212\u0001\u0000"+ - "\u0000\u0000\u0213\u0214\u0001\u0000\u0000\u0000\u0214\u0215\u0001\u0000"+ - "\u0000\u0000\u0215\u0216\u0003P(\u0000\u0216\u0217\u0005\u0002\u0000\u0000"+ - "\u0217O\u0001\u0000\u0000\u0000\u0218\u021a\u0003\u001c\u000e\u0000\u0219"+ - "\u0218\u0001\u0000\u0000\u0000\u0219\u021a\u0001\u0000\u0000\u0000\u021a"+ - "\u021b\u0001\u0000\u0000\u0000\u021b\u0226\u0003R)\u0000\u021c\u021e\u0003"+ - "l6\u0000\u021d\u021f\u0003\u001c\u000e\u0000\u021e\u021d\u0001\u0000\u0000"+ - "\u0000\u021e\u021f\u0001\u0000\u0000\u0000\u021f\u0220\u0001\u0000\u0000"+ - "\u0000\u0220\u0221\u0003\u0016\u000b\u0000\u0221\u0226\u0001\u0000\u0000"+ - "\u0000\u0222\u0223\u0003r9\u0000\u0223\u0224\u0003P(\u0000\u0224\u0226"+ - "\u0001\u0000\u0000\u0000\u0225\u0219\u0001\u0000\u0000\u0000\u0225\u021c"+ - "\u0001\u0000\u0000\u0000\u0225\u0222\u0001\u0000\u0000\u0000\u0226Q\u0001"+ - "\u0000\u0000\u0000\u0227\u0228\u0003\u0016\u000b\u0000\u0228\u0229\u0003"+ - "T*\u0000\u0229S\u0001\u0000\u0000\u0000\u022a\u022b\u0005\u0001\u0000"+ - "\u0000\u022b\u0235\u0005v\u0000\u0000\u022c\u022e\u0003\n\u0005\u0000"+ - "\u022d\u022c\u0001\u0000\u0000\u0000\u022e\u0231\u0001\u0000\u0000\u0000"+ - "\u022f\u022d\u0001\u0000\u0000\u0000\u022f\u0230\u0001\u0000\u0000\u0000"+ - "\u0230\u0236\u0001\u0000\u0000\u0000\u0231\u022f\u0001\u0000\u0000\u0000"+ - "\u0232\u0233\u0003\"\u0011\u0000\u0233\u0234\u0003\n\u0005\u0000\u0234"+ - "\u0236\u0001\u0000\u0000\u0000\u0235\u022f\u0001\u0000\u0000\u0000\u0235"+ - "\u0232\u0001\u0000\u0000\u0000\u0236\u0237\u0001\u0000\u0000\u0000\u0237"+ - "\u0239\u0005\u0002\u0000\u0000\u0238\u022a\u0001\u0000\u0000\u0000\u0239"+ - "\u023c\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a"+ - "\u023b\u0001\u0000\u0000\u0000\u023b\u023d\u0001\u0000\u0000\u0000\u023c"+ - "\u023a\u0001\u0000\u0000\u0000\u023d\u023e\u0003J%\u0000\u023eU\u0001"+ - "\u0000\u0000\u0000\u023f\u0240\u0005\u0001\u0000\u0000\u0240\u0241\u0005"+ - "|\u0000\u0000\u0241\u0242\u0003L&\u0000\u0242\u0243\u0005\u0002\u0000"+ - "\u0000\u0243\u0246\u0001\u0000\u0000\u0000\u0244\u0246\u0003B!\u0000\u0245"+ - "\u023f\u0001\u0000\u0000\u0000\u0245\u0244\u0001\u0000\u0000\u0000\u0246"+ - "W\u0001\u0000\u0000\u0000\u0247\u0248\u0005\u0001\u0000\u0000\u0248\u024a"+ - "\u0005z\u0000\u0000\u0249\u024b\u0003 \u0010\u0000\u024a\u0249\u0001\u0000"+ - "\u0000\u0000\u024a\u024b\u0001\u0000\u0000\u0000\u024b\u024c\u0001\u0000"+ - "\u0000\u0000\u024c\u024d\u0005\u0001\u0000\u0000\u024d\u024e\u0003$\u0012"+ - "\u0000\u024e\u0252\u0005\u0002\u0000\u0000\u024f\u0251\u0003 \u0010\u0000"+ - "\u0250\u024f\u0001\u0000\u0000\u0000\u0251\u0254\u0001\u0000\u0000\u0000"+ - "\u0252\u0250\u0001\u0000\u0000\u0000\u0252\u0253\u0001\u0000\u0000\u0000"+ - "\u0253\u0255\u0001\u0000\u0000\u0000\u0254\u0252\u0001\u0000\u0000\u0000"+ - "\u0255\u0256\u0005\u0002\u0000\u0000\u0256\u0266\u0001\u0000\u0000\u0000"+ - "\u0257\u0258\u0005\u0001\u0000\u0000\u0258\u025a\u0005z\u0000\u0000\u0259"+ - "\u025b\u0003 \u0010\u0000\u025a\u0259\u0001\u0000\u0000\u0000\u025a\u025b"+ - "\u0001\u0000\u0000\u0000\u025b\u025c\u0001\u0000\u0000\u0000\u025c\u0260"+ - "\u0003V+\u0000\u025d\u025f\u0003 \u0010\u0000\u025e\u025d\u0001\u0000"+ - "\u0000\u0000\u025f\u0262\u0001\u0000\u0000\u0000\u0260\u025e\u0001\u0000"+ - "\u0000\u0000\u0260\u0261\u0001\u0000\u0000\u0000\u0261\u0263\u0001\u0000"+ - "\u0000\u0000\u0262\u0260\u0001\u0000\u0000\u0000\u0263\u0264\u0005\u0002"+ - "\u0000\u0000\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0247\u0001\u0000"+ - "\u0000\u0000\u0265\u0257\u0001\u0000\u0000\u0000\u0266Y\u0001\u0000\u0000"+ - "\u0000\u0267\u0268\u0005\u0001\u0000\u0000\u0268\u026a\u0005x\u0000\u0000"+ - "\u0269\u026b\u0003\"\u0011\u0000\u026a\u0269\u0001\u0000\u0000\u0000\u026a"+ - "\u026b\u0001\u0000\u0000\u0000\u026b\u026c\u0001\u0000\u0000\u0000\u026c"+ - "\u026d\u0003\\.\u0000\u026d\u026e\u0005\u0002\u0000\u0000\u026e[\u0001"+ - "\u0000\u0000\u0000\u026f\u0282\u0003\u0018\f\u0000\u0270\u0271\u0003l"+ - "6\u0000\u0271\u0272\u0003\u0018\f\u0000\u0272\u0282\u0001\u0000\u0000"+ - "\u0000\u0273\u0274\u0003r9\u0000\u0274\u0275\u0003\\.\u0000\u0275\u0282"+ - "\u0001\u0000\u0000\u0000\u0276\u0277\u0003\u0006\u0003\u0000\u0277\u0278"+ - "\u0005\u0001\u0000\u0000\u0278\u027c\u0005z\u0000\u0000\u0279\u027b\u0003"+ - " \u0010\u0000\u027a\u0279\u0001\u0000\u0000\u0000\u027b\u027e\u0001\u0000"+ - "\u0000\u0000\u027c\u027a\u0001\u0000\u0000\u0000\u027c\u027d\u0001\u0000"+ - "\u0000\u0000\u027d\u027f\u0001\u0000\u0000\u0000\u027e\u027c\u0001\u0000"+ - "\u0000\u0000\u027f\u0280\u0005\u0002\u0000\u0000\u0280\u0282\u0001\u0000"+ - "\u0000\u0000\u0281\u026f\u0001\u0000\u0000\u0000\u0281\u0270\u0001\u0000"+ - "\u0000\u0000\u0281\u0273\u0001\u0000\u0000\u0000\u0281\u0276\u0001\u0000"+ - "\u0000\u0000\u0282]\u0001\u0000\u0000\u0000\u0283\u0284\u0005\u0001\u0000"+ - "\u0000\u0284\u0286\u0005{\u0000\u0000\u0285\u0287\u0003 \u0010\u0000\u0286"+ - "\u0285\u0001\u0000\u0000\u0000\u0286\u0287\u0001\u0000\u0000\u0000\u0287"+ - "\u0288\u0001\u0000\u0000\u0000\u0288\u0289\u0005\u0001\u0000\u0000\u0289"+ - "\u028a\u0003$\u0012\u0000\u028a\u028e\u0005\u0002\u0000\u0000\u028b\u028d"+ - "\u0005\u0006\u0000\u0000\u028c\u028b\u0001\u0000\u0000\u0000\u028d\u0290"+ - "\u0001\u0000\u0000\u0000\u028e\u028c\u0001\u0000\u0000\u0000\u028e\u028f"+ - "\u0001\u0000\u0000\u0000\u028f\u0291\u0001\u0000\u0000\u0000\u0290\u028e"+ - "\u0001\u0000\u0000\u0000\u0291\u0292\u0005\u0002\u0000\u0000\u0292\u02a2"+ - "\u0001\u0000\u0000\u0000\u0293\u0294\u0005\u0001\u0000\u0000\u0294\u0296"+ - "\u0005{\u0000\u0000\u0295\u0297\u0003 \u0010\u0000\u0296\u0295\u0001\u0000"+ - "\u0000\u0000\u0296\u0297\u0001\u0000\u0000\u0000\u0297\u0298\u0001\u0000"+ - "\u0000\u0000\u0298\u029c\u0003V+\u0000\u0299\u029b\u0005\u0006\u0000\u0000"+ - "\u029a\u0299\u0001\u0000\u0000\u0000\u029b\u029e\u0001\u0000\u0000\u0000"+ - "\u029c\u029a\u0001\u0000\u0000\u0000\u029c\u029d\u0001\u0000\u0000\u0000"+ - "\u029d\u029f\u0001\u0000\u0000\u0000\u029e\u029c\u0001\u0000\u0000\u0000"+ - "\u029f\u02a0\u0005\u0002\u0000\u0000\u02a0\u02a2\u0001\u0000\u0000\u0000"+ - "\u02a1\u0283\u0001\u0000\u0000\u0000\u02a1\u0293\u0001\u0000\u0000\u0000"+ - "\u02a2_\u0001\u0000\u0000\u0000\u02a3\u02a4\u0005\u0001\u0000\u0000\u02a4"+ - "\u02a6\u0005y\u0000\u0000\u02a5\u02a7\u0003\"\u0011\u0000\u02a6\u02a5"+ - "\u0001\u0000\u0000\u0000\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u02a8"+ - "\u0001\u0000\u0000\u0000\u02a8\u02a9\u0003b1\u0000\u02a9\u02aa\u0005\u0002"+ - "\u0000\u0000\u02aaa\u0001\u0000\u0000\u0000\u02ab\u02bc\u0003\u001a\r"+ - "\u0000\u02ac\u02ad\u0003l6\u0000\u02ad\u02ae\u0003\u001a\r\u0000\u02ae"+ - "\u02bc\u0001\u0000\u0000\u0000\u02af\u02b0\u0003r9\u0000\u02b0\u02b1\u0003"+ - "b1\u0000\u02b1\u02bc\u0001\u0000\u0000\u0000\u02b2\u02b3\u0005\u0001\u0000"+ - "\u0000\u02b3\u02b7\u0005{\u0000\u0000\u02b4\u02b6\u0005\u0006\u0000\u0000"+ - "\u02b5\u02b4\u0001\u0000\u0000\u0000\u02b6\u02b9\u0001\u0000\u0000\u0000"+ - "\u02b7\u02b5\u0001\u0000\u0000\u0000\u02b7\u02b8\u0001\u0000\u0000\u0000"+ - "\u02b8\u02ba\u0001\u0000\u0000\u0000\u02b9\u02b7\u0001\u0000\u0000\u0000"+ - "\u02ba\u02bc\u0005\u0002\u0000\u0000\u02bb\u02ab\u0001\u0000\u0000\u0000"+ - "\u02bb\u02ac\u0001\u0000\u0000\u0000\u02bb\u02af\u0001\u0000\u0000\u0000"+ - "\u02bb\u02b2\u0001\u0000\u0000\u0000\u02bcc\u0001\u0000\u0000\u0000\u02bd"+ - "\u02be\u0005\u0001\u0000\u0000\u02be\u02c0\u0005w\u0000\u0000\u02bf\u02c1"+ - "\u0003\"\u0011\u0000\u02c0\u02bf\u0001\u0000\u0000\u0000\u02c0\u02c1\u0001"+ - "\u0000\u0000\u0000\u02c1\u02c2\u0001\u0000\u0000\u0000\u02c2\u02c3\u0003"+ - "f3\u0000\u02c3\u02c4\u0005\u0002\u0000\u0000\u02c4e\u0001\u0000\u0000"+ - "\u0000\u02c5\u02c6\u0003\u000e\u0007\u0000\u02c6\u02c7\u0003L&\u0000\u02c7"+ - "\u02cf\u0001\u0000\u0000\u0000\u02c8\u02c9\u0003l6\u0000\u02c9\u02ca\u0003"+ - "\u000e\u0007\u0000\u02ca\u02cf\u0001\u0000\u0000\u0000\u02cb\u02cc\u0003"+ - "r9\u0000\u02cc\u02cd\u0003f3\u0000\u02cd\u02cf\u0001\u0000\u0000\u0000"+ - "\u02ce\u02c5\u0001\u0000\u0000\u0000\u02ce\u02c8\u0001\u0000\u0000\u0000"+ - "\u02ce\u02cb\u0001\u0000\u0000\u0000\u02cfg\u0001\u0000\u0000\u0000\u02d0"+ - "\u02d1\u0005\u0001\u0000\u0000\u02d1\u02d3\u0005q\u0000\u0000\u02d2\u02d4"+ - "\u0003\"\u0011\u0000\u02d3\u02d2\u0001\u0000\u0000\u0000\u02d3\u02d4\u0001"+ - "\u0000\u0000\u0000\u02d4\u02d5\u0001\u0000\u0000\u0000\u02d5\u02d6\u0003"+ - "\u001c\u000e\u0000\u02d6\u02d7\u0005\u0002\u0000\u0000\u02d7\u02f9\u0001"+ - "\u0000\u0000\u0000\u02d8\u02d9\u0005\u0001\u0000\u0000\u02d9\u02db\u0005"+ - "q\u0000\u0000\u02da\u02dc\u0003\"\u0011\u0000\u02db\u02da\u0001\u0000"+ - "\u0000\u0000\u02db\u02dc\u0001\u0000\u0000\u0000\u02dc\u02dd\u0001\u0000"+ - "\u0000\u0000\u02dd\u02de\u0003\u0016\u000b\u0000\u02de\u02df\u0005\u0002"+ - "\u0000\u0000\u02df\u02f9\u0001\u0000\u0000\u0000\u02e0\u02e1\u0005\u0001"+ - "\u0000\u0000\u02e1\u02e3\u0005x\u0000\u0000\u02e2\u02e4\u0003\"\u0011"+ - "\u0000\u02e3\u02e2\u0001\u0000\u0000\u0000\u02e3\u02e4\u0001\u0000\u0000"+ - "\u0000\u02e4\u02e5\u0001\u0000\u0000\u0000\u02e5\u02e6\u0003\u0018\f\u0000"+ - "\u02e6\u02e7\u0005\u0002\u0000\u0000\u02e7\u02f9\u0001\u0000\u0000\u0000"+ - "\u02e8\u02e9\u0005\u0001\u0000\u0000\u02e9\u02eb\u0005y\u0000\u0000\u02ea"+ - "\u02ec\u0003\"\u0011\u0000\u02eb\u02ea\u0001\u0000\u0000\u0000\u02eb\u02ec"+ - "\u0001\u0000\u0000\u0000\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ed\u02ee"+ - "\u0003\u001a\r\u0000\u02ee\u02ef\u0005\u0002\u0000\u0000\u02ef\u02f9\u0001"+ - "\u0000\u0000\u0000\u02f0\u02f1\u0005\u0001\u0000\u0000\u02f1\u02f3\u0005"+ - "w\u0000\u0000\u02f2\u02f4\u0003\"\u0011\u0000\u02f3\u02f2\u0001\u0000"+ - "\u0000\u0000\u02f3\u02f4\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000"+ - "\u0000\u0000\u02f5\u02f6\u0003\u000e\u0007\u0000\u02f6\u02f7\u0005\u0002"+ - "\u0000\u0000\u02f7\u02f9\u0001\u0000\u0000\u0000\u02f8\u02d0\u0001\u0000"+ - "\u0000\u0000\u02f8\u02d8\u0001\u0000\u0000\u0000\u02f8\u02e0\u0001\u0000"+ - "\u0000\u0000\u02f8\u02e8\u0001\u0000\u0000\u0000\u02f8\u02f0\u0001\u0000"+ - "\u0000\u0000\u02f9i\u0001\u0000\u0000\u0000\u02fa\u02fb\u0005\u0001\u0000"+ - "\u0000\u02fb\u02fc\u0005}\u0000\u0000\u02fc\u02fd\u0003\u0002\u0001\u0000"+ - "\u02fd\u02fe\u0003\u0002\u0001\u0000\u02fe\u02ff\u0003h4\u0000\u02ff\u0300"+ - "\u0005\u0002\u0000\u0000\u0300k\u0001\u0000\u0000\u0000\u0301\u0302\u0005"+ - "\u0001\u0000\u0000\u0302\u0303\u0005}\u0000\u0000\u0303\u0304\u0003\u0002"+ - "\u0001\u0000\u0304\u0305\u0003\u0002\u0001\u0000\u0305\u0306\u0005\u0002"+ - "\u0000\u0000\u0306m\u0001\u0000\u0000\u0000\u0307\u0308\u0005\u0001\u0000"+ - "\u0000\u0308\u0309\u0005q\u0000\u0000\u0309\u030a\u0003 \u0010\u0000\u030a"+ - "\u030b\u0005\u0002\u0000\u0000\u030b\u031c\u0001\u0000\u0000\u0000\u030c"+ - "\u030d\u0005\u0001\u0000\u0000\u030d\u030e\u0005x\u0000\u0000\u030e\u030f"+ - "\u0003 \u0010\u0000\u030f\u0310\u0005\u0002\u0000\u0000\u0310\u031c\u0001"+ - "\u0000\u0000\u0000\u0311\u0312\u0005\u0001\u0000\u0000\u0312\u0313\u0005"+ - "y\u0000\u0000\u0313\u0314\u0003 \u0010\u0000\u0314\u0315\u0005\u0002\u0000"+ - "\u0000\u0315\u031c\u0001\u0000\u0000\u0000\u0316\u0317\u0005\u0001\u0000"+ - "\u0000\u0317\u0318\u0005w\u0000\u0000\u0318\u0319\u0003 \u0010\u0000\u0319"+ - "\u031a\u0005\u0002\u0000\u0000\u031a\u031c\u0001\u0000\u0000\u0000\u031b"+ - "\u0307\u0001\u0000\u0000\u0000\u031b\u030c\u0001\u0000\u0000\u0000\u031b"+ - "\u0311\u0001\u0000\u0000\u0000\u031b\u0316\u0001\u0000\u0000\u0000\u031c"+ - "o\u0001\u0000\u0000\u0000\u031d\u031e\u0005\u0001\u0000\u0000\u031e\u031f"+ - "\u0005~\u0000\u0000\u031f\u0320\u0003\u0002\u0001\u0000\u0320\u0321\u0003"+ - "n7\u0000\u0321\u0322\u0005\u0002\u0000\u0000\u0322q\u0001\u0000\u0000"+ - "\u0000\u0323\u0324\u0005\u0001\u0000\u0000\u0324\u0325\u0005~\u0000\u0000"+ - "\u0325\u0326\u0003\u0002\u0001\u0000\u0326\u0327\u0005\u0002\u0000\u0000"+ - "\u0327s\u0001\u0000\u0000\u0000\u0328\u0329\u0005\u0001\u0000\u0000\u0329"+ - "\u032b\u0005p\u0000\u0000\u032a\u032c\u0003\"\u0011\u0000\u032b\u032a"+ - "\u0001\u0000\u0000\u0000\u032b\u032c\u0001\u0000\u0000\u0000\u032c\u032d"+ - "\u0001\u0000\u0000\u0000\u032d\u032e\u0003\u0010\b\u0000\u032e\u032f\u0005"+ - "\u0002\u0000\u0000\u032fu\u0001\u0000\u0000\u0000\u0330\u0331\u0005\u0001"+ - "\u0000\u0000\u0331\u0332\u0005s\u0000\u0000\u0332\u0333\u0003 \u0010\u0000"+ - "\u0333\u0334\u0005\u0002\u0000\u0000\u0334w\u0001\u0000\u0000\u0000\u0335"+ - "\u0340\u0003t:\u0000\u0336\u0340\u0003d2\u0000\u0337\u0340\u0003Z-\u0000"+ - "\u0338\u0340\u0003`0\u0000\u0339\u0340\u0003N\'\u0000\u033a\u0340\u0003"+ - "X,\u0000\u033b\u0340\u0003^/\u0000\u033c\u0340\u0003v;\u0000\u033d\u0340"+ - "\u0003j5\u0000\u033e\u0340\u0003p8\u0000\u033f\u0335\u0001\u0000\u0000"+ - "\u0000\u033f\u0336\u0001\u0000\u0000\u0000\u033f\u0337\u0001\u0000\u0000"+ - "\u0000\u033f\u0338\u0001\u0000\u0000\u0000\u033f\u0339\u0001\u0000\u0000"+ - "\u0000\u033f\u033a\u0001\u0000\u0000\u0000\u033f\u033b\u0001\u0000\u0000"+ - "\u0000\u033f\u033c\u0001\u0000\u0000\u0000\u033f\u033d\u0001\u0000\u0000"+ - "\u0000\u033f\u033e\u0001\u0000\u0000\u0000\u0340y\u0001\u0000\u0000\u0000"+ - "\u0341\u0342\u0005\u0001\u0000\u0000\u0342\u0344\u0005\u007f\u0000\u0000"+ - "\u0343\u0345\u0005\u0090\u0000\u0000\u0344\u0343\u0001\u0000\u0000\u0000"+ - "\u0344\u0345\u0001\u0000\u0000\u0000\u0345\u0349\u0001\u0000\u0000\u0000"+ - "\u0346\u0348\u0003x<\u0000\u0347\u0346\u0001\u0000\u0000\u0000\u0348\u034b"+ - "\u0001\u0000\u0000\u0000\u0349\u0347\u0001\u0000\u0000\u0000\u0349\u034a"+ - "\u0001\u0000\u0000\u0000\u034a\u034c\u0001\u0000\u0000\u0000\u034b\u0349"+ - "\u0001\u0000\u0000\u0000\u034c\u034d\u0005\u0002\u0000\u0000\u034d{\u0001"+ - "\u0000\u0000\u0000\u034e\u035d\u0003z=\u0000\u034f\u0350\u0005\u0001\u0000"+ - "\u0000\u0350\u0352\u0005\u007f\u0000\u0000\u0351\u0353\u0005\u0090\u0000"+ - "\u0000\u0352\u0351\u0001\u0000\u0000\u0000\u0352\u0353\u0001\u0000\u0000"+ - "\u0000\u0353\u0354\u0001\u0000\u0000\u0000\u0354\u0358\u0007\u0005\u0000"+ - "\u0000\u0355\u0357\u0005\u0006\u0000\u0000\u0356\u0355\u0001\u0000\u0000"+ - "\u0000\u0357\u035a\u0001\u0000\u0000\u0000\u0358\u0356\u0001\u0000\u0000"+ - "\u0000\u0358\u0359\u0001\u0000\u0000\u0000\u0359\u035b\u0001\u0000\u0000"+ - "\u0000\u035a\u0358\u0001\u0000\u0000\u0000\u035b\u035d\u0005\u0002\u0000"+ - "\u0000\u035c\u034e\u0001\u0000\u0000\u0000\u035c\u034f\u0001\u0000\u0000"+ - "\u0000\u035d}\u0001\u0000\u0000\u0000\u035e\u035f\u0005\u0001\u0000\u0000"+ - "\u035f\u0361\u0005\u0084\u0000\u0000\u0360\u0362\u0005\u0090\u0000\u0000"+ - "\u0361\u0360\u0001\u0000\u0000\u0000\u0361\u0362\u0001\u0000\u0000\u0000"+ - "\u0362\u0363\u0001\u0000\u0000\u0000\u0363\u0364\u0003\u0002\u0001\u0000"+ - "\u0364\u0365\u0003\u0088D\u0000\u0365\u0366\u0005\u0002\u0000\u0000\u0366"+ - "\u0370\u0001\u0000\u0000\u0000\u0367\u0368\u0005\u0001\u0000\u0000\u0368"+ - "\u036a\u0005\u0085\u0000\u0000\u0369\u036b\u0005\u0090\u0000\u0000\u036a"+ - "\u0369\u0001\u0000\u0000\u0000\u036a\u036b\u0001\u0000\u0000\u0000\u036b"+ - "\u036c\u0001\u0000\u0000\u0000\u036c\u036d\u0003\u0002\u0001\u0000\u036d"+ - "\u036e\u0005\u0002\u0000\u0000\u036e\u0370\u0001\u0000\u0000\u0000\u036f"+ - "\u035e\u0001\u0000\u0000\u0000\u036f\u0367\u0001\u0000\u0000\u0000\u0370"+ - "\u007f\u0001\u0000\u0000\u0000\u0371\u0372\u0005\u0001\u0000\u0000\u0372"+ - "\u0373\u0005\u0086\u0000\u0000\u0373\u0374\u0003|>\u0000\u0374\u0375\u0005"+ - "\u0006\u0000\u0000\u0375\u0376\u0005\u0002\u0000\u0000\u0376\u03a6\u0001"+ - "\u0000\u0000\u0000\u0377\u0378\u0005\u0001\u0000\u0000\u0378\u0379\u0005"+ - "\u0087\u0000\u0000\u0379\u037a\u0003|>\u0000\u037a\u037b\u0005\u0006\u0000"+ - "\u0000\u037b\u037c\u0005\u0002\u0000\u0000\u037c\u03a6\u0001\u0000\u0000"+ - "\u0000\u037d\u037e\u0005\u0001\u0000\u0000\u037e\u037f\u0005\u0088\u0000"+ - "\u0000\u037f\u0380\u0003|>\u0000\u0380\u0381\u0005\u0006\u0000\u0000\u0381"+ - "\u0382\u0005\u0002\u0000\u0000\u0382\u03a6\u0001\u0000\u0000\u0000\u0383"+ - "\u0384\u0005\u0001\u0000\u0000\u0384\u0385\u0005\u008c\u0000\u0000\u0385"+ - "\u0386\u0003|>\u0000\u0386\u0387\u0005\u0006\u0000\u0000\u0387\u0388\u0005"+ - "\u0002\u0000\u0000\u0388\u03a6\u0001\u0000\u0000\u0000\u0389\u038a\u0005"+ - "\u0001\u0000\u0000\u038a\u038b\u0005\u0089\u0000\u0000\u038b\u038c\u0003"+ - "~?\u0000\u038c\u038d\u0003\u0088D\u0000\u038d\u038e\u0005\u0002\u0000"+ - "\u0000\u038e\u03a6\u0001\u0000\u0000\u0000\u038f\u0390\u0005\u0001\u0000"+ - "\u0000\u0390\u0391\u0005\u008a\u0000\u0000\u0391\u0392\u0003~?\u0000\u0392"+ - "\u0393\u0005\u0002\u0000\u0000\u0393\u03a6\u0001\u0000\u0000\u0000\u0394"+ - "\u0395\u0005\u0001\u0000\u0000\u0395\u0396\u0005\u008b\u0000\u0000\u0396"+ - "\u0397\u0003~?\u0000\u0397\u0398\u0005\u0002\u0000\u0000\u0398\u03a6\u0001"+ - "\u0000\u0000\u0000\u0399\u039a\u0005\u0001\u0000\u0000\u039a\u039b\u0005"+ - "\u008c\u0000\u0000\u039b\u039c\u0003~?\u0000\u039c\u039d\u0005\u0006\u0000"+ - "\u0000\u039d\u039e\u0005\u0002\u0000\u0000\u039e\u03a6\u0001\u0000\u0000"+ - "\u0000\u039f\u03a0\u0005\u0001\u0000\u0000\u03a0\u03a1\u0005\u008d\u0000"+ - "\u0000\u03a1\u03a2\u0003~?\u0000\u03a2\u03a3\u0005\u0006\u0000\u0000\u03a3"+ - "\u03a4\u0005\u0002\u0000\u0000\u03a4\u03a6\u0001\u0000\u0000\u0000\u03a5"+ - "\u0371\u0001\u0000\u0000\u0000\u03a5\u0377\u0001\u0000\u0000\u0000\u03a5"+ - "\u037d\u0001\u0000\u0000\u0000\u03a5\u0383\u0001\u0000\u0000\u0000\u03a5"+ - "\u0389\u0001\u0000\u0000\u0000\u03a5\u038f\u0001\u0000\u0000\u0000\u03a5"+ - "\u0394\u0001\u0000\u0000\u0000\u03a5\u0399\u0001\u0000\u0000\u0000\u03a5"+ - "\u039f\u0001\u0000\u0000\u0000\u03a6\u0081\u0001\u0000\u0000\u0000\u03a7"+ - "\u03b4\u0003~?\u0000\u03a8\u03b4\u0003\u0080@\u0000\u03a9\u03b4\u0003"+ - "|>\u0000\u03aa\u03ab\u0005\u0001\u0000\u0000\u03ab\u03ac\u0005\u0083\u0000"+ - "\u0000\u03ac\u03ae\u0003\u0002\u0001\u0000\u03ad\u03af\u0005\u0090\u0000"+ - "\u0000\u03ae\u03ad\u0001\u0000\u0000\u0000\u03ae\u03af\u0001\u0000\u0000"+ - "\u0000\u03af\u03b0\u0001\u0000\u0000\u0000\u03b0\u03b1\u0005\u0002\u0000"+ - "\u0000\u03b1\u03b4\u0001\u0000\u0000\u0000\u03b2\u03b4\u0003\u0084B\u0000"+ - "\u03b3\u03a7\u0001\u0000\u0000\u0000\u03b3\u03a8\u0001\u0000\u0000\u0000"+ - "\u03b3\u03a9\u0001\u0000\u0000\u0000\u03b3\u03aa\u0001\u0000\u0000\u0000"+ - "\u03b3\u03b2\u0001\u0000\u0000\u0000\u03b4\u0083\u0001\u0000\u0000\u0000"+ - "\u03b5\u03b6\u0005\u0001\u0000\u0000\u03b6\u03b8\u0005\u0082\u0000\u0000"+ - "\u03b7\u03b9\u0005\u0090\u0000\u0000\u03b8\u03b7\u0001\u0000\u0000\u0000"+ - "\u03b8\u03b9\u0001\u0000\u0000\u0000\u03b9\u03bd\u0001\u0000\u0000\u0000"+ - "\u03ba\u03bc\u0003\u0082A\u0000\u03bb\u03ba\u0001\u0000\u0000\u0000\u03bc"+ - "\u03bf\u0001\u0000\u0000\u0000\u03bd\u03bb\u0001\u0000\u0000\u0000\u03bd"+ - "\u03be\u0001\u0000\u0000\u0000\u03be\u03c0\u0001\u0000\u0000\u0000\u03bf"+ - "\u03bd\u0001\u0000\u0000\u0000\u03c0\u03d6\u0005\u0002\u0000\u0000\u03c1"+ - "\u03c2\u0005\u0001\u0000\u0000\u03c2\u03c4\u0005\u008e\u0000\u0000\u03c3"+ - "\u03c5\u0005\u0090\u0000\u0000\u03c4\u03c3\u0001\u0000\u0000\u0000\u03c4"+ - "\u03c5\u0001\u0000\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000\u03c6"+ - "\u03c7\u0005\u0006\u0000\u0000\u03c7\u03d6\u0005\u0002\u0000\u0000\u03c8"+ - "\u03c9\u0005\u0001\u0000\u0000\u03c9\u03cb\u0005\u008f\u0000\u0000\u03ca"+ - "\u03cc\u0005\u0090\u0000\u0000\u03cb\u03ca\u0001\u0000\u0000\u0000\u03cb"+ - "\u03cc\u0001\u0000\u0000\u0000\u03cc\u03cd\u0001\u0000\u0000\u0000\u03cd"+ - "\u03ce\u0005\u0006\u0000\u0000\u03ce\u03d6\u0005\u0002\u0000\u0000\u03cf"+ - "\u03d0\u0005\u0001\u0000\u0000\u03d0\u03d2\u0005\u008f\u0000\u0000\u03d1"+ - "\u03d3\u0005\u0090\u0000\u0000\u03d2\u03d1\u0001\u0000\u0000\u0000\u03d2"+ - "\u03d3\u0001\u0000\u0000\u0000\u03d3\u03d4\u0001\u0000\u0000\u0000\u03d4"+ - "\u03d6\u0005\u0002\u0000\u0000\u03d5\u03b5\u0001\u0000\u0000\u0000\u03d5"+ - "\u03c1\u0001\u0000\u0000\u0000\u03d5\u03c8\u0001\u0000\u0000\u0000\u03d5"+ - "\u03cf\u0001\u0000\u0000\u0000\u03d6\u0085\u0001\u0000\u0000\u0000\u03d7"+ - "\u03d8\u0005\u0001\u0000\u0000\u03d8\u03d9\u0005\b\u0000\u0000\u03d9\u03da"+ - "\u0003\u001e\u000f\u0000\u03da\u03db\u0005\u0002\u0000\u0000\u03db\u0087"+ - "\u0001\u0000\u0000\u0000\u03dc\u03de\u0003\u0086C\u0000\u03dd\u03dc\u0001"+ - "\u0000\u0000\u0000\u03de\u03e1\u0001\u0000\u0000\u0000\u03df\u03dd\u0001"+ - "\u0000\u0000\u0000\u03df\u03e0\u0001\u0000\u0000\u0000\u03e0\u0089\u0001"+ - "\u0000\u0000\u0000\u03e1\u03df\u0001\u0000\u0000\u0000\u03e2\u03e4\u0003"+ - "\u0082A\u0000\u03e3\u03e2\u0001\u0000\u0000\u0000\u03e4\u03e7\u0001\u0000"+ - "\u0000\u0000\u03e5\u03e3\u0001\u0000\u0000\u0000\u03e5\u03e6\u0001\u0000"+ - "\u0000\u0000\u03e6\u03e8\u0001\u0000\u0000\u0000\u03e7\u03e5\u0001\u0000"+ - "\u0000\u0000\u03e8\u03f1\u0005\u0000\u0000\u0001\u03e9\u03eb\u0003x<\u0000"+ - "\u03ea\u03e9\u0001\u0000\u0000\u0000\u03eb\u03ec\u0001\u0000\u0000\u0000"+ - "\u03ec\u03ea\u0001\u0000\u0000\u0000\u03ec\u03ed\u0001\u0000\u0000\u0000"+ - "\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee\u03ef\u0005\u0000\u0000\u0001"+ - "\u03ef\u03f1\u0001\u0000\u0000\u0000\u03f0\u03e5\u0001\u0000\u0000\u0000"+ - "\u03f0\u03ea\u0001\u0000\u0000\u0000\u03f1\u008b\u0001\u0000\u0000\u0000"+ - "\u03f2\u03f3\u0003z=\u0000\u03f3\u03f4\u0005\u0000\u0000\u0001\u03f4\u03fd"+ - "\u0001\u0000\u0000\u0000\u03f5\u03f7\u0003x<\u0000\u03f6\u03f5\u0001\u0000"+ - "\u0000\u0000\u03f7\u03fa\u0001\u0000\u0000\u0000\u03f8\u03f6\u0001\u0000"+ - "\u0000\u0000\u03f8\u03f9\u0001\u0000\u0000\u0000\u03f9\u03fb\u0001\u0000"+ - "\u0000\u0000\u03fa\u03f8\u0001\u0000\u0000\u0000\u03fb\u03fd\u0005\u0000"+ - "\u0000\u0001\u03fc\u03f2\u0001\u0000\u0000\u0000\u03fc\u03f8\u0001\u0000"+ - "\u0000\u0000\u03fd\u008d\u0001\u0000\u0000\u0000o\u009b\u00a5\u00b1\u00b7"+ - "\u00bc\u00c4\u00ca\u00d2\u00d8\u00e8\u00f6\u0107\u010a\u010e\u0111\u0125"+ - "\u0132\u0137\u013e\u0147\u014d\u0155\u015b\u0163\u0169\u0173\u0179\u0180"+ - "\u0185\u0189\u018e\u0192\u0197\u019a\u019e\u01a0\u01a8\u01b4\u01bb\u01c0"+ - "\u01c5\u01c8\u01cd\u01d8\u01da\u01dd\u01e6\u01ec\u01f6\u01fc\u0202\u0208"+ - "\u020c\u0213\u0219\u021e\u0225\u022f\u0235\u023a\u0245\u024a\u0252\u025a"+ - "\u0260\u0265\u026a\u027c\u0281\u0286\u028e\u0296\u029c\u02a1\u02a6\u02b7"+ - "\u02bb\u02c0\u02ce\u02d3\u02db\u02e3\u02eb\u02f3\u02f8\u031b\u032b\u033f"+ - "\u0344\u0349\u0352\u0358\u035c\u0361\u036a\u036f\u03a5\u03ae\u03b3\u03b8"+ - "\u03bd\u03c4\u03cb\u03d2\u03d5\u03df\u03e5\u03ec\u03f0\u03f8\u03fc"; + "\u0000\u0000\u01a1;\u0001\u0000\u0000\u0000\u01a2\u01a3\u0003\u0016\u000b"+ + "\u0000\u01a3=\u0001\u0000\u0000\u0000\u01a4\u01a5\u0003<\u001e\u0000\u01a5"+ + "\u01a6\u0003J%\u0000\u01a6?\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005"+ + "\u0001\u0000\u0000\u01a8\u01a9\u0003B!\u0000\u01a9\u01aa\u0005\u0002\u0000"+ + "\u0000\u01aaA\u0001\u0000\u0000\u0000\u01ab\u01af\u0003&\u0013\u0000\u01ac"+ + "\u01ae\u0003B!\u0000\u01ad\u01ac\u0001\u0000\u0000\u0000\u01ae\u01b1\u0001"+ + "\u0000\u0000\u0000\u01af\u01ad\u0001\u0000\u0000\u0000\u01af\u01b0\u0001"+ + "\u0000\u0000\u0000\u01b0\u01d4\u0001\u0000\u0000\u0000\u01b1\u01af\u0001"+ + "\u0000\u0000\u0000\u01b2\u01b3\u0005\u001f\u0000\u0000\u01b3\u01d4\u0003"+ + "D\"\u0000\u01b4\u01b6\u0005\u0013\u0000\u0000\u01b5\u01b7\u0003\"\u0011"+ + "\u0000\u01b6\u01b5\u0001\u0000\u0000\u0000\u01b6\u01b7\u0001\u0000\u0000"+ + "\u0000\u01b7\u01b8\u0001\u0000\u0000\u0000\u01b8\u01d4\u0003>\u001f\u0000"+ + "\u01b9\u01bb\u0005\u0014\u0000\u0000\u01ba\u01bc\u0003\"\u0011\u0000\u01bb"+ + "\u01ba\u0001\u0000\u0000\u0000\u01bb\u01bc\u0001\u0000\u0000\u0000\u01bc"+ + "\u01bd\u0001\u0000\u0000\u0000\u01bd\u01d4\u0003>\u001f\u0000\u01be\u01c0"+ + "\u0005\u001a\u0000\u0000\u01bf\u01c1\u0003\"\u0011\u0000\u01c0\u01bf\u0001"+ + "\u0000\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000\u01c1\u01c2\u0001"+ + "\u0000\u0000\u0000\u01c2\u01c6\u0003<\u001e\u0000\u01c3\u01c5\u0003@ "+ + "\u0000\u01c4\u01c3\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000"+ + "\u0000\u01c6\u01c4\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000"+ + "\u0000\u01c7\u01c9\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000"+ + "\u0000\u01c9\u01ca\u0005\u0001\u0000\u0000\u01ca\u01cb\u0005\u001b\u0000"+ + "\u0000\u01cb\u01d1\u0003J%\u0000\u01cc\u01cd\u0005\u0001\u0000\u0000\u01cd"+ + "\u01ce\u0005\u001c\u0000\u0000\u01ce\u01cf\u0003J%\u0000\u01cf\u01d0\u0005"+ + "\u0002\u0000\u0000\u01d0\u01d2\u0001\u0000\u0000\u0000\u01d1\u01cc\u0001"+ + "\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000\u01d2\u01d4\u0001"+ + "\u0000\u0000\u0000\u01d3\u01ab\u0001\u0000\u0000\u0000\u01d3\u01b2\u0001"+ + "\u0000\u0000\u0000\u01d3\u01b4\u0001\u0000\u0000\u0000\u01d3\u01b9\u0001"+ + "\u0000\u0000\u0000\u01d3\u01be\u0001\u0000\u0000\u0000\u01d4C\u0001\u0000"+ + "\u0000\u0000\u01d5\u01d7\u0003\u001c\u000e\u0000\u01d6\u01d5\u0001\u0000"+ + "\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7\u01d8\u0001\u0000"+ + "\u0000\u0000\u01d8\u01d9\u0003F#\u0000\u01d9E\u0001\u0000\u0000\u0000"+ + "\u01da\u01db\u0005\u0001\u0000\u0000\u01db\u01df\u0005t\u0000\u0000\u01dc"+ + "\u01de\u0003\n\u0005\u0000\u01dd\u01dc\u0001\u0000\u0000\u0000\u01de\u01e1"+ + "\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df\u01e0"+ + "\u0001\u0000\u0000\u0000\u01e0\u01e2\u0001\u0000\u0000\u0000\u01e1\u01df"+ + "\u0001\u0000\u0000\u0000\u01e2\u01e4\u0005\u0002\u0000\u0000\u01e3\u01da"+ + "\u0001\u0000\u0000\u0000\u01e4\u01e7\u0001\u0000\u0000\u0000\u01e5\u01e3"+ + "\u0001\u0000\u0000\u0000\u01e5\u01e6\u0001\u0000\u0000\u0000\u01e6\u01e8"+ + "\u0001\u0000\u0000\u0000\u01e7\u01e5\u0001\u0000\u0000\u0000\u01e8\u01e9"+ + "\u0003H$\u0000\u01e9G\u0001\u0000\u0000\u0000\u01ea\u01eb\u0005\u0001"+ + "\u0000\u0000\u01eb\u01ef\u0005u\u0000\u0000\u01ec\u01ee\u0003\n\u0005"+ + "\u0000\u01ed\u01ec\u0001\u0000\u0000\u0000\u01ee\u01f1\u0001\u0000\u0000"+ + "\u0000\u01ef\u01ed\u0001\u0000\u0000\u0000\u01ef\u01f0\u0001\u0000\u0000"+ + "\u0000\u01f0\u01f2\u0001\u0000\u0000\u0000\u01f1\u01ef\u0001\u0000\u0000"+ + "\u0000\u01f2\u01f4\u0005\u0002\u0000\u0000\u01f3\u01ea\u0001\u0000\u0000"+ + "\u0000\u01f4\u01f7\u0001\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000"+ + "\u0000\u01f5\u01f6\u0001\u0000\u0000\u0000\u01f6\u01fb\u0001\u0000\u0000"+ + "\u0000\u01f7\u01f5\u0001\u0000\u0000\u0000\u01f8\u01fa\u0003B!\u0000\u01f9"+ + "\u01f8\u0001\u0000\u0000\u0000\u01fa\u01fd\u0001\u0000\u0000\u0000\u01fb"+ + "\u01f9\u0001\u0000\u0000\u0000\u01fb\u01fc\u0001\u0000\u0000\u0000\u01fc"+ + "I\u0001\u0000\u0000\u0000\u01fd\u01fb\u0001\u0000\u0000\u0000\u01fe\u0200"+ + "\u0003$\u0012\u0000\u01ff\u01fe\u0001\u0000\u0000\u0000\u0200\u0203\u0001"+ + "\u0000\u0000\u0000\u0201\u01ff\u0001\u0000\u0000\u0000\u0201\u0202\u0001"+ + "\u0000\u0000\u0000\u0202\u0205\u0001\u0000\u0000\u0000\u0203\u0201\u0001"+ + "\u0000\u0000\u0000\u0204\u0206\u00032\u0019\u0000\u0205\u0204\u0001\u0000"+ + "\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206K\u0001\u0000\u0000"+ + "\u0000\u0207\u0208\u0003J%\u0000\u0208M\u0001\u0000\u0000\u0000\u0209"+ + "\u020a\u0005\u0001\u0000\u0000\u020a\u020c\u0005q\u0000\u0000\u020b\u020d"+ + "\u0003\"\u0011\u0000\u020c\u020b\u0001\u0000\u0000\u0000\u020c\u020d\u0001"+ + "\u0000\u0000\u0000\u020d\u020e\u0001\u0000\u0000\u0000\u020e\u020f\u0003"+ + "P(\u0000\u020f\u0210\u0005\u0002\u0000\u0000\u0210O\u0001\u0000\u0000"+ + "\u0000\u0211\u0213\u0003\u001c\u000e\u0000\u0212\u0211\u0001\u0000\u0000"+ + "\u0000\u0212\u0213\u0001\u0000\u0000\u0000\u0213\u0214\u0001\u0000\u0000"+ + "\u0000\u0214\u021f\u0003R)\u0000\u0215\u0217\u0003l6\u0000\u0216\u0218"+ + "\u0003\u001c\u000e\u0000\u0217\u0216\u0001\u0000\u0000\u0000\u0217\u0218"+ + "\u0001\u0000\u0000\u0000\u0218\u0219\u0001\u0000\u0000\u0000\u0219\u021a"+ + "\u0003\u0016\u000b\u0000\u021a\u021f\u0001\u0000\u0000\u0000\u021b\u021c"+ + "\u0003r9\u0000\u021c\u021d\u0003P(\u0000\u021d\u021f\u0001\u0000\u0000"+ + "\u0000\u021e\u0212\u0001\u0000\u0000\u0000\u021e\u0215\u0001\u0000\u0000"+ + "\u0000\u021e\u021b\u0001\u0000\u0000\u0000\u021fQ\u0001\u0000\u0000\u0000"+ + "\u0220\u0221\u0003\u0016\u000b\u0000\u0221\u0222\u0003T*\u0000\u0222S"+ + "\u0001\u0000\u0000\u0000\u0223\u0224\u0005\u0001\u0000\u0000\u0224\u022e"+ + "\u0005v\u0000\u0000\u0225\u0227\u0003\n\u0005\u0000\u0226\u0225\u0001"+ + "\u0000\u0000\u0000\u0227\u022a\u0001\u0000\u0000\u0000\u0228\u0226\u0001"+ + "\u0000\u0000\u0000\u0228\u0229\u0001\u0000\u0000\u0000\u0229\u022f\u0001"+ + "\u0000\u0000\u0000\u022a\u0228\u0001\u0000\u0000\u0000\u022b\u022c\u0003"+ + "\"\u0011\u0000\u022c\u022d\u0003\n\u0005\u0000\u022d\u022f\u0001\u0000"+ + "\u0000\u0000\u022e\u0228\u0001\u0000\u0000\u0000\u022e\u022b\u0001\u0000"+ + "\u0000\u0000\u022f\u0230\u0001\u0000\u0000\u0000\u0230\u0232\u0005\u0002"+ + "\u0000\u0000\u0231\u0223\u0001\u0000\u0000\u0000\u0232\u0235\u0001\u0000"+ + "\u0000\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000"+ + "\u0000\u0000\u0234\u0236\u0001\u0000\u0000\u0000\u0235\u0233\u0001\u0000"+ + "\u0000\u0000\u0236\u0237\u0003J%\u0000\u0237U\u0001\u0000\u0000\u0000"+ + "\u0238\u0239\u0005\u0001\u0000\u0000\u0239\u023a\u0005|\u0000\u0000\u023a"+ + "\u023b\u0003L&\u0000\u023b\u023c\u0005\u0002\u0000\u0000\u023c\u023f\u0001"+ + "\u0000\u0000\u0000\u023d\u023f\u0003B!\u0000\u023e\u0238\u0001\u0000\u0000"+ + "\u0000\u023e\u023d\u0001\u0000\u0000\u0000\u023fW\u0001\u0000\u0000\u0000"+ + "\u0240\u0241\u0005\u0001\u0000\u0000\u0241\u0243\u0005z\u0000\u0000\u0242"+ + "\u0244\u0003 \u0010\u0000\u0243\u0242\u0001\u0000\u0000\u0000\u0243\u0244"+ + "\u0001\u0000\u0000\u0000\u0244\u0245\u0001\u0000\u0000\u0000\u0245\u0246"+ + "\u0005\u0001\u0000\u0000\u0246\u0247\u0003$\u0012\u0000\u0247\u024b\u0005"+ + "\u0002\u0000\u0000\u0248\u024a\u0003 \u0010\u0000\u0249\u0248\u0001\u0000"+ + "\u0000\u0000\u024a\u024d\u0001\u0000\u0000\u0000\u024b\u0249\u0001\u0000"+ + "\u0000\u0000\u024b\u024c\u0001\u0000\u0000\u0000\u024c\u024e\u0001\u0000"+ + "\u0000\u0000\u024d\u024b\u0001\u0000\u0000\u0000\u024e\u024f\u0005\u0002"+ + "\u0000\u0000\u024f\u025f\u0001\u0000\u0000\u0000\u0250\u0251\u0005\u0001"+ + "\u0000\u0000\u0251\u0253\u0005z\u0000\u0000\u0252\u0254\u0003 \u0010\u0000"+ + "\u0253\u0252\u0001\u0000\u0000\u0000\u0253\u0254\u0001\u0000\u0000\u0000"+ + "\u0254\u0255\u0001\u0000\u0000\u0000\u0255\u0259\u0003V+\u0000\u0256\u0258"+ + "\u0003 \u0010\u0000\u0257\u0256\u0001\u0000\u0000\u0000\u0258\u025b\u0001"+ + "\u0000\u0000\u0000\u0259\u0257\u0001\u0000\u0000\u0000\u0259\u025a\u0001"+ + "\u0000\u0000\u0000\u025a\u025c\u0001\u0000\u0000\u0000\u025b\u0259\u0001"+ + "\u0000\u0000\u0000\u025c\u025d\u0005\u0002\u0000\u0000\u025d\u025f\u0001"+ + "\u0000\u0000\u0000\u025e\u0240\u0001\u0000\u0000\u0000\u025e\u0250\u0001"+ + "\u0000\u0000\u0000\u025fY\u0001\u0000\u0000\u0000\u0260\u0261\u0005\u0001"+ + "\u0000\u0000\u0261\u0263\u0005x\u0000\u0000\u0262\u0264\u0003\"\u0011"+ + "\u0000\u0263\u0262\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000"+ + "\u0000\u0264\u0265\u0001\u0000\u0000\u0000\u0265\u0266\u0003\\.\u0000"+ + "\u0266\u0267\u0005\u0002\u0000\u0000\u0267[\u0001\u0000\u0000\u0000\u0268"+ + "\u027b\u0003\u0018\f\u0000\u0269\u026a\u0003l6\u0000\u026a\u026b\u0003"+ + "\u0018\f\u0000\u026b\u027b\u0001\u0000\u0000\u0000\u026c\u026d\u0003r"+ + "9\u0000\u026d\u026e\u0003\\.\u0000\u026e\u027b\u0001\u0000\u0000\u0000"+ + "\u026f\u0270\u0003\u0006\u0003\u0000\u0270\u0271\u0005\u0001\u0000\u0000"+ + "\u0271\u0275\u0005z\u0000\u0000\u0272\u0274\u0003 \u0010\u0000\u0273\u0272"+ + "\u0001\u0000\u0000\u0000\u0274\u0277\u0001\u0000\u0000\u0000\u0275\u0273"+ + "\u0001\u0000\u0000\u0000\u0275\u0276\u0001\u0000\u0000\u0000\u0276\u0278"+ + "\u0001\u0000\u0000\u0000\u0277\u0275\u0001\u0000\u0000\u0000\u0278\u0279"+ + "\u0005\u0002\u0000\u0000\u0279\u027b\u0001\u0000\u0000\u0000\u027a\u0268"+ + "\u0001\u0000\u0000\u0000\u027a\u0269\u0001\u0000\u0000\u0000\u027a\u026c"+ + "\u0001\u0000\u0000\u0000\u027a\u026f\u0001\u0000\u0000\u0000\u027b]\u0001"+ + "\u0000\u0000\u0000\u027c\u027d\u0005\u0001\u0000\u0000\u027d\u027f\u0005"+ + "{\u0000\u0000\u027e\u0280\u0003 \u0010\u0000\u027f\u027e\u0001\u0000\u0000"+ + "\u0000\u027f\u0280\u0001\u0000\u0000\u0000\u0280\u0281\u0001\u0000\u0000"+ + "\u0000\u0281\u0282\u0005\u0001\u0000\u0000\u0282\u0283\u0003$\u0012\u0000"+ + "\u0283\u0287\u0005\u0002\u0000\u0000\u0284\u0286\u0005\u0006\u0000\u0000"+ + "\u0285\u0284\u0001\u0000\u0000\u0000\u0286\u0289\u0001\u0000\u0000\u0000"+ + "\u0287\u0285\u0001\u0000\u0000\u0000\u0287\u0288\u0001\u0000\u0000\u0000"+ + "\u0288\u028a\u0001\u0000\u0000\u0000\u0289\u0287\u0001\u0000\u0000\u0000"+ + "\u028a\u028b\u0005\u0002\u0000\u0000\u028b\u029b\u0001\u0000\u0000\u0000"+ + "\u028c\u028d\u0005\u0001\u0000\u0000\u028d\u028f\u0005{\u0000\u0000\u028e"+ + "\u0290\u0003 \u0010\u0000\u028f\u028e\u0001\u0000\u0000\u0000\u028f\u0290"+ + "\u0001\u0000\u0000\u0000\u0290\u0291\u0001\u0000\u0000\u0000\u0291\u0295"+ + "\u0003V+\u0000\u0292\u0294\u0005\u0006\u0000\u0000\u0293\u0292\u0001\u0000"+ + "\u0000\u0000\u0294\u0297\u0001\u0000\u0000\u0000\u0295\u0293\u0001\u0000"+ + "\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296\u0298\u0001\u0000"+ + "\u0000\u0000\u0297\u0295\u0001\u0000\u0000\u0000\u0298\u0299\u0005\u0002"+ + "\u0000\u0000\u0299\u029b\u0001\u0000\u0000\u0000\u029a\u027c\u0001\u0000"+ + "\u0000\u0000\u029a\u028c\u0001\u0000\u0000\u0000\u029b_\u0001\u0000\u0000"+ + "\u0000\u029c\u029d\u0005\u0001\u0000\u0000\u029d\u029f\u0005y\u0000\u0000"+ + "\u029e\u02a0\u0003\"\u0011\u0000\u029f\u029e\u0001\u0000\u0000\u0000\u029f"+ + "\u02a0\u0001\u0000\u0000\u0000\u02a0\u02a1\u0001\u0000\u0000\u0000\u02a1"+ + "\u02a2\u0003b1\u0000\u02a2\u02a3\u0005\u0002\u0000\u0000\u02a3a\u0001"+ + "\u0000\u0000\u0000\u02a4\u02b5\u0003\u001a\r\u0000\u02a5\u02a6\u0003l"+ + "6\u0000\u02a6\u02a7\u0003\u001a\r\u0000\u02a7\u02b5\u0001\u0000\u0000"+ + "\u0000\u02a8\u02a9\u0003r9\u0000\u02a9\u02aa\u0003b1\u0000\u02aa\u02b5"+ + "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0005\u0001\u0000\u0000\u02ac\u02b0"+ + "\u0005{\u0000\u0000\u02ad\u02af\u0005\u0006\u0000\u0000\u02ae\u02ad\u0001"+ + "\u0000\u0000\u0000\u02af\u02b2\u0001\u0000\u0000\u0000\u02b0\u02ae\u0001"+ + "\u0000\u0000\u0000\u02b0\u02b1\u0001\u0000\u0000\u0000\u02b1\u02b3\u0001"+ + "\u0000\u0000\u0000\u02b2\u02b0\u0001\u0000\u0000\u0000\u02b3\u02b5\u0005"+ + "\u0002\u0000\u0000\u02b4\u02a4\u0001\u0000\u0000\u0000\u02b4\u02a5\u0001"+ + "\u0000\u0000\u0000\u02b4\u02a8\u0001\u0000\u0000\u0000\u02b4\u02ab\u0001"+ + "\u0000\u0000\u0000\u02b5c\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005\u0001"+ + "\u0000\u0000\u02b7\u02b9\u0005w\u0000\u0000\u02b8\u02ba\u0003\"\u0011"+ + "\u0000\u02b9\u02b8\u0001\u0000\u0000\u0000\u02b9\u02ba\u0001\u0000\u0000"+ + "\u0000\u02ba\u02bb\u0001\u0000\u0000\u0000\u02bb\u02bc\u0003f3\u0000\u02bc"+ + "\u02bd\u0005\u0002\u0000\u0000\u02bde\u0001\u0000\u0000\u0000\u02be\u02bf"+ + "\u0003\u000e\u0007\u0000\u02bf\u02c0\u0003L&\u0000\u02c0\u02c8\u0001\u0000"+ + "\u0000\u0000\u02c1\u02c2\u0003l6\u0000\u02c2\u02c3\u0003\u000e\u0007\u0000"+ + "\u02c3\u02c8\u0001\u0000\u0000\u0000\u02c4\u02c5\u0003r9\u0000\u02c5\u02c6"+ + "\u0003f3\u0000\u02c6\u02c8\u0001\u0000\u0000\u0000\u02c7\u02be\u0001\u0000"+ + "\u0000\u0000\u02c7\u02c1\u0001\u0000\u0000\u0000\u02c7\u02c4\u0001\u0000"+ + "\u0000\u0000\u02c8g\u0001\u0000\u0000\u0000\u02c9\u02ca\u0005\u0001\u0000"+ + "\u0000\u02ca\u02cc\u0005q\u0000\u0000\u02cb\u02cd\u0003\"\u0011\u0000"+ + "\u02cc\u02cb\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000"+ + "\u02cd\u02ce\u0001\u0000\u0000\u0000\u02ce\u02cf\u0003\u001c\u000e\u0000"+ + "\u02cf\u02d0\u0005\u0002\u0000\u0000\u02d0\u02f2\u0001\u0000\u0000\u0000"+ + "\u02d1\u02d2\u0005\u0001\u0000\u0000\u02d2\u02d4\u0005q\u0000\u0000\u02d3"+ + "\u02d5\u0003\"\u0011\u0000\u02d4\u02d3\u0001\u0000\u0000\u0000\u02d4\u02d5"+ + "\u0001\u0000\u0000\u0000\u02d5\u02d6\u0001\u0000\u0000\u0000\u02d6\u02d7"+ + "\u0003\u0016\u000b\u0000\u02d7\u02d8\u0005\u0002\u0000\u0000\u02d8\u02f2"+ + "\u0001\u0000\u0000\u0000\u02d9\u02da\u0005\u0001\u0000\u0000\u02da\u02dc"+ + "\u0005x\u0000\u0000\u02db\u02dd\u0003\"\u0011\u0000\u02dc\u02db\u0001"+ + "\u0000\u0000\u0000\u02dc\u02dd\u0001\u0000\u0000\u0000\u02dd\u02de\u0001"+ + "\u0000\u0000\u0000\u02de\u02df\u0003\u0018\f\u0000\u02df\u02e0\u0005\u0002"+ + "\u0000\u0000\u02e0\u02f2\u0001\u0000\u0000\u0000\u02e1\u02e2\u0005\u0001"+ + "\u0000\u0000\u02e2\u02e4\u0005y\u0000\u0000\u02e3\u02e5\u0003\"\u0011"+ + "\u0000\u02e4\u02e3\u0001\u0000\u0000\u0000\u02e4\u02e5\u0001\u0000\u0000"+ + "\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7\u0003\u001a\r\u0000"+ + "\u02e7\u02e8\u0005\u0002\u0000\u0000\u02e8\u02f2\u0001\u0000\u0000\u0000"+ + "\u02e9\u02ea\u0005\u0001\u0000\u0000\u02ea\u02ec\u0005w\u0000\u0000\u02eb"+ + "\u02ed\u0003\"\u0011\u0000\u02ec\u02eb\u0001\u0000\u0000\u0000\u02ec\u02ed"+ + "\u0001\u0000\u0000\u0000\u02ed\u02ee\u0001\u0000\u0000\u0000\u02ee\u02ef"+ + "\u0003\u000e\u0007\u0000\u02ef\u02f0\u0005\u0002\u0000\u0000\u02f0\u02f2"+ + "\u0001\u0000\u0000\u0000\u02f1\u02c9\u0001\u0000\u0000\u0000\u02f1\u02d1"+ + "\u0001\u0000\u0000\u0000\u02f1\u02d9\u0001\u0000\u0000\u0000\u02f1\u02e1"+ + "\u0001\u0000\u0000\u0000\u02f1\u02e9\u0001\u0000\u0000\u0000\u02f2i\u0001"+ + "\u0000\u0000\u0000\u02f3\u02f4\u0005\u0001\u0000\u0000\u02f4\u02f5\u0005"+ + "}\u0000\u0000\u02f5\u02f6\u0003\u0002\u0001\u0000\u02f6\u02f7\u0003\u0002"+ + "\u0001\u0000\u02f7\u02f8\u0003h4\u0000\u02f8\u02f9\u0005\u0002\u0000\u0000"+ + "\u02f9k\u0001\u0000\u0000\u0000\u02fa\u02fb\u0005\u0001\u0000\u0000\u02fb"+ + "\u02fc\u0005}\u0000\u0000\u02fc\u02fd\u0003\u0002\u0001\u0000\u02fd\u02fe"+ + "\u0003\u0002\u0001\u0000\u02fe\u02ff\u0005\u0002\u0000\u0000\u02ffm\u0001"+ + "\u0000\u0000\u0000\u0300\u0301\u0005\u0001\u0000\u0000\u0301\u0302\u0005"+ + "q\u0000\u0000\u0302\u0303\u0003 \u0010\u0000\u0303\u0304\u0005\u0002\u0000"+ + "\u0000\u0304\u0315\u0001\u0000\u0000\u0000\u0305\u0306\u0005\u0001\u0000"+ + "\u0000\u0306\u0307\u0005x\u0000\u0000\u0307\u0308\u0003 \u0010\u0000\u0308"+ + "\u0309\u0005\u0002\u0000\u0000\u0309\u0315\u0001\u0000\u0000\u0000\u030a"+ + "\u030b\u0005\u0001\u0000\u0000\u030b\u030c\u0005y\u0000\u0000\u030c\u030d"+ + "\u0003 \u0010\u0000\u030d\u030e\u0005\u0002\u0000\u0000\u030e\u0315\u0001"+ + "\u0000\u0000\u0000\u030f\u0310\u0005\u0001\u0000\u0000\u0310\u0311\u0005"+ + "w\u0000\u0000\u0311\u0312\u0003 \u0010\u0000\u0312\u0313\u0005\u0002\u0000"+ + "\u0000\u0313\u0315\u0001\u0000\u0000\u0000\u0314\u0300\u0001\u0000\u0000"+ + "\u0000\u0314\u0305\u0001\u0000\u0000\u0000\u0314\u030a\u0001\u0000\u0000"+ + "\u0000\u0314\u030f\u0001\u0000\u0000\u0000\u0315o\u0001\u0000\u0000\u0000"+ + "\u0316\u0317\u0005\u0001\u0000\u0000\u0317\u0318\u0005~\u0000\u0000\u0318"+ + "\u0319\u0003\u0002\u0001\u0000\u0319\u031a\u0003n7\u0000\u031a\u031b\u0005"+ + "\u0002\u0000\u0000\u031bq\u0001\u0000\u0000\u0000\u031c\u031d\u0005\u0001"+ + "\u0000\u0000\u031d\u031e\u0005~\u0000\u0000\u031e\u031f\u0003\u0002\u0001"+ + "\u0000\u031f\u0320\u0005\u0002\u0000\u0000\u0320s\u0001\u0000\u0000\u0000"+ + "\u0321\u0322\u0005\u0001\u0000\u0000\u0322\u0324\u0005p\u0000\u0000\u0323"+ + "\u0325\u0003\"\u0011\u0000\u0324\u0323\u0001\u0000\u0000\u0000\u0324\u0325"+ + "\u0001\u0000\u0000\u0000\u0325\u0326\u0001\u0000\u0000\u0000\u0326\u0327"+ + "\u0003\u0010\b\u0000\u0327\u0328\u0005\u0002\u0000\u0000\u0328u\u0001"+ + "\u0000\u0000\u0000\u0329\u032a\u0005\u0001\u0000\u0000\u032a\u032b\u0005"+ + "s\u0000\u0000\u032b\u032c\u0003 \u0010\u0000\u032c\u032d\u0005\u0002\u0000"+ + "\u0000\u032dw\u0001\u0000\u0000\u0000\u032e\u0339\u0003t:\u0000\u032f"+ + "\u0339\u0003d2\u0000\u0330\u0339\u0003Z-\u0000\u0331\u0339\u0003`0\u0000"+ + "\u0332\u0339\u0003N\'\u0000\u0333\u0339\u0003X,\u0000\u0334\u0339\u0003"+ + "^/\u0000\u0335\u0339\u0003v;\u0000\u0336\u0339\u0003j5\u0000\u0337\u0339"+ + "\u0003p8\u0000\u0338\u032e\u0001\u0000\u0000\u0000\u0338\u032f\u0001\u0000"+ + "\u0000\u0000\u0338\u0330\u0001\u0000\u0000\u0000\u0338\u0331\u0001\u0000"+ + "\u0000\u0000\u0338\u0332\u0001\u0000\u0000\u0000\u0338\u0333\u0001\u0000"+ + "\u0000\u0000\u0338\u0334\u0001\u0000\u0000\u0000\u0338\u0335\u0001\u0000"+ + "\u0000\u0000\u0338\u0336\u0001\u0000\u0000\u0000\u0338\u0337\u0001\u0000"+ + "\u0000\u0000\u0339y\u0001\u0000\u0000\u0000\u033a\u033b\u0005\u0001\u0000"+ + "\u0000\u033b\u033d\u0005\u007f\u0000\u0000\u033c\u033e\u0005\u0090\u0000"+ + "\u0000\u033d\u033c\u0001\u0000\u0000\u0000\u033d\u033e\u0001\u0000\u0000"+ + "\u0000\u033e\u0342\u0001\u0000\u0000\u0000\u033f\u0341\u0003x<\u0000\u0340"+ + "\u033f\u0001\u0000\u0000\u0000\u0341\u0344\u0001\u0000\u0000\u0000\u0342"+ + "\u0340\u0001\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343"+ + "\u0345\u0001\u0000\u0000\u0000\u0344\u0342\u0001\u0000\u0000\u0000\u0345"+ + "\u0346\u0005\u0002\u0000\u0000\u0346{\u0001\u0000\u0000\u0000\u0347\u0356"+ + "\u0003z=\u0000\u0348\u0349\u0005\u0001\u0000\u0000\u0349\u034b\u0005\u007f"+ + "\u0000\u0000\u034a\u034c\u0005\u0090\u0000\u0000\u034b\u034a\u0001\u0000"+ + "\u0000\u0000\u034b\u034c\u0001\u0000\u0000\u0000\u034c\u034d\u0001\u0000"+ + "\u0000\u0000\u034d\u0351\u0007\u0005\u0000\u0000\u034e\u0350\u0005\u0006"+ + "\u0000\u0000\u034f\u034e\u0001\u0000\u0000\u0000\u0350\u0353\u0001\u0000"+ + "\u0000\u0000\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0352\u0001\u0000"+ + "\u0000\u0000\u0352\u0354\u0001\u0000\u0000\u0000\u0353\u0351\u0001\u0000"+ + "\u0000\u0000\u0354\u0356\u0005\u0002\u0000\u0000\u0355\u0347\u0001\u0000"+ + "\u0000\u0000\u0355\u0348\u0001\u0000\u0000\u0000\u0356}\u0001\u0000\u0000"+ + "\u0000\u0357\u0358\u0005\u0001\u0000\u0000\u0358\u035a\u0005\u0084\u0000"+ + "\u0000\u0359\u035b\u0005\u0090\u0000\u0000\u035a\u0359\u0001\u0000\u0000"+ + "\u0000\u035a\u035b\u0001\u0000\u0000\u0000\u035b\u035c\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0003\u0002\u0001\u0000\u035d\u035e\u0003\u0088D\u0000"+ + "\u035e\u035f\u0005\u0002\u0000\u0000\u035f\u0369\u0001\u0000\u0000\u0000"+ + "\u0360\u0361\u0005\u0001\u0000\u0000\u0361\u0363\u0005\u0085\u0000\u0000"+ + "\u0362\u0364\u0005\u0090\u0000\u0000\u0363\u0362\u0001\u0000\u0000\u0000"+ + "\u0363\u0364\u0001\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000"+ + "\u0365\u0366\u0003\u0002\u0001\u0000\u0366\u0367\u0005\u0002\u0000\u0000"+ + "\u0367\u0369\u0001\u0000\u0000\u0000\u0368\u0357\u0001\u0000\u0000\u0000"+ + "\u0368\u0360\u0001\u0000\u0000\u0000\u0369\u007f\u0001\u0000\u0000\u0000"+ + "\u036a\u036b\u0005\u0001\u0000\u0000\u036b\u036c\u0005\u0086\u0000\u0000"+ + "\u036c\u036d\u0003|>\u0000\u036d\u036e\u0005\u0006\u0000\u0000\u036e\u036f"+ + "\u0005\u0002\u0000\u0000\u036f\u039f\u0001\u0000\u0000\u0000\u0370\u0371"+ + "\u0005\u0001\u0000\u0000\u0371\u0372\u0005\u0087\u0000\u0000\u0372\u0373"+ + "\u0003|>\u0000\u0373\u0374\u0005\u0006\u0000\u0000\u0374\u0375\u0005\u0002"+ + "\u0000\u0000\u0375\u039f\u0001\u0000\u0000\u0000\u0376\u0377\u0005\u0001"+ + "\u0000\u0000\u0377\u0378\u0005\u0088\u0000\u0000\u0378\u0379\u0003|>\u0000"+ + "\u0379\u037a\u0005\u0006\u0000\u0000\u037a\u037b\u0005\u0002\u0000\u0000"+ + "\u037b\u039f\u0001\u0000\u0000\u0000\u037c\u037d\u0005\u0001\u0000\u0000"+ + "\u037d\u037e\u0005\u008c\u0000\u0000\u037e\u037f\u0003|>\u0000\u037f\u0380"+ + "\u0005\u0006\u0000\u0000\u0380\u0381\u0005\u0002\u0000\u0000\u0381\u039f"+ + "\u0001\u0000\u0000\u0000\u0382\u0383\u0005\u0001\u0000\u0000\u0383\u0384"+ + "\u0005\u0089\u0000\u0000\u0384\u0385\u0003~?\u0000\u0385\u0386\u0003\u0088"+ + "D\u0000\u0386\u0387\u0005\u0002\u0000\u0000\u0387\u039f\u0001\u0000\u0000"+ + "\u0000\u0388\u0389\u0005\u0001\u0000\u0000\u0389\u038a\u0005\u008a\u0000"+ + "\u0000\u038a\u038b\u0003~?\u0000\u038b\u038c\u0005\u0002\u0000\u0000\u038c"+ + "\u039f\u0001\u0000\u0000\u0000\u038d\u038e\u0005\u0001\u0000\u0000\u038e"+ + "\u038f\u0005\u008b\u0000\u0000\u038f\u0390\u0003~?\u0000\u0390\u0391\u0005"+ + "\u0002\u0000\u0000\u0391\u039f\u0001\u0000\u0000\u0000\u0392\u0393\u0005"+ + "\u0001\u0000\u0000\u0393\u0394\u0005\u008c\u0000\u0000\u0394\u0395\u0003"+ + "~?\u0000\u0395\u0396\u0005\u0006\u0000\u0000\u0396\u0397\u0005\u0002\u0000"+ + "\u0000\u0397\u039f\u0001\u0000\u0000\u0000\u0398\u0399\u0005\u0001\u0000"+ + "\u0000\u0399\u039a\u0005\u008d\u0000\u0000\u039a\u039b\u0003~?\u0000\u039b"+ + "\u039c\u0005\u0006\u0000\u0000\u039c\u039d\u0005\u0002\u0000\u0000\u039d"+ + "\u039f\u0001\u0000\u0000\u0000\u039e\u036a\u0001\u0000\u0000\u0000\u039e"+ + "\u0370\u0001\u0000\u0000\u0000\u039e\u0376\u0001\u0000\u0000\u0000\u039e"+ + "\u037c\u0001\u0000\u0000\u0000\u039e\u0382\u0001\u0000\u0000\u0000\u039e"+ + "\u0388\u0001\u0000\u0000\u0000\u039e\u038d\u0001\u0000\u0000\u0000\u039e"+ + "\u0392\u0001\u0000\u0000\u0000\u039e\u0398\u0001\u0000\u0000\u0000\u039f"+ + "\u0081\u0001\u0000\u0000\u0000\u03a0\u03ad\u0003~?\u0000\u03a1\u03ad\u0003"+ + "\u0080@\u0000\u03a2\u03ad\u0003|>\u0000\u03a3\u03a4\u0005\u0001\u0000"+ + "\u0000\u03a4\u03a5\u0005\u0083\u0000\u0000\u03a5\u03a7\u0003\u0002\u0001"+ + "\u0000\u03a6\u03a8\u0005\u0090\u0000\u0000\u03a7\u03a6\u0001\u0000\u0000"+ + "\u0000\u03a7\u03a8\u0001\u0000\u0000\u0000\u03a8\u03a9\u0001\u0000\u0000"+ + "\u0000\u03a9\u03aa\u0005\u0002\u0000\u0000\u03aa\u03ad\u0001\u0000\u0000"+ + "\u0000\u03ab\u03ad\u0003\u0084B\u0000\u03ac\u03a0\u0001\u0000\u0000\u0000"+ + "\u03ac\u03a1\u0001\u0000\u0000\u0000\u03ac\u03a2\u0001\u0000\u0000\u0000"+ + "\u03ac\u03a3\u0001\u0000\u0000\u0000\u03ac\u03ab\u0001\u0000\u0000\u0000"+ + "\u03ad\u0083\u0001\u0000\u0000\u0000\u03ae\u03af\u0005\u0001\u0000\u0000"+ + "\u03af\u03b1\u0005\u0082\u0000\u0000\u03b0\u03b2\u0005\u0090\u0000\u0000"+ + "\u03b1\u03b0\u0001\u0000\u0000\u0000\u03b1\u03b2\u0001\u0000\u0000\u0000"+ + "\u03b2\u03b6\u0001\u0000\u0000\u0000\u03b3\u03b5\u0003\u0082A\u0000\u03b4"+ + "\u03b3\u0001\u0000\u0000\u0000\u03b5\u03b8\u0001\u0000\u0000\u0000\u03b6"+ + "\u03b4\u0001\u0000\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7"+ + "\u03b9\u0001\u0000\u0000\u0000\u03b8\u03b6\u0001\u0000\u0000\u0000\u03b9"+ + "\u03cf\u0005\u0002\u0000\u0000\u03ba\u03bb\u0005\u0001\u0000\u0000\u03bb"+ + "\u03bd\u0005\u008e\u0000\u0000\u03bc\u03be\u0005\u0090\u0000\u0000\u03bd"+ + "\u03bc\u0001\u0000\u0000\u0000\u03bd\u03be\u0001\u0000\u0000\u0000\u03be"+ + "\u03bf\u0001\u0000\u0000\u0000\u03bf\u03c0\u0005\u0006\u0000\u0000\u03c0"+ + "\u03cf\u0005\u0002\u0000\u0000\u03c1\u03c2\u0005\u0001\u0000\u0000\u03c2"+ + "\u03c4\u0005\u008f\u0000\u0000\u03c3\u03c5\u0005\u0090\u0000\u0000\u03c4"+ + "\u03c3\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001\u0000\u0000\u0000\u03c5"+ + "\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0005\u0006\u0000\u0000\u03c7"+ + "\u03cf\u0005\u0002\u0000\u0000\u03c8\u03c9\u0005\u0001\u0000\u0000\u03c9"+ + "\u03cb\u0005\u008f\u0000\u0000\u03ca\u03cc\u0005\u0090\u0000\u0000\u03cb"+ + "\u03ca\u0001\u0000\u0000\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000\u03cc"+ + "\u03cd\u0001\u0000\u0000\u0000\u03cd\u03cf\u0005\u0002\u0000\u0000\u03ce"+ + "\u03ae\u0001\u0000\u0000\u0000\u03ce\u03ba\u0001\u0000\u0000\u0000\u03ce"+ + "\u03c1\u0001\u0000\u0000\u0000\u03ce\u03c8\u0001\u0000\u0000\u0000\u03cf"+ + "\u0085\u0001\u0000\u0000\u0000\u03d0\u03d1\u0005\u0001\u0000\u0000\u03d1"+ + "\u03d2\u0005\b\u0000\u0000\u03d2\u03d3\u0003\u001e\u000f\u0000\u03d3\u03d4"+ + "\u0005\u0002\u0000\u0000\u03d4\u0087\u0001\u0000\u0000\u0000\u03d5\u03d7"+ + "\u0003\u0086C\u0000\u03d6\u03d5\u0001\u0000\u0000\u0000\u03d7\u03da\u0001"+ + "\u0000\u0000\u0000\u03d8\u03d6\u0001\u0000\u0000\u0000\u03d8\u03d9\u0001"+ + "\u0000\u0000\u0000\u03d9\u0089\u0001\u0000\u0000\u0000\u03da\u03d8\u0001"+ + "\u0000\u0000\u0000\u03db\u03dd\u0003\u0082A\u0000\u03dc\u03db\u0001\u0000"+ + "\u0000\u0000\u03dd\u03e0\u0001\u0000\u0000\u0000\u03de\u03dc\u0001\u0000"+ + "\u0000\u0000\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e1\u0001\u0000"+ + "\u0000\u0000\u03e0\u03de\u0001\u0000\u0000\u0000\u03e1\u03ea\u0005\u0000"+ + "\u0000\u0001\u03e2\u03e4\u0003x<\u0000\u03e3\u03e2\u0001\u0000\u0000\u0000"+ + "\u03e4\u03e5\u0001\u0000\u0000\u0000\u03e5\u03e3\u0001\u0000\u0000\u0000"+ + "\u03e5\u03e6\u0001\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000"+ + "\u03e7\u03e8\u0005\u0000\u0000\u0001\u03e8\u03ea\u0001\u0000\u0000\u0000"+ + "\u03e9\u03de\u0001\u0000\u0000\u0000\u03e9\u03e3\u0001\u0000\u0000\u0000"+ + "\u03ea\u008b\u0001\u0000\u0000\u0000\u03eb\u03ec\u0003z=\u0000\u03ec\u03ed"+ + "\u0005\u0000\u0000\u0001\u03ed\u03f6\u0001\u0000\u0000\u0000\u03ee\u03f0"+ + "\u0003x<\u0000\u03ef\u03ee\u0001\u0000\u0000\u0000\u03f0\u03f3\u0001\u0000"+ + "\u0000\u0000\u03f1\u03ef\u0001\u0000\u0000\u0000\u03f1\u03f2\u0001\u0000"+ + "\u0000\u0000\u03f2\u03f4\u0001\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000"+ + "\u0000\u0000\u03f4\u03f6\u0005\u0000\u0000\u0001\u03f5\u03eb\u0001\u0000"+ + "\u0000\u0000\u03f5\u03f1\u0001\u0000\u0000\u0000\u03f6\u008d\u0001\u0000"+ + "\u0000\u0000m\u009b\u00a5\u00b1\u00b7\u00bc\u00c4\u00ca\u00d2\u00d8\u00e8"+ + "\u00f6\u0107\u010a\u010e\u0111\u0125\u0132\u0137\u013e\u0147\u014d\u0155"+ + "\u015b\u0163\u0169\u0173\u0179\u0180\u0185\u0189\u018e\u0192\u0197\u019a"+ + "\u019e\u01a0\u01af\u01b6\u01bb\u01c0\u01c6\u01d1\u01d3\u01d6\u01df\u01e5"+ + "\u01ef\u01f5\u01fb\u0201\u0205\u020c\u0212\u0217\u021e\u0228\u022e\u0233"+ + "\u023e\u0243\u024b\u0253\u0259\u025e\u0263\u0275\u027a\u027f\u0287\u028f"+ + "\u0295\u029a\u029f\u02b0\u02b4\u02b9\u02c7\u02cc\u02d4\u02dc\u02e4\u02ec"+ + "\u02f1\u0314\u0324\u0338\u033d\u0342\u034b\u0351\u0355\u035a\u0363\u0368"+ + "\u039e\u03a7\u03ac\u03b1\u03b6\u03bd\u03c4\u03cb\u03ce\u03d8\u03de\u03e5"+ + "\u03e9\u03f1\u03f5"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/scala/wasm/AST.scala b/src/main/scala/wasm/AST.scala index 51149347b..154b9c52a 100644 --- a/src/main/scala/wasm/AST.scala +++ b/src/main/scala/wasm/AST.scala @@ -61,12 +61,18 @@ case object Drop extends Instr case object Alloc extends Instr case object Free extends Instr case class Select(ty: Option[List[ValueType]]) extends Instr -case class Block(ty: Option[ValueType], instrs: List[Instr]) extends Instr -case class IdBlock(id: Int, ty: Option[ValueType], instrs: List[Instr]) extends Instr -case class Loop(ty: Option[ValueType], instrs: List[Instr]) extends Instr -case class IdLoop(id: Int, ty: Option[ValueType], instrs: List[Instr]) extends Instr -case class If(ty: Option[ValueType], thenInstrs: List[Instr], elseInstrs: List[Instr]) extends Instr -case class IdIf(ty: Option[ValueType], thenInstrs: IdBlock, elseInstrs: IdBlock) extends Instr +case class Block(ty: FuncType, instrs: List[Instr]) extends Instr +case class IdBlock(id: Int, ty: FuncType, instrs: List[Instr]) + extends Instr +case class Loop(ty: FuncType, instrs: List[Instr]) extends Instr +case class IdLoop(id: Int, ty: FuncType, instrs: List[Instr]) + extends Instr +case class If(ty: FuncType, + thenInstrs: List[Instr], + elseInstrs: List[Instr]) + extends Instr +case class IdIf(ty: FuncType, thenInstrs: IdBlock, elseInstrs: IdBlock) + extends Instr // FIXME: labelId can be string? case class Br(labelId: Int) extends Instr case class BrIf(labelId: Int) extends Instr diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index 61d5387a6..df6e433cb 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -277,24 +277,27 @@ object Evaluator { eval(rest, stack, frame, kont, trail, ret) case Unreachable => throw Trap() case Block(ty, inner) => - val k: Cont[Ans] = (retStack) => eval(rest, retStack.take(ty.toList.size) ++ stack, frame, kont, trail, ret) - // TODO: block can take inputs too - eval(inner, List(), frame, k, k :: trail, ret + 1) + // TODO: When directly use the retStack, ty is unused. Verify this is correct + val k: Cont[Ans] = (retStack) => eval(rest, retStack, frame, kont, trail, ret) + eval(inner, stack, frame, k, k :: trail, ret+1) case Loop(ty, inner) => // We construct two continuations, one for the break (to the begining of the loop), // and one for fall-through to the next instruction following the syntactic structure // of the program. - val restK: Cont[Ans] = (retStack) => eval(rest, retStack.take(ty.toList.size) ++ stack, frame, kont, trail, ret) - def loop(stack: List[Value]): Ans = { - val k: Cont[Ans] = (retStack) => loop(retStack.take(ty.toList.size)) - eval(inner, stack, frame, restK, k :: trail, ret + 1) + // TODO: When directly use the retStack, ty is unused. Verify this is correct + val restK: Cont[Ans] = (retStack) => eval(rest, retStack, frame, kont, trail, ret) + def loopK(retStack: List[Value]): Ans = { + val k: Cont[Ans] = (retStack) => loopK(retStack) + eval(inner, retStack, frame, restK, k::trail, ret+1) } - loop(List()) + eval(inner, stack, frame, restK, (loopK(_))::trail, ret+1) case If(ty, thn, els) => val I32V(cond) :: newStack = stack val inner = if (cond != 0) thn else els - val k: Cont[Ans] = (retStack) => eval(rest, retStack.take(ty.toList.size) ++ newStack, frame, kont, trail, ret) - eval(inner, List(), frame, k, k :: trail, ret + 1) + // TODO: When directly use the retStack, ty is unused. Verify this is correct + val k: Cont[Ans] = (retStack) => + eval(rest, retStack, frame, kont, trail, ret) + eval(inner, stack, frame, k, k :: trail, ret+1) case Br(label) => trail(label)(stack) case BrIf(label) => diff --git a/src/main/scala/wasm/Parser.scala b/src/main/scala/wasm/Parser.scala index 789107aba..a1283c16f 100644 --- a/src/main/scala/wasm/Parser.scala +++ b/src/main/scala/wasm/Parser.scala @@ -126,7 +126,7 @@ class GSWasmVisitor extends WatParserBaseVisitor[WIR] { FuncType(List(), List(), types) } - override def visitFuncType(ctx: FuncTypeContext): WIR = { + override def visitFuncType(ctx: FuncTypeContext): FuncType = { val FuncType(names, args, _) = visitFuncParamType(ctx.funcParamType()) val FuncType(_, _, rets) = visitFuncResType(ctx.funcResType()) FuncType(names, args, rets) @@ -397,9 +397,7 @@ class GSWasmVisitor extends WatParserBaseVisitor[WIR] { // } override def visitBlock(ctx: BlockContext): WIR = { - val ty = - if (ctx.blockType != null) Some(visitValType(ctx.blockType.valType).asInstanceOf[ValueType]) - else None + val ty = visitFuncType(ctx.blockType().funcType()) val InstrList(instrs) = visit(ctx.instrList) Block(ty, instrs) } @@ -447,9 +445,7 @@ class GSWasmVisitor extends WatParserBaseVisitor[WIR] { case (acc, inst: Instr) => acc ++ List(inst) case (acc, InstrList(instrs)) => acc ++ instrs } - val ty = - if (ctx.blockType != null) Some(visitValType(ctx.blockType.valType).asInstanceOf[ValueType]) - else None + val ty = visitFuncType(ctx.blockType().funcType()) val InstrList(thn) = visit(ctx.instrList(0)) val els = if (ctx.ELSE != null) { val InstrList(elsInstr) = visit(ctx.instrList(1)) diff --git a/src/main/scala/wasm/attic/Eval.scala b/src/main/scala/wasm/attic/Eval.scala index 3145d5854..9ff82a7b1 100644 --- a/src/main/scala/wasm/attic/Eval.scala +++ b/src/main/scala/wasm/attic/Eval.scala @@ -305,15 +305,13 @@ case class Config(var frame: Frame, stackBudget: Int) { case Unreachable => throw new Exception("Unreachable") case Block(blockTy, blockInstrs) => { //val funcType = blockTy.toFuncType(frame.module) - val funcType = FuncType(List(), List(), blockTy.toList) - evalBlock(funcType.out.length, blockInstrs.toList).onContinue { retStack => + evalBlock(blockTy.out.length, blockInstrs.toList).onContinue { retStack => this.eval(retStack ++ stack, instrs.tail) } } case Loop(blockTy, loopInstrs) => { //val funcType = blockTy.toFuncType(frame.module) - val funcType = FuncType(List(), List(), blockTy.toList) - evalBlock(funcType.out.length, loopInstrs.toList).onContinue { retStack => + evalBlock(blockTy.out.length, loopInstrs.toList).onContinue { retStack => this.eval(retStack ++ stack, instrs) // instead of instrs.tail } } @@ -321,8 +319,7 @@ case class Config(var frame: Frame, stackBudget: Int) { case I32V(cond) :: newStack => { val condInstrs = if (cond == 0) elseInstrs else thenInstrs //val funcType = blockTy.toFuncType(frame.module) - val funcType = FuncType(List(), List(), blockTy.toList) - evalBlock(funcType.out.length, condInstrs.toList).onContinue { retStack => + evalBlock(blockTy.out.length, condInstrs.toList).onContinue { retStack => this.eval(retStack ++ newStack, instrs.tail) } } From 1329002ef72d819062dcdae8da4573347586c192 Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Sun, 13 Oct 2024 21:08:26 +0800 Subject: [PATCH 03/15] tweak --- grammar/WatParser.g4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grammar/WatParser.g4 b/grammar/WatParser.g4 index e2a23a816..94e66c6a6 100644 --- a/grammar/WatParser.g4 +++ b/grammar/WatParser.g4 @@ -203,7 +203,7 @@ blockInstr | IF bindVar? block (ELSE bindVar? instrList)? END bindVar? ; -// treat blockType as an alias to function type +// treat blockType as an alias to funcType blockType : funcType ; From f0576380f145ce908844a3a4a70fa28c3bf2d55c Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Sun, 13 Oct 2024 22:20:27 +0800 Subject: [PATCH 04/15] more tests and fix If's evaluation --- benchmarks/wasm/block.wat | 33 +++++++++++++++++++++++++- src/main/scala/wasm/MiniWasm.scala | 2 +- src/test/scala/genwasym/TestEval.scala | 10 +++++++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/benchmarks/wasm/block.wat b/benchmarks/wasm/block.wat index 555dc64cc..daff16ebc 100644 --- a/benchmarks/wasm/block.wat +++ b/benchmarks/wasm/block.wat @@ -8,12 +8,43 @@ end i32.add ) - (func $real_main (result i32) i32.const 1 i32.const 3 i32.const 5 call $test_block ) + ;; Sum from [0, 10] + (func $test_loop_input (result i32) + (local i32) + i32.const 10 + local.set 0 + i32.const 0 + loop (param i32) (result i32) + local.get 0 + i32.add + local.get 0 + i32.const 1 + i32.sub + local.set 0 + i32.const 0 + local.get 0 + i32.ne + br_if 0 + end + ) + (func $test_if_input (result i32) + i32.const 10 + i32.const 5 + i32.const 1 + if (param i32 i32) (result i32 i32) + i32.const 10 + i32.add + else + end + i32.add + ) (export "real_main" (func $real_main)) + (export "test_loop_input" (func $test_loop_input)) + (export "test_if_input" (func $test_if_input)) ) diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index df6e433cb..7370a28a8 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -297,7 +297,7 @@ object Evaluator { // TODO: When directly use the retStack, ty is unused. Verify this is correct val k: Cont[Ans] = (retStack) => eval(rest, retStack, frame, kont, trail, ret) - eval(inner, stack, frame, k, k :: trail, ret+1) + eval(inner, newStack, frame, k, k :: trail, ret+1) case Br(label) => trail(label)(stack) case BrIf(label) => diff --git a/src/test/scala/genwasym/TestEval.scala b/src/test/scala/genwasym/TestEval.scala index 65847088e..9e04385cb 100644 --- a/src/test/scala/genwasym/TestEval.scala +++ b/src/test/scala/genwasym/TestEval.scala @@ -47,7 +47,15 @@ class TestEval extends FunSuite { } } - test("block") { testFile("./benchmarks/wasm/block.wat", Some("$real_main"), Some(9)) } + test("input_block.block") { + testFile("./benchmarks/wasm/block.wat", Some("$real_main"), Some(9)) + } + test("input_block.loop") { + testFile("./benchmarks/wasm/block.wat", Some("$test_loop_input"), Some(55)) + } + test("input_block.if") { + testFile("./benchmarks/wasm/block.wat", Some("$test_if_input"), Some(25)) + } // FIXME: //test("tribonacci-ret") { testFile("./benchmarks/wasm/tribonacci_ret.wat", None, Some(504)) } From 1afc53fe9e84d40f21ca21a6c264f12f6af1eaa4 Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Sun, 13 Oct 2024 22:26:23 +0800 Subject: [PATCH 05/15] resolve some TODO and more consistent naming --- src/main/scala/wasm/MiniWasm.scala | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index 7370a28a8..33dc8b5b0 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -277,27 +277,25 @@ object Evaluator { eval(rest, stack, frame, kont, trail, ret) case Unreachable => throw Trap() case Block(ty, inner) => - // TODO: When directly use the retStack, ty is unused. Verify this is correct - val k: Cont[Ans] = (retStack) => eval(rest, retStack, frame, kont, trail, ret) - eval(inner, stack, frame, k, k :: trail, ret+1) + val restK: Cont[Ans] = (retStack) => + eval(rest, retStack, frame, kont, trail, ret) + eval(inner, stack, frame, restK, restK :: trail, ret+1) case Loop(ty, inner) => // We construct two continuations, one for the break (to the begining of the loop), // and one for fall-through to the next instruction following the syntactic structure // of the program. - // TODO: When directly use the retStack, ty is unused. Verify this is correct val restK: Cont[Ans] = (retStack) => eval(rest, retStack, frame, kont, trail, ret) def loopK(retStack: List[Value]): Ans = { - val k: Cont[Ans] = (retStack) => loopK(retStack) + val k: Cont[Ans] = (retStack) => loopK(retStack) // k is just same as loopK eval(inner, retStack, frame, restK, k::trail, ret+1) } - eval(inner, stack, frame, restK, (loopK(_))::trail, ret+1) + loopK(stack) case If(ty, thn, els) => val I32V(cond) :: newStack = stack val inner = if (cond != 0) thn else els - // TODO: When directly use the retStack, ty is unused. Verify this is correct - val k: Cont[Ans] = (retStack) => + val restK: Cont[Ans] = (retStack) => eval(rest, retStack, frame, kont, trail, ret) - eval(inner, newStack, frame, k, k :: trail, ret+1) + eval(inner, newStack, frame, restK, restK :: trail, ret+1) case Br(label) => trail(label)(stack) case BrIf(label) => From 0a6352691f3d98937ff83809dbe38af358218e6c Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Sun, 13 Oct 2024 22:39:07 +0800 Subject: [PATCH 06/15] block can only use the values that it declared to use --- src/main/scala/wasm/MiniWasm.scala | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index 33dc8b5b0..dc9ccfdf2 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -277,25 +277,30 @@ object Evaluator { eval(rest, stack, frame, kont, trail, ret) case Unreachable => throw Trap() case Block(ty, inner) => + val (inputs, restStack) = stack.splitAt(ty.inps.size) val restK: Cont[Ans] = (retStack) => - eval(rest, retStack, frame, kont, trail, ret) - eval(inner, stack, frame, restK, restK :: trail, ret+1) + eval(rest, retStack ++ restStack, frame, kont, trail, ret) + eval(inner, inputs, frame, restK, restK :: trail, ret + 1) case Loop(ty, inner) => // We construct two continuations, one for the break (to the begining of the loop), // and one for fall-through to the next instruction following the syntactic structure // of the program. - val restK: Cont[Ans] = (retStack) => eval(rest, retStack, frame, kont, trail, ret) + val (inputs, restStack) = stack.splitAt(ty.inps.size) + val restK: Cont[Ans] = (retStack) => eval(rest, retStack ++ restStack, frame, kont, trail, ret) + def loopK(retStack: List[Value]): Ans = { val k: Cont[Ans] = (retStack) => loopK(retStack) // k is just same as loopK - eval(inner, retStack, frame, restK, k::trail, ret+1) + eval(inner, retStack, frame, restK, k :: trail, ret + 1) } - loopK(stack) + + loopK(inputs) case If(ty, thn, els) => val I32V(cond) :: newStack = stack val inner = if (cond != 0) thn else els + val (inputs, restStack) = newStack.splitAt(ty.inps.size) val restK: Cont[Ans] = (retStack) => - eval(rest, retStack, frame, kont, trail, ret) - eval(inner, newStack, frame, restK, restK :: trail, ret+1) + eval(rest, retStack ++ restStack, frame, kont, trail, ret) + eval(inner, inputs, frame, restK, restK :: trail, ret + 1) case Br(label) => trail(label)(stack) case BrIf(label) => From e212788ab8ce80475c57e0dfcda704a5267c019b Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Mon, 14 Oct 2024 20:32:58 +0800 Subject: [PATCH 07/15] fix tidy issues --- benchmarks/wasm/block.wat | 46 +++++++++++++++--------------- src/main/scala/wasm/MiniWasm.scala | 6 ++-- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/benchmarks/wasm/block.wat b/benchmarks/wasm/block.wat index daff16ebc..2d2d7a48f 100644 --- a/benchmarks/wasm/block.wat +++ b/benchmarks/wasm/block.wat @@ -1,37 +1,37 @@ (module (func $test_block (param i32 i32 i32) (result i32) - local.get 0 - local.get 1 - local.get 2 + local.get 0 + local.get 1 + local.get 2 block (param i32 i32 i32) (result i32 i32) i32.add end i32.add ) (func $real_main (result i32) - i32.const 1 - i32.const 3 - i32.const 5 - call $test_block + i32.const 1 + i32.const 3 + i32.const 5 + call $test_block ) ;; Sum from [0, 10] (func $test_loop_input (result i32) - (local i32) - i32.const 10 - local.set 0 - i32.const 0 - loop (param i32) (result i32) - local.get 0 - i32.add - local.get 0 - i32.const 1 - i32.sub - local.set 0 - i32.const 0 - local.get 0 - i32.ne - br_if 0 - end + (local i32) + i32.const 10 + local.set 0 + i32.const 0 + loop (param i32) (result i32) + local.get 0 + i32.add + local.get 0 + i32.const 1 + i32.sub + local.set 0 + i32.const 0 + local.get 0 + i32.ne + br_if 0 + end ) (func $test_if_input (result i32) i32.const 10 diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index dc9ccfdf2..9e4712486 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -288,12 +288,12 @@ object Evaluator { val (inputs, restStack) = stack.splitAt(ty.inps.size) val restK: Cont[Ans] = (retStack) => eval(rest, retStack ++ restStack, frame, kont, trail, ret) - def loopK(retStack: List[Value]): Ans = { - val k: Cont[Ans] = (retStack) => loopK(retStack) // k is just same as loopK + def loop(retStack: List[Value]): Ans = { + val k: Cont[Ans] = (retStack) => loop(retStack) // k is just same as loop eval(inner, retStack, frame, restK, k :: trail, ret + 1) } - loopK(inputs) + loop(inputs) case If(ty, thn, els) => val I32V(cond) :: newStack = stack val inner = if (cond != 0) thn else els From d9804acbe302cf4c3127573228fb447599114565 Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Mon, 14 Oct 2024 21:15:17 +0800 Subject: [PATCH 08/15] truncate redundant values when exiting a block --- benchmarks/wasm/block.wat | 20 ++++++++++++++++++++ src/main/scala/wasm/MiniWasm.scala | 9 +++++---- src/test/scala/genwasym/TestEval.scala | 3 +++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/benchmarks/wasm/block.wat b/benchmarks/wasm/block.wat index 2d2d7a48f..65c08311c 100644 --- a/benchmarks/wasm/block.wat +++ b/benchmarks/wasm/block.wat @@ -44,7 +44,27 @@ end i32.add ) + (func $test_poly_br (result i32) + i32.const -30 + i32.const 0 ;; unused + i32.const 0 ;; unused + i32.const 0 ;; unused + block (param i32 i32 i32) (result i32 i32) + i32.const 0 ;; truncated + i32.const 10000 ;; truncated + i32.const 10 + i32.const 20 + br 0 + i32.add + end + i32.add + i32.add ;; add value -30 and 30 + ;; i32.add + ;; We can't use i32.add instruction here, because the overflowed value has been truncted + ;; when block exited. + ) (export "real_main" (func $real_main)) (export "test_loop_input" (func $test_loop_input)) (export "test_if_input" (func $test_if_input)) + (export "test_poly_br" (func $test_poly_br)) ) diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index 9e4712486..2ba2ef4ae 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -279,18 +279,19 @@ object Evaluator { case Block(ty, inner) => val (inputs, restStack) = stack.splitAt(ty.inps.size) val restK: Cont[Ans] = (retStack) => - eval(rest, retStack ++ restStack, frame, kont, trail, ret) + eval(rest, retStack.take(ty.out.size) ++ restStack, frame, kont, trail, ret) eval(inner, inputs, frame, restK, restK :: trail, ret + 1) case Loop(ty, inner) => // We construct two continuations, one for the break (to the begining of the loop), // and one for fall-through to the next instruction following the syntactic structure // of the program. val (inputs, restStack) = stack.splitAt(ty.inps.size) - val restK: Cont[Ans] = (retStack) => eval(rest, retStack ++ restStack, frame, kont, trail, ret) + val restK: Cont[Ans] = (retStack) => + eval(rest, retStack.take(ty.out.size) ++ restStack, frame, kont, trail, ret) def loop(retStack: List[Value]): Ans = { val k: Cont[Ans] = (retStack) => loop(retStack) // k is just same as loop - eval(inner, retStack, frame, restK, k :: trail, ret + 1) + eval(inner, retStack.take(ty.inps.size), frame, restK, k :: trail, ret + 1) } loop(inputs) @@ -299,7 +300,7 @@ object Evaluator { val inner = if (cond != 0) thn else els val (inputs, restStack) = newStack.splitAt(ty.inps.size) val restK: Cont[Ans] = (retStack) => - eval(rest, retStack ++ restStack, frame, kont, trail, ret) + eval(rest, retStack.take(ty.out.size) ++ restStack, frame, kont, trail, ret) eval(inner, inputs, frame, restK, restK :: trail, ret + 1) case Br(label) => trail(label)(stack) diff --git a/src/test/scala/genwasym/TestEval.scala b/src/test/scala/genwasym/TestEval.scala index 9e04385cb..5474a92ab 100644 --- a/src/test/scala/genwasym/TestEval.scala +++ b/src/test/scala/genwasym/TestEval.scala @@ -56,6 +56,9 @@ class TestEval extends FunSuite { test("input_block.if") { testFile("./benchmarks/wasm/block.wat", Some("$test_if_input"), Some(25)) } + test("input_block.poly_br") { + testFile("./benchmarks/wasm/block.wat", Some("$test_poly_br"), Some(0)) + } // FIXME: //test("tribonacci-ret") { testFile("./benchmarks/wasm/tribonacci_ret.wat", None, Some(504)) } From 6f7cd36e9b5d66ea86233db3921322aa85257a1e Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Tue, 15 Oct 2024 01:04:34 +0800 Subject: [PATCH 09/15] a problematic WIP implementation --- grammar/WatParser.g4 | 5 +- src/main/java/wasm/WatParser.java | 2000 ++++++++++++++-------------- src/main/scala/wasm/AST.scala | 22 +- src/main/scala/wasm/MiniWasm.scala | 17 +- src/main/scala/wasm/Parser.scala | 42 +- 5 files changed, 1087 insertions(+), 999 deletions(-) diff --git a/grammar/WatParser.g4 b/grammar/WatParser.g4 index 94e66c6a6..90df6efe0 100644 --- a/grammar/WatParser.g4 +++ b/grammar/WatParser.g4 @@ -203,9 +203,10 @@ blockInstr | IF bindVar? block (ELSE bindVar? instrList)? END bindVar? ; -// treat blockType as an alias to funcType blockType - : funcType + : (LPAR RESULT valType RPAR)? + | typeUse funcType + | funcType // abbreviation ; block diff --git a/src/main/java/wasm/WatParser.java b/src/main/java/wasm/WatParser.java index 94912d400..2a87b182b 100644 --- a/src/main/java/wasm/WatParser.java +++ b/src/main/java/wasm/WatParser.java @@ -2601,6 +2601,15 @@ public final BlockInstrContext blockInstr() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class BlockTypeContext extends ParserRuleContext { + public TerminalNode LPAR() { return getToken(WatParser.LPAR, 0); } + public TerminalNode RESULT() { return getToken(WatParser.RESULT, 0); } + public ValTypeContext valType() { + return getRuleContext(ValTypeContext.class,0); + } + public TerminalNode RPAR() { return getToken(WatParser.RPAR, 0); } + public TypeUseContext typeUse() { + return getRuleContext(TypeUseContext.class,0); + } public FuncTypeContext funcType() { return getRuleContext(FuncTypeContext.class,0); } @@ -2627,10 +2636,46 @@ public final BlockTypeContext blockType() throws RecognitionException { BlockTypeContext _localctx = new BlockTypeContext(_ctx, getState()); enterRule(_localctx, 60, RULE_blockType); try { - enterOuterAlt(_localctx, 1); - { - setState(418); - funcType(); + setState(429); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(423); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + case 1: + { + setState(418); + match(LPAR); + setState(419); + match(RESULT); + setState(420); + valType(); + setState(421); + match(RPAR); + } + break; + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(425); + typeUse(); + setState(426); + funcType(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(428); + funcType(); + } + break; } } catch (RecognitionException re) { @@ -2677,9 +2722,9 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(420); + setState(431); blockType(); - setState(421); + setState(432); instrList(); } } @@ -2726,11 +2771,11 @@ public final FoldedInstrContext foldedInstr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(423); + setState(434); match(LPAR); - setState(424); + setState(435); expr(); - setState(425); + setState(436); match(RPAR); } } @@ -2816,130 +2861,130 @@ public final ExprContext expr() throws RecognitionException { int _la; try { int _alt; - setState(467); + setState(478); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(427); + setState(438); plainInstr(); - setState(431); + setState(442); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,36,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(428); + setState(439); expr(); } } } - setState(433); + setState(444); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,36,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); } } break; case 2: enterOuterAlt(_localctx, 2); { - setState(434); + setState(445); match(CALL_INDIRECT); - setState(435); + setState(446); callExprType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(436); + setState(447); match(BLOCK); - setState(438); + setState(449); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(437); + setState(448); bindVar(); } break; } - setState(440); + setState(451); block(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(441); + setState(452); match(LOOP); - setState(443); + setState(454); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { case 1: { - setState(442); + setState(453); bindVar(); } break; } - setState(445); + setState(456); block(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(446); + setState(457); match(IF); - setState(448); + setState(459); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(447); + setState(458); bindVar(); } } - setState(450); + setState(461); blockType(); - setState(454); + setState(465); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + _alt = getInterpreter().adaptivePredict(_input,42,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(451); + setState(462); foldedInstr(); } } } - setState(456); + setState(467); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + _alt = getInterpreter().adaptivePredict(_input,42,_ctx); } - setState(457); + setState(468); match(LPAR); - setState(458); + setState(469); match(THEN); - setState(459); + setState(470); instrList(); - setState(465); + setState(476); _errHandler.sync(this); _la = _input.LA(1); if (_la==LPAR) { { - setState(460); + setState(471); match(LPAR); - setState(461); + setState(472); match(ELSE); - setState(462); + setState(473); instrList(); - setState(463); + setState(474); match(RPAR); } } @@ -2992,17 +3037,17 @@ public final CallExprTypeContext callExprType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(470); + setState(481); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(469); + setState(480); typeUse(); } break; } - setState(472); + setState(483); callExprParams(); } } @@ -3067,41 +3112,41 @@ public final CallExprParamsContext callExprParams() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(485); + setState(496); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,45,_ctx); + _alt = getInterpreter().adaptivePredict(_input,47,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(474); + setState(485); match(LPAR); - setState(475); + setState(486); match(PARAM); - setState(479); + setState(490); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3200L) != 0) || _la==V128) { { { - setState(476); + setState(487); valType(); } } - setState(481); + setState(492); _errHandler.sync(this); _la = _input.LA(1); } - setState(482); + setState(493); match(RPAR); } } } - setState(487); + setState(498); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,45,_ctx); + _alt = getInterpreter().adaptivePredict(_input,47,_ctx); } - setState(488); + setState(499); callExprResults(); } } @@ -3169,53 +3214,53 @@ public final CallExprResultsContext callExprResults() throws RecognitionExceptio int _alt; enterOuterAlt(_localctx, 1); { - setState(501); + setState(512); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(490); + setState(501); match(LPAR); - setState(491); + setState(502); match(RESULT); - setState(495); + setState(506); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3200L) != 0) || _la==V128) { { { - setState(492); + setState(503); valType(); } } - setState(497); + setState(508); _errHandler.sync(this); _la = _input.LA(1); } - setState(498); + setState(509); match(RPAR); } } - setState(503); + setState(514); _errHandler.sync(this); _la = _input.LA(1); } - setState(507); + setState(518); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,48,_ctx); + _alt = getInterpreter().adaptivePredict(_input,50,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(504); + setState(515); expr(); } } } - setState(509); + setState(520); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,48,_ctx); + _alt = getInterpreter().adaptivePredict(_input,50,_ctx); } } } @@ -3267,28 +3312,28 @@ public final InstrListContext instrList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(513); + setState(524); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,49,_ctx); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(510); + setState(521); instr(); } } } - setState(515); + setState(526); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,49,_ctx); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); } - setState(517); + setState(528); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(516); + setState(527); callIndirectInstr(); } break; @@ -3336,7 +3381,7 @@ public final ConstExprContext constExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(519); + setState(530); instrList(); } } @@ -3388,23 +3433,23 @@ public final FunctionContext function() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(521); + setState(532); match(LPAR); - setState(522); + setState(533); match(FUNC); - setState(524); + setState(535); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(523); + setState(534); bindVar(); } } - setState(526); + setState(537); funcFields(); - setState(527); + setState(538); match(RPAR); } } @@ -3462,51 +3507,51 @@ public final FuncFieldsContext funcFields() throws RecognitionException { FuncFieldsContext _localctx = new FuncFieldsContext(_ctx, getState()); enterRule(_localctx, 80, RULE_funcFields); try { - setState(542); + setState(553); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(530); + setState(541); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(529); + setState(540); typeUse(); } break; } - setState(532); + setState(543); funcFieldsBody(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(533); + setState(544); inlineImport(); - setState(535); + setState(546); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(534); + setState(545); typeUse(); } break; } - setState(537); + setState(548); funcType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(539); + setState(550); inlineExport(); - setState(540); + setState(551); funcFields(); } break; @@ -3556,9 +3601,9 @@ public final FuncFieldsBodyContext funcFieldsBody() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(544); + setState(555); funcType(); - setState(545); + setState(556); funcBody(); } } @@ -3629,18 +3674,18 @@ public final FuncBodyContext funcBody() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(563); + setState(574); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + _alt = getInterpreter().adaptivePredict(_input,59,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(547); + setState(558); match(LPAR); - setState(548); + setState(559); match(LOCAL); - setState(558); + setState(569); _errHandler.sync(this); switch (_input.LA(1)) { case RPAR: @@ -3649,17 +3694,17 @@ public final FuncBodyContext funcBody() throws RecognitionException { case EXTERNREF: case V128: { - setState(552); + setState(563); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3200L) != 0) || _la==V128) { { { - setState(549); + setState(560); valType(); } } - setState(554); + setState(565); _errHandler.sync(this); _la = _input.LA(1); } @@ -3667,25 +3712,25 @@ public final FuncBodyContext funcBody() throws RecognitionException { break; case VAR: { - setState(555); + setState(566); bindVar(); - setState(556); + setState(567); valType(); } break; default: throw new NoViableAltException(this); } - setState(560); + setState(571); match(RPAR); } } } - setState(565); + setState(576); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + _alt = getInterpreter().adaptivePredict(_input,59,_ctx); } - setState(566); + setState(577); instrList(); } } @@ -3734,19 +3779,19 @@ public final OffsetContext offset() throws RecognitionException { OffsetContext _localctx = new OffsetContext(_ctx, getState()); enterRule(_localctx, 86, RULE_offset); try { - setState(574); + setState(585); _errHandler.sync(this); switch (_input.LA(1)) { case LPAR: enterOuterAlt(_localctx, 1); { - setState(568); + setState(579); match(LPAR); - setState(569); + setState(580); match(OFFSET); - setState(570); + setState(581); constExpr(); - setState(571); + setState(582); match(RPAR); } break; @@ -3785,7 +3830,7 @@ public final OffsetContext offset() throws RecognitionException { case CONVERT: enterOuterAlt(_localctx, 2); { - setState(573); + setState(584); expr(); } break; @@ -3851,84 +3896,84 @@ public final ElemContext elem() throws RecognitionException { enterRule(_localctx, 88, RULE_elem); int _la; try { - setState(606); + setState(617); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(576); + setState(587); match(LPAR); - setState(577); + setState(588); match(ELEM); - setState(579); + setState(590); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAT || _la==VAR) { { - setState(578); + setState(589); idx(); } } - setState(581); + setState(592); match(LPAR); - setState(582); + setState(593); instr(); - setState(583); + setState(594); match(RPAR); - setState(587); + setState(598); _errHandler.sync(this); _la = _input.LA(1); while (_la==NAT || _la==VAR) { { { - setState(584); + setState(595); idx(); } } - setState(589); + setState(600); _errHandler.sync(this); _la = _input.LA(1); } - setState(590); + setState(601); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(592); + setState(603); match(LPAR); - setState(593); + setState(604); match(ELEM); - setState(595); + setState(606); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAT || _la==VAR) { { - setState(594); + setState(605); idx(); } } - setState(597); + setState(608); offset(); - setState(601); + setState(612); _errHandler.sync(this); _la = _input.LA(1); while (_la==NAT || _la==VAR) { { { - setState(598); + setState(609); idx(); } } - setState(603); + setState(614); _errHandler.sync(this); _la = _input.LA(1); } - setState(604); + setState(615); match(RPAR); } break; @@ -3982,23 +4027,23 @@ public final TableContext table() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(608); + setState(619); match(LPAR); - setState(609); + setState(620); match(TABLE); - setState(611); + setState(622); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(610); + setState(621); bindVar(); } } - setState(613); + setState(624); tableField(); - setState(614); + setState(625); match(RPAR); } } @@ -4063,58 +4108,58 @@ public final TableFieldContext tableField() throws RecognitionException { enterRule(_localctx, 92, RULE_tableField); int _la; try { - setState(634); + setState(645); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(616); + setState(627); tableType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(617); + setState(628); inlineImport(); - setState(618); + setState(629); tableType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(620); + setState(631); inlineExport(); - setState(621); + setState(632); tableField(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(623); + setState(634); refType(); - setState(624); + setState(635); match(LPAR); - setState(625); + setState(636); match(ELEM); - setState(629); + setState(640); _errHandler.sync(this); _la = _input.LA(1); while (_la==NAT || _la==VAR) { { { - setState(626); + setState(637); idx(); } } - setState(631); + setState(642); _errHandler.sync(this); _la = _input.LA(1); } - setState(632); + setState(643); match(RPAR); } break; @@ -4179,84 +4224,84 @@ public final DataContext data() throws RecognitionException { enterRule(_localctx, 94, RULE_data); int _la; try { - setState(666); + setState(677); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(636); + setState(647); match(LPAR); - setState(637); + setState(648); match(DATA); - setState(639); + setState(650); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAT || _la==VAR) { { - setState(638); + setState(649); idx(); } } - setState(641); + setState(652); match(LPAR); - setState(642); + setState(653); instr(); - setState(643); + setState(654); match(RPAR); - setState(647); + setState(658); _errHandler.sync(this); _la = _input.LA(1); while (_la==STRING_) { { { - setState(644); + setState(655); match(STRING_); } } - setState(649); + setState(660); _errHandler.sync(this); _la = _input.LA(1); } - setState(650); + setState(661); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(652); + setState(663); match(LPAR); - setState(653); + setState(664); match(DATA); - setState(655); + setState(666); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAT || _la==VAR) { { - setState(654); + setState(665); idx(); } } - setState(657); + setState(668); offset(); - setState(661); + setState(672); _errHandler.sync(this); _la = _input.LA(1); while (_la==STRING_) { { { - setState(658); + setState(669); match(STRING_); } } - setState(663); + setState(674); _errHandler.sync(this); _la = _input.LA(1); } - setState(664); + setState(675); match(RPAR); } break; @@ -4310,23 +4355,23 @@ public final MemoryContext memory() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(668); + setState(679); match(LPAR); - setState(669); + setState(680); match(MEMORY); - setState(671); + setState(682); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(670); + setState(681); bindVar(); } } - setState(673); + setState(684); memoryField(); - setState(674); + setState(685); match(RPAR); } } @@ -4386,56 +4431,56 @@ public final MemoryFieldContext memoryField() throws RecognitionException { enterRule(_localctx, 98, RULE_memoryField); int _la; try { - setState(692); + setState(703); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(676); + setState(687); memoryType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(677); + setState(688); inlineImport(); - setState(678); + setState(689); memoryType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(680); + setState(691); inlineExport(); - setState(681); + setState(692); memoryField(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(683); + setState(694); match(LPAR); - setState(684); + setState(695); match(DATA); - setState(688); + setState(699); _errHandler.sync(this); _la = _input.LA(1); while (_la==STRING_) { { { - setState(685); + setState(696); match(STRING_); } } - setState(690); + setState(701); _errHandler.sync(this); _la = _input.LA(1); } - setState(691); + setState(702); match(RPAR); } break; @@ -4489,23 +4534,23 @@ public final GlobalContext global() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(694); + setState(705); match(LPAR); - setState(695); + setState(706); match(GLOBAL); - setState(697); + setState(708); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(696); + setState(707); bindVar(); } } - setState(699); + setState(710); globalField(); - setState(700); + setState(711); match(RPAR); } } @@ -4560,33 +4605,33 @@ public final GlobalFieldContext globalField() throws RecognitionException { GlobalFieldContext _localctx = new GlobalFieldContext(_ctx, getState()); enterRule(_localctx, 102, RULE_globalField); try { - setState(711); + setState(722); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(702); + setState(713); globalType(); - setState(703); + setState(714); constExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(705); + setState(716); inlineImport(); - setState(706); + setState(717); globalType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(708); + setState(719); inlineExport(); - setState(709); + setState(720); globalField(); } break; @@ -4653,121 +4698,121 @@ public final ImportDescContext importDesc() throws RecognitionException { enterRule(_localctx, 104, RULE_importDesc); int _la; try { - setState(753); + setState(764); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(713); + setState(724); match(LPAR); - setState(714); + setState(725); match(FUNC); - setState(716); + setState(727); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(715); + setState(726); bindVar(); } } - setState(718); + setState(729); typeUse(); - setState(719); + setState(730); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(721); + setState(732); match(LPAR); - setState(722); + setState(733); match(FUNC); - setState(724); + setState(735); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(723); + setState(734); bindVar(); } } - setState(726); + setState(737); funcType(); - setState(727); + setState(738); match(RPAR); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(729); + setState(740); match(LPAR); - setState(730); + setState(741); match(TABLE); - setState(732); + setState(743); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(731); + setState(742); bindVar(); } } - setState(734); + setState(745); tableType(); - setState(735); + setState(746); match(RPAR); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(737); + setState(748); match(LPAR); - setState(738); + setState(749); match(MEMORY); - setState(740); + setState(751); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(739); + setState(750); bindVar(); } } - setState(742); + setState(753); memoryType(); - setState(743); + setState(754); match(RPAR); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(745); + setState(756); match(LPAR); - setState(746); + setState(757); match(GLOBAL); - setState(748); + setState(759); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(747); + setState(758); bindVar(); } } - setState(750); + setState(761); globalType(); - setState(751); + setState(762); match(RPAR); } break; @@ -4823,17 +4868,17 @@ public final SimportContext simport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(755); + setState(766); match(LPAR); - setState(756); + setState(767); match(IMPORT); - setState(757); + setState(768); name(); - setState(758); + setState(769); name(); - setState(759); + setState(770); importDesc(); - setState(760); + setState(771); match(RPAR); } } @@ -4884,15 +4929,15 @@ public final InlineImportContext inlineImport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(762); + setState(773); match(LPAR); - setState(763); + setState(774); match(IMPORT); - setState(764); + setState(775); name(); - setState(765); + setState(776); name(); - setState(766); + setState(777); match(RPAR); } } @@ -4941,58 +4986,58 @@ public final ExportDescContext exportDesc() throws RecognitionException { ExportDescContext _localctx = new ExportDescContext(_ctx, getState()); enterRule(_localctx, 110, RULE_exportDesc); try { - setState(788); + setState(799); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(768); + setState(779); match(LPAR); - setState(769); + setState(780); match(FUNC); - setState(770); + setState(781); idx(); - setState(771); + setState(782); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(773); + setState(784); match(LPAR); - setState(774); + setState(785); match(TABLE); - setState(775); + setState(786); idx(); - setState(776); + setState(787); match(RPAR); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(778); + setState(789); match(LPAR); - setState(779); + setState(790); match(MEMORY); - setState(780); + setState(791); idx(); - setState(781); + setState(792); match(RPAR); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(783); + setState(794); match(LPAR); - setState(784); + setState(795); match(GLOBAL); - setState(785); + setState(796); idx(); - setState(786); + setState(797); match(RPAR); } break; @@ -5045,15 +5090,15 @@ public final Export_Context export_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(790); + setState(801); match(LPAR); - setState(791); + setState(802); match(EXPORT); - setState(792); + setState(803); name(); - setState(793); + setState(804); exportDesc(); - setState(794); + setState(805); match(RPAR); } } @@ -5101,13 +5146,13 @@ public final InlineExportContext inlineExport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(796); + setState(807); match(LPAR); - setState(797); + setState(808); match(EXPORT); - setState(798); + setState(809); name(); - setState(799); + setState(810); match(RPAR); } } @@ -5159,23 +5204,23 @@ public final TypeDefContext typeDef() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(801); + setState(812); match(LPAR); - setState(802); + setState(813); match(TYPE); - setState(804); + setState(815); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(803); + setState(814); bindVar(); } } - setState(806); + setState(817); defType(); - setState(807); + setState(818); match(RPAR); } } @@ -5223,13 +5268,13 @@ public final Start_Context start_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(809); + setState(820); match(LPAR); - setState(810); + setState(821); match(START_); - setState(811); + setState(822); idx(); - setState(812); + setState(823); match(RPAR); } } @@ -5299,76 +5344,76 @@ public final ModuleFieldContext moduleField() throws RecognitionException { ModuleFieldContext _localctx = new ModuleFieldContext(_ctx, getState()); enterRule(_localctx, 120, RULE_moduleField); try { - setState(824); + setState(835); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(814); + setState(825); typeDef(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(815); + setState(826); global(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(816); + setState(827); table(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(817); + setState(828); memory(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(818); + setState(829); function(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(819); + setState(830); elem(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(820); + setState(831); data(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(821); + setState(832); start_(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(822); + setState(833); simport(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(823); + setState(834); export_(); } break; @@ -5423,35 +5468,35 @@ public final Module_Context module_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(826); + setState(837); match(LPAR); - setState(827); + setState(838); match(MODULE); - setState(829); + setState(840); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(828); + setState(839); match(VAR); } } - setState(834); + setState(845); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(831); + setState(842); moduleField(); } } - setState(836); + setState(847); _errHandler.sync(this); _la = _input.LA(1); } - setState(837); + setState(848); match(RPAR); } } @@ -5505,34 +5550,34 @@ public final ScriptModuleContext scriptModule() throws RecognitionException { enterRule(_localctx, 124, RULE_scriptModule); int _la; try { - setState(853); + setState(864); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(839); + setState(850); module_(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(840); + setState(851); match(LPAR); - setState(841); + setState(852); match(MODULE); - setState(843); + setState(854); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(842); + setState(853); match(VAR); } } - setState(845); + setState(856); _la = _input.LA(1); if ( !(_la==BIN || _la==QUOTE) ) { _errHandler.recoverInline(this); @@ -5542,21 +5587,21 @@ public final ScriptModuleContext scriptModule() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(849); + setState(860); _errHandler.sync(this); _la = _input.LA(1); while (_la==STRING_) { { { - setState(846); + setState(857); match(STRING_); } } - setState(851); + setState(862); _errHandler.sync(this); _la = _input.LA(1); } - setState(852); + setState(863); match(RPAR); } break; @@ -5610,54 +5655,54 @@ public final Action_Context action_() throws RecognitionException { enterRule(_localctx, 126, RULE_action_); int _la; try { - setState(872); + setState(883); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(855); + setState(866); match(LPAR); - setState(856); + setState(867); match(INVOKE); - setState(858); + setState(869); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(857); + setState(868); match(VAR); } } - setState(860); + setState(871); name(); - setState(861); + setState(872); constList(); - setState(862); + setState(873); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(864); + setState(875); match(LPAR); - setState(865); + setState(876); match(GET); - setState(867); + setState(878); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(866); + setState(877); match(VAR); } } - setState(869); + setState(880); name(); - setState(870); + setState(881); match(RPAR); } break; @@ -5719,137 +5764,137 @@ public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); enterRule(_localctx, 128, RULE_assertion); try { - setState(926); + setState(937); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(874); + setState(885); match(LPAR); - setState(875); + setState(886); match(ASSERT_MALFORMED); - setState(876); + setState(887); scriptModule(); - setState(877); + setState(888); match(STRING_); - setState(878); + setState(889); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(880); + setState(891); match(LPAR); - setState(881); + setState(892); match(ASSERT_INVALID); - setState(882); + setState(893); scriptModule(); - setState(883); + setState(894); match(STRING_); - setState(884); + setState(895); match(RPAR); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(886); + setState(897); match(LPAR); - setState(887); + setState(898); match(ASSERT_UNLINKABLE); - setState(888); + setState(899); scriptModule(); - setState(889); + setState(900); match(STRING_); - setState(890); + setState(901); match(RPAR); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(892); + setState(903); match(LPAR); - setState(893); + setState(904); match(ASSERT_TRAP); - setState(894); + setState(905); scriptModule(); - setState(895); + setState(906); match(STRING_); - setState(896); + setState(907); match(RPAR); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(898); + setState(909); match(LPAR); - setState(899); + setState(910); match(ASSERT_RETURN); - setState(900); + setState(911); action_(); - setState(901); + setState(912); constList(); - setState(902); + setState(913); match(RPAR); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(904); + setState(915); match(LPAR); - setState(905); + setState(916); match(ASSERT_RETURN_CANONICAL_NAN); - setState(906); + setState(917); action_(); - setState(907); + setState(918); match(RPAR); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(909); + setState(920); match(LPAR); - setState(910); + setState(921); match(ASSERT_RETURN_ARITHMETIC_NAN); - setState(911); + setState(922); action_(); - setState(912); + setState(923); match(RPAR); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(914); + setState(925); match(LPAR); - setState(915); + setState(926); match(ASSERT_TRAP); - setState(916); + setState(927); action_(); - setState(917); + setState(928); match(STRING_); - setState(918); + setState(929); match(RPAR); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(920); + setState(931); match(LPAR); - setState(921); + setState(932); match(ASSERT_EXHAUSTION); - setState(922); + setState(933); action_(); - setState(923); + setState(934); match(STRING_); - setState(924); + setState(935); match(RPAR); } break; @@ -5911,57 +5956,57 @@ public final CmdContext cmd() throws RecognitionException { enterRule(_localctx, 130, RULE_cmd); int _la; try { - setState(940); + setState(951); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(928); + setState(939); action_(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(929); + setState(940); assertion(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(930); + setState(941); scriptModule(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(931); + setState(942); match(LPAR); - setState(932); + setState(943); match(REGISTER); - setState(933); + setState(944); name(); - setState(935); + setState(946); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(934); + setState(945); match(VAR); } } - setState(937); + setState(948); match(RPAR); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(939); + setState(950); meta(); } break; @@ -6017,108 +6062,108 @@ public final MetaContext meta() throws RecognitionException { enterRule(_localctx, 132, RULE_meta); int _la; try { - setState(974); + setState(985); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,104,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(942); + setState(953); match(LPAR); - setState(943); + setState(954); match(SCRIPT); - setState(945); + setState(956); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(944); + setState(955); match(VAR); } } - setState(950); + setState(961); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(947); + setState(958); cmd(); } } - setState(952); + setState(963); _errHandler.sync(this); _la = _input.LA(1); } - setState(953); + setState(964); match(RPAR); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(954); + setState(965); match(LPAR); - setState(955); + setState(966); match(INPUT); - setState(957); + setState(968); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(956); + setState(967); match(VAR); } } - setState(959); + setState(970); match(STRING_); - setState(960); + setState(971); match(RPAR); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(961); + setState(972); match(LPAR); - setState(962); + setState(973); match(OUTPUT); - setState(964); + setState(975); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(963); + setState(974); match(VAR); } } - setState(966); + setState(977); match(STRING_); - setState(967); + setState(978); match(RPAR); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(968); + setState(979); match(LPAR); - setState(969); + setState(980); match(OUTPUT); - setState(971); + setState(982); _errHandler.sync(this); _la = _input.LA(1); if (_la==VAR) { { - setState(970); + setState(981); match(VAR); } } - setState(973); + setState(984); match(RPAR); } break; @@ -6168,13 +6213,13 @@ public final WconstContext wconst() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(976); + setState(987); match(LPAR); - setState(977); + setState(988); match(CONST); - setState(978); + setState(989); literal(); - setState(979); + setState(990); match(RPAR); } } @@ -6223,17 +6268,17 @@ public final ConstListContext constList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(984); + setState(995); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(981); + setState(992); wconst(); } } - setState(986); + setState(997); _errHandler.sync(this); _la = _input.LA(1); } @@ -6289,48 +6334,48 @@ public final ScriptContext script() throws RecognitionException { enterRule(_localctx, 138, RULE_script); int _la; try { - setState(1001); + setState(1012); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(990); + setState(1001); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(987); + setState(998); cmd(); } } - setState(992); + setState(1003); _errHandler.sync(this); _la = _input.LA(1); } - setState(993); + setState(1004); match(EOF); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(995); + setState(1006); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(994); + setState(1005); moduleField(); } } - setState(997); + setState(1008); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==LPAR ); - setState(999); + setState(1010); match(EOF); } break; @@ -6383,36 +6428,36 @@ public final ModuleContext module() throws RecognitionException { enterRule(_localctx, 140, RULE_module); int _la; try { - setState(1013); + setState(1024); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1003); + setState(1014); module_(); - setState(1004); + setState(1015); match(EOF); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1009); + setState(1020); _errHandler.sync(this); _la = _input.LA(1); while (_la==LPAR) { { { - setState(1006); + setState(1017); moduleField(); } } - setState(1011); + setState(1022); _errHandler.sync(this); _la = _input.LA(1); } - setState(1012); + setState(1023); match(EOF); } break; @@ -6430,7 +6475,7 @@ public final ModuleContext module() throws RecognitionException { } public static final String _serializedATN = - "\u0004\u0001\u0093\u03f8\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u0093\u0403\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -6491,183 +6536,185 @@ public final ModuleContext module() throws RecognitionException { "\u0001\u001d\u0001\u001d\u0003\u001d\u0193\b\u001d\u0001\u001d\u0001\u001d"+ "\u0001\u001d\u0003\u001d\u0198\b\u001d\u0001\u001d\u0003\u001d\u019b\b"+ "\u001d\u0001\u001d\u0001\u001d\u0003\u001d\u019f\b\u001d\u0003\u001d\u01a1"+ - "\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - " \u0001 \u0001 \u0001 \u0001!\u0001!\u0005!\u01ae\b!\n!\f!\u01b1\t!\u0001"+ - "!\u0001!\u0001!\u0001!\u0003!\u01b7\b!\u0001!\u0001!\u0001!\u0003!\u01bc"+ - "\b!\u0001!\u0001!\u0001!\u0003!\u01c1\b!\u0001!\u0001!\u0005!\u01c5\b"+ - "!\n!\f!\u01c8\t!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0003!\u01d2\b!\u0003!\u01d4\b!\u0001\"\u0003\"\u01d7\b\"\u0001\"\u0001"+ - "\"\u0001#\u0001#\u0001#\u0005#\u01de\b#\n#\f#\u01e1\t#\u0001#\u0005#\u01e4"+ - "\b#\n#\f#\u01e7\t#\u0001#\u0001#\u0001$\u0001$\u0001$\u0005$\u01ee\b$"+ - "\n$\f$\u01f1\t$\u0001$\u0005$\u01f4\b$\n$\f$\u01f7\t$\u0001$\u0005$\u01fa"+ - "\b$\n$\f$\u01fd\t$\u0001%\u0005%\u0200\b%\n%\f%\u0203\t%\u0001%\u0003"+ - "%\u0206\b%\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0003\'\u020d\b\'\u0001"+ - "\'\u0001\'\u0001\'\u0001(\u0003(\u0213\b(\u0001(\u0001(\u0001(\u0003("+ - "\u0218\b(\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u021f\b(\u0001)\u0001"+ - ")\u0001)\u0001*\u0001*\u0001*\u0005*\u0227\b*\n*\f*\u022a\t*\u0001*\u0001"+ - "*\u0001*\u0003*\u022f\b*\u0001*\u0005*\u0232\b*\n*\f*\u0235\t*\u0001*"+ - "\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u023f\b+\u0001"+ - ",\u0001,\u0001,\u0003,\u0244\b,\u0001,\u0001,\u0001,\u0001,\u0005,\u024a"+ - "\b,\n,\f,\u024d\t,\u0001,\u0001,\u0001,\u0001,\u0001,\u0003,\u0254\b,"+ - "\u0001,\u0001,\u0005,\u0258\b,\n,\f,\u025b\t,\u0001,\u0001,\u0003,\u025f"+ - "\b,\u0001-\u0001-\u0001-\u0003-\u0264\b-\u0001-\u0001-\u0001-\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ - ".\u0274\b.\n.\f.\u0277\t.\u0001.\u0001.\u0003.\u027b\b.\u0001/\u0001/"+ - "\u0001/\u0003/\u0280\b/\u0001/\u0001/\u0001/\u0001/\u0005/\u0286\b/\n"+ - "/\f/\u0289\t/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u0290\b/\u0001"+ - "/\u0001/\u0005/\u0294\b/\n/\f/\u0297\t/\u0001/\u0001/\u0003/\u029b\b/"+ - "\u00010\u00010\u00010\u00030\u02a0\b0\u00010\u00010\u00010\u00011\u0001"+ - "1\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00051\u02af"+ - "\b1\n1\f1\u02b2\t1\u00011\u00031\u02b5\b1\u00012\u00012\u00012\u00032"+ - "\u02ba\b2\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ - "3\u00013\u00013\u00013\u00033\u02c8\b3\u00014\u00014\u00014\u00034\u02cd"+ - "\b4\u00014\u00014\u00014\u00014\u00014\u00014\u00034\u02d5\b4\u00014\u0001"+ - "4\u00014\u00014\u00014\u00014\u00034\u02dd\b4\u00014\u00014\u00014\u0001"+ - "4\u00014\u00014\u00034\u02e5\b4\u00014\u00014\u00014\u00014\u00014\u0001"+ - "4\u00034\u02ed\b4\u00014\u00014\u00014\u00034\u02f2\b4\u00015\u00015\u0001"+ - "5\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u0001"+ - "6\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ + "\b\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0003"+ + "\u001e\u01a8\b\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0003"+ + "\u001e\u01ae\b\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001"+ + " \u0001 \u0001 \u0001!\u0001!\u0005!\u01b9\b!\n!\f!\u01bc\t!\u0001!\u0001"+ + "!\u0001!\u0001!\u0003!\u01c2\b!\u0001!\u0001!\u0001!\u0003!\u01c7\b!\u0001"+ + "!\u0001!\u0001!\u0003!\u01cc\b!\u0001!\u0001!\u0005!\u01d0\b!\n!\f!\u01d3"+ + "\t!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0003!\u01dd"+ + "\b!\u0003!\u01df\b!\u0001\"\u0003\"\u01e2\b\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0005#\u01e9\b#\n#\f#\u01ec\t#\u0001#\u0005#\u01ef\b#\n#\f#\u01f2"+ + "\t#\u0001#\u0001#\u0001$\u0001$\u0001$\u0005$\u01f9\b$\n$\f$\u01fc\t$"+ + "\u0001$\u0005$\u01ff\b$\n$\f$\u0202\t$\u0001$\u0005$\u0205\b$\n$\f$\u0208"+ + "\t$\u0001%\u0005%\u020b\b%\n%\f%\u020e\t%\u0001%\u0003%\u0211\b%\u0001"+ + "&\u0001&\u0001\'\u0001\'\u0001\'\u0003\'\u0218\b\'\u0001\'\u0001\'\u0001"+ + "\'\u0001(\u0003(\u021e\b(\u0001(\u0001(\u0001(\u0003(\u0223\b(\u0001("+ + "\u0001(\u0001(\u0001(\u0001(\u0003(\u022a\b(\u0001)\u0001)\u0001)\u0001"+ + "*\u0001*\u0001*\u0005*\u0232\b*\n*\f*\u0235\t*\u0001*\u0001*\u0001*\u0003"+ + "*\u023a\b*\u0001*\u0005*\u023d\b*\n*\f*\u0240\t*\u0001*\u0001*\u0001+"+ + "\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u024a\b+\u0001,\u0001,\u0001"+ + ",\u0003,\u024f\b,\u0001,\u0001,\u0001,\u0001,\u0005,\u0255\b,\n,\f,\u0258"+ + "\t,\u0001,\u0001,\u0001,\u0001,\u0001,\u0003,\u025f\b,\u0001,\u0001,\u0005"+ + ",\u0263\b,\n,\f,\u0266\t,\u0001,\u0001,\u0003,\u026a\b,\u0001-\u0001-"+ + "\u0001-\u0003-\u026f\b-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u027f\b.\n."+ + "\f.\u0282\t.\u0001.\u0001.\u0003.\u0286\b.\u0001/\u0001/\u0001/\u0003"+ + "/\u028b\b/\u0001/\u0001/\u0001/\u0001/\u0005/\u0291\b/\n/\f/\u0294\t/"+ + "\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u029b\b/\u0001/\u0001/\u0005"+ + "/\u029f\b/\n/\f/\u02a2\t/\u0001/\u0001/\u0003/\u02a6\b/\u00010\u00010"+ + "\u00010\u00030\u02ab\b0\u00010\u00010\u00010\u00011\u00011\u00011\u0001"+ + "1\u00011\u00011\u00011\u00011\u00011\u00011\u00051\u02ba\b1\n1\f1\u02bd"+ + "\t1\u00011\u00031\u02c0\b1\u00012\u00012\u00012\u00032\u02c5\b2\u0001"+ + "2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00013\u00033\u02d3\b3\u00014\u00014\u00014\u00034\u02d8\b4\u00014\u0001"+ + "4\u00014\u00014\u00014\u00014\u00034\u02e0\b4\u00014\u00014\u00014\u0001"+ + "4\u00014\u00014\u00034\u02e8\b4\u00014\u00014\u00014\u00014\u00014\u0001"+ + "4\u00034\u02f0\b4\u00014\u00014\u00014\u00014\u00014\u00014\u00034\u02f8"+ + "\b4\u00014\u00014\u00014\u00034\u02fd\b4\u00015\u00015\u00015\u00015\u0001"+ + "5\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u00017\u0001"+ "7\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ - "7\u00037\u0315\b7\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u0001"+ - "9\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0003:\u0325\b:\u0001:\u0001"+ - ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001"+ - "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0003<\u0339\b<\u0001=\u0001"+ - "=\u0001=\u0003=\u033e\b=\u0001=\u0005=\u0341\b=\n=\f=\u0344\t=\u0001="+ - "\u0001=\u0001>\u0001>\u0001>\u0001>\u0003>\u034c\b>\u0001>\u0001>\u0005"+ - ">\u0350\b>\n>\f>\u0353\t>\u0001>\u0003>\u0356\b>\u0001?\u0001?\u0001?"+ - "\u0003?\u035b\b?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0003"+ - "?\u0364\b?\u0001?\u0001?\u0001?\u0003?\u0369\b?\u0001@\u0001@\u0001@\u0001"+ + "7\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00037\u0320"+ + "\b7\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ + "9\u00019\u0001:\u0001:\u0001:\u0003:\u0330\b:\u0001:\u0001:\u0001:\u0001"+ + ";\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0003<\u0344\b<\u0001=\u0001=\u0001=\u0003"+ + "=\u0349\b=\u0001=\u0005=\u034c\b=\n=\f=\u034f\t=\u0001=\u0001=\u0001>"+ + "\u0001>\u0001>\u0001>\u0003>\u0357\b>\u0001>\u0001>\u0005>\u035b\b>\n"+ + ">\f>\u035e\t>\u0001>\u0003>\u0361\b>\u0001?\u0001?\u0001?\u0003?\u0366"+ + "\b?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0003?\u036f\b?\u0001"+ + "?\u0001?\u0001?\u0003?\u0374\b?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0003@\u039f"+ - "\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0003A\u03a8\bA\u0001"+ - "A\u0001A\u0001A\u0003A\u03ad\bA\u0001B\u0001B\u0001B\u0003B\u03b2\bB\u0001"+ - "B\u0005B\u03b5\bB\nB\fB\u03b8\tB\u0001B\u0001B\u0001B\u0001B\u0003B\u03be"+ - "\bB\u0001B\u0001B\u0001B\u0001B\u0001B\u0003B\u03c5\bB\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0003B\u03cc\bB\u0001B\u0003B\u03cf\bB\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001D\u0005D\u03d7\bD\nD\fD\u03da\tD\u0001E\u0005E\u03dd"+ - "\bE\nE\fE\u03e0\tE\u0001E\u0001E\u0004E\u03e4\bE\u000bE\fE\u03e5\u0001"+ - "E\u0001E\u0003E\u03ea\bE\u0001F\u0001F\u0001F\u0001F\u0005F\u03f0\bF\n"+ - "F\fF\u03f3\tF\u0001F\u0003F\u03f6\bF\u0001F\u0000\u0000G\u0000\u0002\u0004"+ - "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ - "$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086"+ - "\u0088\u008a\u008c\u0000\u0006\u0001\u0000\u0004\u0005\u0001\u0000\n\u000b"+ - "\u0001\u0000qr\u0001\u0000\u0003\u0005\u0002\u0000\u0003\u0003\u0090\u0090"+ - "\u0001\u0000\u0080\u0081\u0460\u0000\u008e\u0001\u0000\u0000\u0000\u0002"+ - "\u0090\u0001\u0000\u0000\u0000\u0004\u0092\u0001\u0000\u0000\u0000\u0006"+ - "\u0094\u0001\u0000\u0000\u0000\b\u0096\u0001\u0000\u0000\u0000\n\u009b"+ - "\u0001\u0000\u0000\u0000\f\u009d\u0001\u0000\u0000\u0000\u000e\u00a5\u0001"+ - "\u0000\u0000\u0000\u0010\u00a7\u0001\u0000\u0000\u0000\u0012\u00bc\u0001"+ - "\u0000\u0000\u0000\u0014\u00ca\u0001\u0000\u0000\u0000\u0016\u00cd\u0001"+ - "\u0000\u0000\u0000\u0018\u00d0\u0001\u0000\u0000\u0000\u001a\u00d6\u0001"+ - "\u0000\u0000\u0000\u001c\u00da\u0001\u0000\u0000\u0000\u001e\u00df\u0001"+ - "\u0000\u0000\u0000 \u00e1\u0001\u0000\u0000\u0000\"\u00e3\u0001\u0000"+ - "\u0000\u0000$\u00e8\u0001\u0000\u0000\u0000&\u0125\u0001\u0000\u0000\u0000"+ - "(\u0127\u0001\u0000\u0000\u0000*\u012a\u0001\u0000\u0000\u0000,\u012d"+ - "\u0001\u0000\u0000\u0000.\u0134\u0001\u0000\u0000\u00000\u0139\u0001\u0000"+ - "\u0000\u00002\u013c\u0001\u0000\u0000\u00004\u014d\u0001\u0000\u0000\u0000"+ - "6\u0169\u0001\u0000\u0000\u00008\u0179\u0001\u0000\u0000\u0000:\u01a0"+ - "\u0001\u0000\u0000\u0000<\u01a2\u0001\u0000\u0000\u0000>\u01a4\u0001\u0000"+ - "\u0000\u0000@\u01a7\u0001\u0000\u0000\u0000B\u01d3\u0001\u0000\u0000\u0000"+ - "D\u01d6\u0001\u0000\u0000\u0000F\u01e5\u0001\u0000\u0000\u0000H\u01f5"+ - "\u0001\u0000\u0000\u0000J\u0201\u0001\u0000\u0000\u0000L\u0207\u0001\u0000"+ - "\u0000\u0000N\u0209\u0001\u0000\u0000\u0000P\u021e\u0001\u0000\u0000\u0000"+ - "R\u0220\u0001\u0000\u0000\u0000T\u0233\u0001\u0000\u0000\u0000V\u023e"+ - "\u0001\u0000\u0000\u0000X\u025e\u0001\u0000\u0000\u0000Z\u0260\u0001\u0000"+ - "\u0000\u0000\\\u027a\u0001\u0000\u0000\u0000^\u029a\u0001\u0000\u0000"+ - "\u0000`\u029c\u0001\u0000\u0000\u0000b\u02b4\u0001\u0000\u0000\u0000d"+ - "\u02b6\u0001\u0000\u0000\u0000f\u02c7\u0001\u0000\u0000\u0000h\u02f1\u0001"+ - "\u0000\u0000\u0000j\u02f3\u0001\u0000\u0000\u0000l\u02fa\u0001\u0000\u0000"+ - "\u0000n\u0314\u0001\u0000\u0000\u0000p\u0316\u0001\u0000\u0000\u0000r"+ - "\u031c\u0001\u0000\u0000\u0000t\u0321\u0001\u0000\u0000\u0000v\u0329\u0001"+ - "\u0000\u0000\u0000x\u0338\u0001\u0000\u0000\u0000z\u033a\u0001\u0000\u0000"+ - "\u0000|\u0355\u0001\u0000\u0000\u0000~\u0368\u0001\u0000\u0000\u0000\u0080"+ - "\u039e\u0001\u0000\u0000\u0000\u0082\u03ac\u0001\u0000\u0000\u0000\u0084"+ - "\u03ce\u0001\u0000\u0000\u0000\u0086\u03d0\u0001\u0000\u0000\u0000\u0088"+ - "\u03d8\u0001\u0000\u0000\u0000\u008a\u03e9\u0001\u0000\u0000\u0000\u008c"+ - "\u03f5\u0001\u0000\u0000\u0000\u008e\u008f\u0007\u0000\u0000\u0000\u008f"+ - "\u0001\u0001\u0000\u0000\u0000\u0090\u0091\u0005\u0006\u0000\u0000\u0091"+ - "\u0003\u0001\u0000\u0000\u0000\u0092\u0093\u0005\u0007\u0000\u0000\u0093"+ - "\u0005\u0001\u0000\u0000\u0000\u0094\u0095\u0007\u0001\u0000\u0000\u0095"+ - "\u0007\u0001\u0000\u0000\u0000\u0096\u0097\u0005\u0091\u0000\u0000\u0097"+ - "\t\u0001\u0000\u0000\u0000\u0098\u009c\u0003\u0004\u0002\u0000\u0099\u009c"+ - "\u0003\b\u0004\u0000\u009a\u009c\u0003\u0006\u0003\u0000\u009b\u0098\u0001"+ - "\u0000\u0000\u0000\u009b\u0099\u0001\u0000\u0000\u0000\u009b\u009a\u0001"+ - "\u0000\u0000\u0000\u009c\u000b\u0001\u0000\u0000\u0000\u009d\u009e\u0007"+ - "\u0002\u0000\u0000\u009e\r\u0001\u0000\u0000\u0000\u009f\u00a6\u0003\n"+ - "\u0005\u0000\u00a0\u00a1\u0005\u0001\u0000\u0000\u00a1\u00a2\u0005\f\u0000"+ - "\u0000\u00a2\u00a3\u0003\n\u0005\u0000\u00a3\u00a4\u0005\u0002\u0000\u0000"+ - "\u00a4\u00a6\u0001\u0000\u0000\u0000\u00a5\u009f\u0001\u0000\u0000\u0000"+ - "\u00a5\u00a0\u0001\u0000\u0000\u0000\u00a6\u000f\u0001\u0000\u0000\u0000"+ - "\u00a7\u00a8\u0005\u0001\u0000\u0000\u00a8\u00a9\u0005q\u0000\u0000\u00a9"+ - "\u00aa\u0003\u0016\u000b\u0000\u00aa\u00ab\u0005\u0002\u0000\u0000\u00ab"+ - "\u0011\u0001\u0000\u0000\u0000\u00ac\u00ad\u0005\u0001\u0000\u0000\u00ad"+ - "\u00b7\u0005t\u0000\u0000\u00ae\u00b0\u0003\n\u0005\u0000\u00af\u00ae"+ - "\u0001\u0000\u0000\u0000\u00b0\u00b3\u0001\u0000\u0000\u0000\u00b1\u00af"+ - "\u0001\u0000\u0000\u0000\u00b1\u00b2\u0001\u0000\u0000\u0000\u00b2\u00b8"+ - "\u0001\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000\u0000\u00b4\u00b5"+ - "\u0003\"\u0011\u0000\u00b5\u00b6\u0003\n\u0005\u0000\u00b6\u00b8\u0001"+ - "\u0000\u0000\u0000\u00b7\u00b1\u0001\u0000\u0000\u0000\u00b7\u00b4\u0001"+ - "\u0000\u0000\u0000\u00b8\u00b9\u0001\u0000\u0000\u0000\u00b9\u00bb\u0005"+ - "\u0002\u0000\u0000\u00ba\u00ac\u0001\u0000\u0000\u0000\u00bb\u00be\u0001"+ - "\u0000\u0000\u0000\u00bc\u00ba\u0001\u0000\u0000\u0000\u00bc\u00bd\u0001"+ - "\u0000\u0000\u0000\u00bd\u0013\u0001\u0000\u0000\u0000\u00be\u00bc\u0001"+ - "\u0000\u0000\u0000\u00bf\u00c0\u0005\u0001\u0000\u0000\u00c0\u00c4\u0005"+ - "u\u0000\u0000\u00c1\u00c3\u0003\n\u0005\u0000\u00c2\u00c1\u0001\u0000"+ - "\u0000\u0000\u00c3\u00c6\u0001\u0000\u0000\u0000\u00c4\u00c2\u0001\u0000"+ - "\u0000\u0000\u00c4\u00c5\u0001\u0000\u0000\u0000\u00c5\u00c7\u0001\u0000"+ - "\u0000\u0000\u00c6\u00c4\u0001\u0000\u0000\u0000\u00c7\u00c9\u0005\u0002"+ - "\u0000\u0000\u00c8\u00bf\u0001\u0000\u0000\u0000\u00c9\u00cc\u0001\u0000"+ - "\u0000\u0000\u00ca\u00c8\u0001\u0000\u0000\u0000\u00ca\u00cb\u0001\u0000"+ - "\u0000\u0000\u00cb\u0015\u0001\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000"+ - "\u0000\u0000\u00cd\u00ce\u0003\u0012\t\u0000\u00ce\u00cf\u0003\u0014\n"+ - "\u0000\u00cf\u0017\u0001\u0000\u0000\u0000\u00d0\u00d2\u0005\u0003\u0000"+ - "\u0000\u00d1\u00d3\u0005\u0003\u0000\u0000\u00d2\u00d1\u0001\u0000\u0000"+ - "\u0000\u00d2\u00d3\u0001\u0000\u0000\u0000\u00d3\u00d4\u0001\u0000\u0000"+ - "\u0000\u00d4\u00d5\u0003\u0006\u0003\u0000\u00d5\u0019\u0001\u0000\u0000"+ - "\u0000\u00d6\u00d8\u0005\u0003\u0000\u0000\u00d7\u00d9\u0005\u0003\u0000"+ - "\u0000\u00d8\u00d7\u0001\u0000\u0000\u0000\u00d8\u00d9\u0001\u0000\u0000"+ - "\u0000\u00d9\u001b\u0001\u0000\u0000\u0000\u00da\u00db\u0005\u0001\u0000"+ - "\u0000\u00db\u00dc\u0005p\u0000\u0000\u00dc\u00dd\u0003 \u0010\u0000\u00dd"+ - "\u00de\u0005\u0002\u0000\u0000\u00de\u001d\u0001\u0000\u0000\u0000\u00df"+ - "\u00e0\u0007\u0003\u0000\u0000\u00e0\u001f\u0001\u0000\u0000\u0000\u00e1"+ - "\u00e2\u0007\u0004\u0000\u0000\u00e2!\u0001\u0000\u0000\u0000\u00e3\u00e4"+ - "\u0005\u0090\u0000\u0000\u00e4#\u0001\u0000\u0000\u0000\u00e5\u00e9\u0003"+ - "&\u0013\u0000\u00e6\u00e9\u0003:\u001d\u0000\u00e7\u00e9\u0003@ \u0000"+ - "\u00e8\u00e5\u0001\u0000\u0000\u0000\u00e8\u00e6\u0001\u0000\u0000\u0000"+ - "\u00e8\u00e7\u0001\u0000\u0000\u0000\u00e9%\u0001\u0000\u0000\u0000\u00ea"+ - "\u0126\u0005\u0011\u0000\u0000\u00eb\u0126\u0005\r\u0000\u0000\u00ec\u0126"+ - "\u0005\u0012\u0000\u0000\u00ed\u0126\u00030\u0018\u0000\u00ee\u00ef\u0005"+ - "\u0016\u0000\u0000\u00ef\u0126\u0003 \u0010\u0000\u00f0\u00f1\u0005\u0017"+ - "\u0000\u0000\u00f1\u0126\u0003 \u0010\u0000\u00f2\u00f4\u0005\u0018\u0000"+ - "\u0000\u00f3\u00f5\u0003 \u0010\u0000\u00f4\u00f3\u0001\u0000\u0000\u0000"+ - "\u00f5\u00f6\u0001\u0000\u0000\u0000\u00f6\u00f4\u0001\u0000\u0000\u0000"+ - "\u00f6\u00f7\u0001\u0000\u0000\u0000\u00f7\u0126\u0001\u0000\u0000\u0000"+ - "\u00f8\u0126\u0005\u0019\u0000\u0000\u00f9\u00fa\u0005\u001e\u0000\u0000"+ - "\u00fa\u0126\u0003 \u0010\u0000\u00fb\u00fc\u0005 \u0000\u0000\u00fc\u0126"+ - "\u0003 \u0010\u0000\u00fd\u00fe\u0005!\u0000\u0000\u00fe\u0126\u0003 "+ - "\u0010\u0000\u00ff\u0100\u0005\"\u0000\u0000\u0100\u0126\u0003 \u0010"+ - "\u0000\u0101\u0102\u0005#\u0000\u0000\u0102\u0126\u0003 \u0010\u0000\u0103"+ - "\u0104\u0005$\u0000\u0000\u0104\u0126\u0003 \u0010\u0000\u0105\u0107\u0003"+ - ",\u0016\u0000\u0106\u0108\u0003(\u0014\u0000\u0107\u0106\u0001\u0000\u0000"+ - "\u0000\u0107\u0108\u0001\u0000\u0000\u0000\u0108\u010a\u0001\u0000\u0000"+ - "\u0000\u0109\u010b\u0003*\u0015\u0000\u010a\u0109\u0001\u0000\u0000\u0000"+ - "\u010a\u010b\u0001\u0000\u0000\u0000\u010b\u0126\u0001\u0000\u0000\u0000"+ - "\u010c\u010e\u0003.\u0017\u0000\u010d\u010f\u0003(\u0014\u0000\u010e\u010d"+ - "\u0001\u0000\u0000\u0000\u010e\u010f\u0001\u0000\u0000\u0000\u010f\u0111"+ - "\u0001\u0000\u0000\u0000\u0110\u0112\u0003*\u0015\u0000\u0111\u0110\u0001"+ - "\u0000\u0000\u0000\u0111\u0112\u0001\u0000\u0000\u0000\u0112\u0126\u0001"+ - "\u0000\u0000\u0000\u0113\u0126\u0005f\u0000\u0000\u0114\u0126\u0005g\u0000"+ - "\u0000\u0115\u0126\u0005h\u0000\u0000\u0116\u0126\u0005i\u0000\u0000\u0117"+ - "\u0118\u0005j\u0000\u0000\u0118\u0126\u0003 \u0010\u0000\u0119\u011a\u0005"+ - "\b\u0000\u0000\u011a\u0126\u0003\u001e\u000f\u0000\u011b\u0126\u0005\t"+ - "\u0000\u0000\u011c\u0126\u0005\u000e\u0000\u0000\u011d\u0126\u0005\u000f"+ - "\u0000\u0000\u011e\u0126\u0005\u0010\u0000\u0000\u011f\u0126\u0005k\u0000"+ - "\u0000\u0120\u0126\u0005l\u0000\u0000\u0121\u0126\u0005m\u0000\u0000\u0122"+ - "\u0126\u0005n\u0000\u0000\u0123\u0126\u0005o\u0000\u0000\u0124\u0126\u0003"+ - "2\u0019\u0000\u0125\u00ea\u0001\u0000\u0000\u0000\u0125\u00eb\u0001\u0000"+ + "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0003@\u03aa\b@\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0003A\u03b3\bA\u0001A\u0001A\u0001"+ + "A\u0003A\u03b8\bA\u0001B\u0001B\u0001B\u0003B\u03bd\bB\u0001B\u0005B\u03c0"+ + "\bB\nB\fB\u03c3\tB\u0001B\u0001B\u0001B\u0001B\u0003B\u03c9\bB\u0001B"+ + "\u0001B\u0001B\u0001B\u0001B\u0003B\u03d0\bB\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0003B\u03d7\bB\u0001B\u0003B\u03da\bB\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001D\u0005D\u03e2\bD\nD\fD\u03e5\tD\u0001E\u0005E\u03e8\bE"+ + "\nE\fE\u03eb\tE\u0001E\u0001E\u0004E\u03ef\bE\u000bE\fE\u03f0\u0001E\u0001"+ + "E\u0003E\u03f5\bE\u0001F\u0001F\u0001F\u0001F\u0005F\u03fb\bF\nF\fF\u03fe"+ + "\tF\u0001F\u0003F\u0401\bF\u0001F\u0000\u0000G\u0000\u0002\u0004\u0006"+ + "\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,."+ + "02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088"+ + "\u008a\u008c\u0000\u0006\u0001\u0000\u0004\u0005\u0001\u0000\n\u000b\u0001"+ + "\u0000qr\u0001\u0000\u0003\u0005\u0002\u0000\u0003\u0003\u0090\u0090\u0001"+ + "\u0000\u0080\u0081\u046e\u0000\u008e\u0001\u0000\u0000\u0000\u0002\u0090"+ + "\u0001\u0000\u0000\u0000\u0004\u0092\u0001\u0000\u0000\u0000\u0006\u0094"+ + "\u0001\u0000\u0000\u0000\b\u0096\u0001\u0000\u0000\u0000\n\u009b\u0001"+ + "\u0000\u0000\u0000\f\u009d\u0001\u0000\u0000\u0000\u000e\u00a5\u0001\u0000"+ + "\u0000\u0000\u0010\u00a7\u0001\u0000\u0000\u0000\u0012\u00bc\u0001\u0000"+ + "\u0000\u0000\u0014\u00ca\u0001\u0000\u0000\u0000\u0016\u00cd\u0001\u0000"+ + "\u0000\u0000\u0018\u00d0\u0001\u0000\u0000\u0000\u001a\u00d6\u0001\u0000"+ + "\u0000\u0000\u001c\u00da\u0001\u0000\u0000\u0000\u001e\u00df\u0001\u0000"+ + "\u0000\u0000 \u00e1\u0001\u0000\u0000\u0000\"\u00e3\u0001\u0000\u0000"+ + "\u0000$\u00e8\u0001\u0000\u0000\u0000&\u0125\u0001\u0000\u0000\u0000("+ + "\u0127\u0001\u0000\u0000\u0000*\u012a\u0001\u0000\u0000\u0000,\u012d\u0001"+ + "\u0000\u0000\u0000.\u0134\u0001\u0000\u0000\u00000\u0139\u0001\u0000\u0000"+ + "\u00002\u013c\u0001\u0000\u0000\u00004\u014d\u0001\u0000\u0000\u00006"+ + "\u0169\u0001\u0000\u0000\u00008\u0179\u0001\u0000\u0000\u0000:\u01a0\u0001"+ + "\u0000\u0000\u0000<\u01ad\u0001\u0000\u0000\u0000>\u01af\u0001\u0000\u0000"+ + "\u0000@\u01b2\u0001\u0000\u0000\u0000B\u01de\u0001\u0000\u0000\u0000D"+ + "\u01e1\u0001\u0000\u0000\u0000F\u01f0\u0001\u0000\u0000\u0000H\u0200\u0001"+ + "\u0000\u0000\u0000J\u020c\u0001\u0000\u0000\u0000L\u0212\u0001\u0000\u0000"+ + "\u0000N\u0214\u0001\u0000\u0000\u0000P\u0229\u0001\u0000\u0000\u0000R"+ + "\u022b\u0001\u0000\u0000\u0000T\u023e\u0001\u0000\u0000\u0000V\u0249\u0001"+ + "\u0000\u0000\u0000X\u0269\u0001\u0000\u0000\u0000Z\u026b\u0001\u0000\u0000"+ + "\u0000\\\u0285\u0001\u0000\u0000\u0000^\u02a5\u0001\u0000\u0000\u0000"+ + "`\u02a7\u0001\u0000\u0000\u0000b\u02bf\u0001\u0000\u0000\u0000d\u02c1"+ + "\u0001\u0000\u0000\u0000f\u02d2\u0001\u0000\u0000\u0000h\u02fc\u0001\u0000"+ + "\u0000\u0000j\u02fe\u0001\u0000\u0000\u0000l\u0305\u0001\u0000\u0000\u0000"+ + "n\u031f\u0001\u0000\u0000\u0000p\u0321\u0001\u0000\u0000\u0000r\u0327"+ + "\u0001\u0000\u0000\u0000t\u032c\u0001\u0000\u0000\u0000v\u0334\u0001\u0000"+ + "\u0000\u0000x\u0343\u0001\u0000\u0000\u0000z\u0345\u0001\u0000\u0000\u0000"+ + "|\u0360\u0001\u0000\u0000\u0000~\u0373\u0001\u0000\u0000\u0000\u0080\u03a9"+ + "\u0001\u0000\u0000\u0000\u0082\u03b7\u0001\u0000\u0000\u0000\u0084\u03d9"+ + "\u0001\u0000\u0000\u0000\u0086\u03db\u0001\u0000\u0000\u0000\u0088\u03e3"+ + "\u0001\u0000\u0000\u0000\u008a\u03f4\u0001\u0000\u0000\u0000\u008c\u0400"+ + "\u0001\u0000\u0000\u0000\u008e\u008f\u0007\u0000\u0000\u0000\u008f\u0001"+ + "\u0001\u0000\u0000\u0000\u0090\u0091\u0005\u0006\u0000\u0000\u0091\u0003"+ + "\u0001\u0000\u0000\u0000\u0092\u0093\u0005\u0007\u0000\u0000\u0093\u0005"+ + "\u0001\u0000\u0000\u0000\u0094\u0095\u0007\u0001\u0000\u0000\u0095\u0007"+ + "\u0001\u0000\u0000\u0000\u0096\u0097\u0005\u0091\u0000\u0000\u0097\t\u0001"+ + "\u0000\u0000\u0000\u0098\u009c\u0003\u0004\u0002\u0000\u0099\u009c\u0003"+ + "\b\u0004\u0000\u009a\u009c\u0003\u0006\u0003\u0000\u009b\u0098\u0001\u0000"+ + "\u0000\u0000\u009b\u0099\u0001\u0000\u0000\u0000\u009b\u009a\u0001\u0000"+ + "\u0000\u0000\u009c\u000b\u0001\u0000\u0000\u0000\u009d\u009e\u0007\u0002"+ + "\u0000\u0000\u009e\r\u0001\u0000\u0000\u0000\u009f\u00a6\u0003\n\u0005"+ + "\u0000\u00a0\u00a1\u0005\u0001\u0000\u0000\u00a1\u00a2\u0005\f\u0000\u0000"+ + "\u00a2\u00a3\u0003\n\u0005\u0000\u00a3\u00a4\u0005\u0002\u0000\u0000\u00a4"+ + "\u00a6\u0001\u0000\u0000\u0000\u00a5\u009f\u0001\u0000\u0000\u0000\u00a5"+ + "\u00a0\u0001\u0000\u0000\u0000\u00a6\u000f\u0001\u0000\u0000\u0000\u00a7"+ + "\u00a8\u0005\u0001\u0000\u0000\u00a8\u00a9\u0005q\u0000\u0000\u00a9\u00aa"+ + "\u0003\u0016\u000b\u0000\u00aa\u00ab\u0005\u0002\u0000\u0000\u00ab\u0011"+ + "\u0001\u0000\u0000\u0000\u00ac\u00ad\u0005\u0001\u0000\u0000\u00ad\u00b7"+ + "\u0005t\u0000\u0000\u00ae\u00b0\u0003\n\u0005\u0000\u00af\u00ae\u0001"+ + "\u0000\u0000\u0000\u00b0\u00b3\u0001\u0000\u0000\u0000\u00b1\u00af\u0001"+ + "\u0000\u0000\u0000\u00b1\u00b2\u0001\u0000\u0000\u0000\u00b2\u00b8\u0001"+ + "\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000\u0000\u00b4\u00b5\u0003"+ + "\"\u0011\u0000\u00b5\u00b6\u0003\n\u0005\u0000\u00b6\u00b8\u0001\u0000"+ + "\u0000\u0000\u00b7\u00b1\u0001\u0000\u0000\u0000\u00b7\u00b4\u0001\u0000"+ + "\u0000\u0000\u00b8\u00b9\u0001\u0000\u0000\u0000\u00b9\u00bb\u0005\u0002"+ + "\u0000\u0000\u00ba\u00ac\u0001\u0000\u0000\u0000\u00bb\u00be\u0001\u0000"+ + "\u0000\u0000\u00bc\u00ba\u0001\u0000\u0000\u0000\u00bc\u00bd\u0001\u0000"+ + "\u0000\u0000\u00bd\u0013\u0001\u0000\u0000\u0000\u00be\u00bc\u0001\u0000"+ + "\u0000\u0000\u00bf\u00c0\u0005\u0001\u0000\u0000\u00c0\u00c4\u0005u\u0000"+ + "\u0000\u00c1\u00c3\u0003\n\u0005\u0000\u00c2\u00c1\u0001\u0000\u0000\u0000"+ + "\u00c3\u00c6\u0001\u0000\u0000\u0000\u00c4\u00c2\u0001\u0000\u0000\u0000"+ + "\u00c4\u00c5\u0001\u0000\u0000\u0000\u00c5\u00c7\u0001\u0000\u0000\u0000"+ + "\u00c6\u00c4\u0001\u0000\u0000\u0000\u00c7\u00c9\u0005\u0002\u0000\u0000"+ + "\u00c8\u00bf\u0001\u0000\u0000\u0000\u00c9\u00cc\u0001\u0000\u0000\u0000"+ + "\u00ca\u00c8\u0001\u0000\u0000\u0000\u00ca\u00cb\u0001\u0000\u0000\u0000"+ + "\u00cb\u0015\u0001\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000"+ + "\u00cd\u00ce\u0003\u0012\t\u0000\u00ce\u00cf\u0003\u0014\n\u0000\u00cf"+ + "\u0017\u0001\u0000\u0000\u0000\u00d0\u00d2\u0005\u0003\u0000\u0000\u00d1"+ + "\u00d3\u0005\u0003\u0000\u0000\u00d2\u00d1\u0001\u0000\u0000\u0000\u00d2"+ + "\u00d3\u0001\u0000\u0000\u0000\u00d3\u00d4\u0001\u0000\u0000\u0000\u00d4"+ + "\u00d5\u0003\u0006\u0003\u0000\u00d5\u0019\u0001\u0000\u0000\u0000\u00d6"+ + "\u00d8\u0005\u0003\u0000\u0000\u00d7\u00d9\u0005\u0003\u0000\u0000\u00d8"+ + "\u00d7\u0001\u0000\u0000\u0000\u00d8\u00d9\u0001\u0000\u0000\u0000\u00d9"+ + "\u001b\u0001\u0000\u0000\u0000\u00da\u00db\u0005\u0001\u0000\u0000\u00db"+ + "\u00dc\u0005p\u0000\u0000\u00dc\u00dd\u0003 \u0010\u0000\u00dd\u00de\u0005"+ + "\u0002\u0000\u0000\u00de\u001d\u0001\u0000\u0000\u0000\u00df\u00e0\u0007"+ + "\u0003\u0000\u0000\u00e0\u001f\u0001\u0000\u0000\u0000\u00e1\u00e2\u0007"+ + "\u0004\u0000\u0000\u00e2!\u0001\u0000\u0000\u0000\u00e3\u00e4\u0005\u0090"+ + "\u0000\u0000\u00e4#\u0001\u0000\u0000\u0000\u00e5\u00e9\u0003&\u0013\u0000"+ + "\u00e6\u00e9\u0003:\u001d\u0000\u00e7\u00e9\u0003@ \u0000\u00e8\u00e5"+ + "\u0001\u0000\u0000\u0000\u00e8\u00e6\u0001\u0000\u0000\u0000\u00e8\u00e7"+ + "\u0001\u0000\u0000\u0000\u00e9%\u0001\u0000\u0000\u0000\u00ea\u0126\u0005"+ + "\u0011\u0000\u0000\u00eb\u0126\u0005\r\u0000\u0000\u00ec\u0126\u0005\u0012"+ + "\u0000\u0000\u00ed\u0126\u00030\u0018\u0000\u00ee\u00ef\u0005\u0016\u0000"+ + "\u0000\u00ef\u0126\u0003 \u0010\u0000\u00f0\u00f1\u0005\u0017\u0000\u0000"+ + "\u00f1\u0126\u0003 \u0010\u0000\u00f2\u00f4\u0005\u0018\u0000\u0000\u00f3"+ + "\u00f5\u0003 \u0010\u0000\u00f4\u00f3\u0001\u0000\u0000\u0000\u00f5\u00f6"+ + "\u0001\u0000\u0000\u0000\u00f6\u00f4\u0001\u0000\u0000\u0000\u00f6\u00f7"+ + "\u0001\u0000\u0000\u0000\u00f7\u0126\u0001\u0000\u0000\u0000\u00f8\u0126"+ + "\u0005\u0019\u0000\u0000\u00f9\u00fa\u0005\u001e\u0000\u0000\u00fa\u0126"+ + "\u0003 \u0010\u0000\u00fb\u00fc\u0005 \u0000\u0000\u00fc\u0126\u0003 "+ + "\u0010\u0000\u00fd\u00fe\u0005!\u0000\u0000\u00fe\u0126\u0003 \u0010\u0000"+ + "\u00ff\u0100\u0005\"\u0000\u0000\u0100\u0126\u0003 \u0010\u0000\u0101"+ + "\u0102\u0005#\u0000\u0000\u0102\u0126\u0003 \u0010\u0000\u0103\u0104\u0005"+ + "$\u0000\u0000\u0104\u0126\u0003 \u0010\u0000\u0105\u0107\u0003,\u0016"+ + "\u0000\u0106\u0108\u0003(\u0014\u0000\u0107\u0106\u0001\u0000\u0000\u0000"+ + "\u0107\u0108\u0001\u0000\u0000\u0000\u0108\u010a\u0001\u0000\u0000\u0000"+ + "\u0109\u010b\u0003*\u0015\u0000\u010a\u0109\u0001\u0000\u0000\u0000\u010a"+ + "\u010b\u0001\u0000\u0000\u0000\u010b\u0126\u0001\u0000\u0000\u0000\u010c"+ + "\u010e\u0003.\u0017\u0000\u010d\u010f\u0003(\u0014\u0000\u010e\u010d\u0001"+ + "\u0000\u0000\u0000\u010e\u010f\u0001\u0000\u0000\u0000\u010f\u0111\u0001"+ + "\u0000\u0000\u0000\u0110\u0112\u0003*\u0015\u0000\u0111\u0110\u0001\u0000"+ + "\u0000\u0000\u0111\u0112\u0001\u0000\u0000\u0000\u0112\u0126\u0001\u0000"+ + "\u0000\u0000\u0113\u0126\u0005f\u0000\u0000\u0114\u0126\u0005g\u0000\u0000"+ + "\u0115\u0126\u0005h\u0000\u0000\u0116\u0126\u0005i\u0000\u0000\u0117\u0118"+ + "\u0005j\u0000\u0000\u0118\u0126\u0003 \u0010\u0000\u0119\u011a\u0005\b"+ + "\u0000\u0000\u011a\u0126\u0003\u001e\u000f\u0000\u011b\u0126\u0005\t\u0000"+ + "\u0000\u011c\u0126\u0005\u000e\u0000\u0000\u011d\u0126\u0005\u000f\u0000"+ + "\u0000\u011e\u0126\u0005\u0010\u0000\u0000\u011f\u0126\u0005k\u0000\u0000"+ + "\u0120\u0126\u0005l\u0000\u0000\u0121\u0126\u0005m\u0000\u0000\u0122\u0126"+ + "\u0005n\u0000\u0000\u0123\u0126\u0005o\u0000\u0000\u0124\u0126\u00032"+ + "\u0019\u0000\u0125\u00ea\u0001\u0000\u0000\u0000\u0125\u00eb\u0001\u0000"+ "\u0000\u0000\u0125\u00ec\u0001\u0000\u0000\u0000\u0125\u00ed\u0001\u0000"+ "\u0000\u0000\u0125\u00ee\u0001\u0000\u0000\u0000\u0125\u00f0\u0001\u0000"+ "\u0000\u0000\u0125\u00f2\u0001\u0000\u0000\u0000\u0125\u00f8\u0001\u0000"+ @@ -6752,351 +6799,358 @@ public final ModuleContext module() throws RecognitionException { "\"\u0011\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019e\u019f\u0001\u0000"+ "\u0000\u0000\u019f\u01a1\u0001\u0000\u0000\u0000\u01a0\u017e\u0001\u0000"+ "\u0000\u0000\u01a0\u0187\u0001\u0000\u0000\u0000\u01a0\u0190\u0001\u0000"+ - "\u0000\u0000\u01a1;\u0001\u0000\u0000\u0000\u01a2\u01a3\u0003\u0016\u000b"+ - "\u0000\u01a3=\u0001\u0000\u0000\u0000\u01a4\u01a5\u0003<\u001e\u0000\u01a5"+ - "\u01a6\u0003J%\u0000\u01a6?\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005"+ - "\u0001\u0000\u0000\u01a8\u01a9\u0003B!\u0000\u01a9\u01aa\u0005\u0002\u0000"+ - "\u0000\u01aaA\u0001\u0000\u0000\u0000\u01ab\u01af\u0003&\u0013\u0000\u01ac"+ - "\u01ae\u0003B!\u0000\u01ad\u01ac\u0001\u0000\u0000\u0000\u01ae\u01b1\u0001"+ - "\u0000\u0000\u0000\u01af\u01ad\u0001\u0000\u0000\u0000\u01af\u01b0\u0001"+ - "\u0000\u0000\u0000\u01b0\u01d4\u0001\u0000\u0000\u0000\u01b1\u01af\u0001"+ - "\u0000\u0000\u0000\u01b2\u01b3\u0005\u001f\u0000\u0000\u01b3\u01d4\u0003"+ - "D\"\u0000\u01b4\u01b6\u0005\u0013\u0000\u0000\u01b5\u01b7\u0003\"\u0011"+ - "\u0000\u01b6\u01b5\u0001\u0000\u0000\u0000\u01b6\u01b7\u0001\u0000\u0000"+ - "\u0000\u01b7\u01b8\u0001\u0000\u0000\u0000\u01b8\u01d4\u0003>\u001f\u0000"+ - "\u01b9\u01bb\u0005\u0014\u0000\u0000\u01ba\u01bc\u0003\"\u0011\u0000\u01bb"+ - "\u01ba\u0001\u0000\u0000\u0000\u01bb\u01bc\u0001\u0000\u0000\u0000\u01bc"+ - "\u01bd\u0001\u0000\u0000\u0000\u01bd\u01d4\u0003>\u001f\u0000\u01be\u01c0"+ - "\u0005\u001a\u0000\u0000\u01bf\u01c1\u0003\"\u0011\u0000\u01c0\u01bf\u0001"+ - "\u0000\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000\u01c1\u01c2\u0001"+ - "\u0000\u0000\u0000\u01c2\u01c6\u0003<\u001e\u0000\u01c3\u01c5\u0003@ "+ - "\u0000\u01c4\u01c3\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000"+ - "\u0000\u01c6\u01c4\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000"+ - "\u0000\u01c7\u01c9\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000"+ - "\u0000\u01c9\u01ca\u0005\u0001\u0000\u0000\u01ca\u01cb\u0005\u001b\u0000"+ - "\u0000\u01cb\u01d1\u0003J%\u0000\u01cc\u01cd\u0005\u0001\u0000\u0000\u01cd"+ - "\u01ce\u0005\u001c\u0000\u0000\u01ce\u01cf\u0003J%\u0000\u01cf\u01d0\u0005"+ - "\u0002\u0000\u0000\u01d0\u01d2\u0001\u0000\u0000\u0000\u01d1\u01cc\u0001"+ - "\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000\u01d2\u01d4\u0001"+ - "\u0000\u0000\u0000\u01d3\u01ab\u0001\u0000\u0000\u0000\u01d3\u01b2\u0001"+ - "\u0000\u0000\u0000\u01d3\u01b4\u0001\u0000\u0000\u0000\u01d3\u01b9\u0001"+ - "\u0000\u0000\u0000\u01d3\u01be\u0001\u0000\u0000\u0000\u01d4C\u0001\u0000"+ - "\u0000\u0000\u01d5\u01d7\u0003\u001c\u000e\u0000\u01d6\u01d5\u0001\u0000"+ - "\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7\u01d8\u0001\u0000"+ - "\u0000\u0000\u01d8\u01d9\u0003F#\u0000\u01d9E\u0001\u0000\u0000\u0000"+ - "\u01da\u01db\u0005\u0001\u0000\u0000\u01db\u01df\u0005t\u0000\u0000\u01dc"+ - "\u01de\u0003\n\u0005\u0000\u01dd\u01dc\u0001\u0000\u0000\u0000\u01de\u01e1"+ - "\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df\u01e0"+ - "\u0001\u0000\u0000\u0000\u01e0\u01e2\u0001\u0000\u0000\u0000\u01e1\u01df"+ - "\u0001\u0000\u0000\u0000\u01e2\u01e4\u0005\u0002\u0000\u0000\u01e3\u01da"+ - "\u0001\u0000\u0000\u0000\u01e4\u01e7\u0001\u0000\u0000\u0000\u01e5\u01e3"+ - "\u0001\u0000\u0000\u0000\u01e5\u01e6\u0001\u0000\u0000\u0000\u01e6\u01e8"+ - "\u0001\u0000\u0000\u0000\u01e7\u01e5\u0001\u0000\u0000\u0000\u01e8\u01e9"+ - "\u0003H$\u0000\u01e9G\u0001\u0000\u0000\u0000\u01ea\u01eb\u0005\u0001"+ - "\u0000\u0000\u01eb\u01ef\u0005u\u0000\u0000\u01ec\u01ee\u0003\n\u0005"+ - "\u0000\u01ed\u01ec\u0001\u0000\u0000\u0000\u01ee\u01f1\u0001\u0000\u0000"+ - "\u0000\u01ef\u01ed\u0001\u0000\u0000\u0000\u01ef\u01f0\u0001\u0000\u0000"+ - "\u0000\u01f0\u01f2\u0001\u0000\u0000\u0000\u01f1\u01ef\u0001\u0000\u0000"+ - "\u0000\u01f2\u01f4\u0005\u0002\u0000\u0000\u01f3\u01ea\u0001\u0000\u0000"+ - "\u0000\u01f4\u01f7\u0001\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000"+ - "\u0000\u01f5\u01f6\u0001\u0000\u0000\u0000\u01f6\u01fb\u0001\u0000\u0000"+ - "\u0000\u01f7\u01f5\u0001\u0000\u0000\u0000\u01f8\u01fa\u0003B!\u0000\u01f9"+ - "\u01f8\u0001\u0000\u0000\u0000\u01fa\u01fd\u0001\u0000\u0000\u0000\u01fb"+ - "\u01f9\u0001\u0000\u0000\u0000\u01fb\u01fc\u0001\u0000\u0000\u0000\u01fc"+ - "I\u0001\u0000\u0000\u0000\u01fd\u01fb\u0001\u0000\u0000\u0000\u01fe\u0200"+ - "\u0003$\u0012\u0000\u01ff\u01fe\u0001\u0000\u0000\u0000\u0200\u0203\u0001"+ - "\u0000\u0000\u0000\u0201\u01ff\u0001\u0000\u0000\u0000\u0201\u0202\u0001"+ - "\u0000\u0000\u0000\u0202\u0205\u0001\u0000\u0000\u0000\u0203\u0201\u0001"+ - "\u0000\u0000\u0000\u0204\u0206\u00032\u0019\u0000\u0205\u0204\u0001\u0000"+ - "\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206K\u0001\u0000\u0000"+ - "\u0000\u0207\u0208\u0003J%\u0000\u0208M\u0001\u0000\u0000\u0000\u0209"+ - "\u020a\u0005\u0001\u0000\u0000\u020a\u020c\u0005q\u0000\u0000\u020b\u020d"+ - "\u0003\"\u0011\u0000\u020c\u020b\u0001\u0000\u0000\u0000\u020c\u020d\u0001"+ - "\u0000\u0000\u0000\u020d\u020e\u0001\u0000\u0000\u0000\u020e\u020f\u0003"+ - "P(\u0000\u020f\u0210\u0005\u0002\u0000\u0000\u0210O\u0001\u0000\u0000"+ - "\u0000\u0211\u0213\u0003\u001c\u000e\u0000\u0212\u0211\u0001\u0000\u0000"+ - "\u0000\u0212\u0213\u0001\u0000\u0000\u0000\u0213\u0214\u0001\u0000\u0000"+ - "\u0000\u0214\u021f\u0003R)\u0000\u0215\u0217\u0003l6\u0000\u0216\u0218"+ - "\u0003\u001c\u000e\u0000\u0217\u0216\u0001\u0000\u0000\u0000\u0217\u0218"+ - "\u0001\u0000\u0000\u0000\u0218\u0219\u0001\u0000\u0000\u0000\u0219\u021a"+ - "\u0003\u0016\u000b\u0000\u021a\u021f\u0001\u0000\u0000\u0000\u021b\u021c"+ - "\u0003r9\u0000\u021c\u021d\u0003P(\u0000\u021d\u021f\u0001\u0000\u0000"+ - "\u0000\u021e\u0212\u0001\u0000\u0000\u0000\u021e\u0215\u0001\u0000\u0000"+ - "\u0000\u021e\u021b\u0001\u0000\u0000\u0000\u021fQ\u0001\u0000\u0000\u0000"+ - "\u0220\u0221\u0003\u0016\u000b\u0000\u0221\u0222\u0003T*\u0000\u0222S"+ - "\u0001\u0000\u0000\u0000\u0223\u0224\u0005\u0001\u0000\u0000\u0224\u022e"+ - "\u0005v\u0000\u0000\u0225\u0227\u0003\n\u0005\u0000\u0226\u0225\u0001"+ - "\u0000\u0000\u0000\u0227\u022a\u0001\u0000\u0000\u0000\u0228\u0226\u0001"+ - "\u0000\u0000\u0000\u0228\u0229\u0001\u0000\u0000\u0000\u0229\u022f\u0001"+ - "\u0000\u0000\u0000\u022a\u0228\u0001\u0000\u0000\u0000\u022b\u022c\u0003"+ - "\"\u0011\u0000\u022c\u022d\u0003\n\u0005\u0000\u022d\u022f\u0001\u0000"+ - "\u0000\u0000\u022e\u0228\u0001\u0000\u0000\u0000\u022e\u022b\u0001\u0000"+ - "\u0000\u0000\u022f\u0230\u0001\u0000\u0000\u0000\u0230\u0232\u0005\u0002"+ - "\u0000\u0000\u0231\u0223\u0001\u0000\u0000\u0000\u0232\u0235\u0001\u0000"+ - "\u0000\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000"+ - "\u0000\u0000\u0234\u0236\u0001\u0000\u0000\u0000\u0235\u0233\u0001\u0000"+ - "\u0000\u0000\u0236\u0237\u0003J%\u0000\u0237U\u0001\u0000\u0000\u0000"+ - "\u0238\u0239\u0005\u0001\u0000\u0000\u0239\u023a\u0005|\u0000\u0000\u023a"+ - "\u023b\u0003L&\u0000\u023b\u023c\u0005\u0002\u0000\u0000\u023c\u023f\u0001"+ - "\u0000\u0000\u0000\u023d\u023f\u0003B!\u0000\u023e\u0238\u0001\u0000\u0000"+ - "\u0000\u023e\u023d\u0001\u0000\u0000\u0000\u023fW\u0001\u0000\u0000\u0000"+ - "\u0240\u0241\u0005\u0001\u0000\u0000\u0241\u0243\u0005z\u0000\u0000\u0242"+ - "\u0244\u0003 \u0010\u0000\u0243\u0242\u0001\u0000\u0000\u0000\u0243\u0244"+ - "\u0001\u0000\u0000\u0000\u0244\u0245\u0001\u0000\u0000\u0000\u0245\u0246"+ - "\u0005\u0001\u0000\u0000\u0246\u0247\u0003$\u0012\u0000\u0247\u024b\u0005"+ - "\u0002\u0000\u0000\u0248\u024a\u0003 \u0010\u0000\u0249\u0248\u0001\u0000"+ - "\u0000\u0000\u024a\u024d\u0001\u0000\u0000\u0000\u024b\u0249\u0001\u0000"+ - "\u0000\u0000\u024b\u024c\u0001\u0000\u0000\u0000\u024c\u024e\u0001\u0000"+ - "\u0000\u0000\u024d\u024b\u0001\u0000\u0000\u0000\u024e\u024f\u0005\u0002"+ - "\u0000\u0000\u024f\u025f\u0001\u0000\u0000\u0000\u0250\u0251\u0005\u0001"+ - "\u0000\u0000\u0251\u0253\u0005z\u0000\u0000\u0252\u0254\u0003 \u0010\u0000"+ - "\u0253\u0252\u0001\u0000\u0000\u0000\u0253\u0254\u0001\u0000\u0000\u0000"+ - "\u0254\u0255\u0001\u0000\u0000\u0000\u0255\u0259\u0003V+\u0000\u0256\u0258"+ - "\u0003 \u0010\u0000\u0257\u0256\u0001\u0000\u0000\u0000\u0258\u025b\u0001"+ - "\u0000\u0000\u0000\u0259\u0257\u0001\u0000\u0000\u0000\u0259\u025a\u0001"+ - "\u0000\u0000\u0000\u025a\u025c\u0001\u0000\u0000\u0000\u025b\u0259\u0001"+ - "\u0000\u0000\u0000\u025c\u025d\u0005\u0002\u0000\u0000\u025d\u025f\u0001"+ - "\u0000\u0000\u0000\u025e\u0240\u0001\u0000\u0000\u0000\u025e\u0250\u0001"+ - "\u0000\u0000\u0000\u025fY\u0001\u0000\u0000\u0000\u0260\u0261\u0005\u0001"+ - "\u0000\u0000\u0261\u0263\u0005x\u0000\u0000\u0262\u0264\u0003\"\u0011"+ - "\u0000\u0263\u0262\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000"+ - "\u0000\u0264\u0265\u0001\u0000\u0000\u0000\u0265\u0266\u0003\\.\u0000"+ - "\u0266\u0267\u0005\u0002\u0000\u0000\u0267[\u0001\u0000\u0000\u0000\u0268"+ - "\u027b\u0003\u0018\f\u0000\u0269\u026a\u0003l6\u0000\u026a\u026b\u0003"+ - "\u0018\f\u0000\u026b\u027b\u0001\u0000\u0000\u0000\u026c\u026d\u0003r"+ - "9\u0000\u026d\u026e\u0003\\.\u0000\u026e\u027b\u0001\u0000\u0000\u0000"+ - "\u026f\u0270\u0003\u0006\u0003\u0000\u0270\u0271\u0005\u0001\u0000\u0000"+ - "\u0271\u0275\u0005z\u0000\u0000\u0272\u0274\u0003 \u0010\u0000\u0273\u0272"+ - "\u0001\u0000\u0000\u0000\u0274\u0277\u0001\u0000\u0000\u0000\u0275\u0273"+ - "\u0001\u0000\u0000\u0000\u0275\u0276\u0001\u0000\u0000\u0000\u0276\u0278"+ - "\u0001\u0000\u0000\u0000\u0277\u0275\u0001\u0000\u0000\u0000\u0278\u0279"+ - "\u0005\u0002\u0000\u0000\u0279\u027b\u0001\u0000\u0000\u0000\u027a\u0268"+ - "\u0001\u0000\u0000\u0000\u027a\u0269\u0001\u0000\u0000\u0000\u027a\u026c"+ - "\u0001\u0000\u0000\u0000\u027a\u026f\u0001\u0000\u0000\u0000\u027b]\u0001"+ - "\u0000\u0000\u0000\u027c\u027d\u0005\u0001\u0000\u0000\u027d\u027f\u0005"+ - "{\u0000\u0000\u027e\u0280\u0003 \u0010\u0000\u027f\u027e\u0001\u0000\u0000"+ - "\u0000\u027f\u0280\u0001\u0000\u0000\u0000\u0280\u0281\u0001\u0000\u0000"+ - "\u0000\u0281\u0282\u0005\u0001\u0000\u0000\u0282\u0283\u0003$\u0012\u0000"+ - "\u0283\u0287\u0005\u0002\u0000\u0000\u0284\u0286\u0005\u0006\u0000\u0000"+ - "\u0285\u0284\u0001\u0000\u0000\u0000\u0286\u0289\u0001\u0000\u0000\u0000"+ - "\u0287\u0285\u0001\u0000\u0000\u0000\u0287\u0288\u0001\u0000\u0000\u0000"+ - "\u0288\u028a\u0001\u0000\u0000\u0000\u0289\u0287\u0001\u0000\u0000\u0000"+ - "\u028a\u028b\u0005\u0002\u0000\u0000\u028b\u029b\u0001\u0000\u0000\u0000"+ - "\u028c\u028d\u0005\u0001\u0000\u0000\u028d\u028f\u0005{\u0000\u0000\u028e"+ - "\u0290\u0003 \u0010\u0000\u028f\u028e\u0001\u0000\u0000\u0000\u028f\u0290"+ - "\u0001\u0000\u0000\u0000\u0290\u0291\u0001\u0000\u0000\u0000\u0291\u0295"+ - "\u0003V+\u0000\u0292\u0294\u0005\u0006\u0000\u0000\u0293\u0292\u0001\u0000"+ - "\u0000\u0000\u0294\u0297\u0001\u0000\u0000\u0000\u0295\u0293\u0001\u0000"+ - "\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296\u0298\u0001\u0000"+ - "\u0000\u0000\u0297\u0295\u0001\u0000\u0000\u0000\u0298\u0299\u0005\u0002"+ - "\u0000\u0000\u0299\u029b\u0001\u0000\u0000\u0000\u029a\u027c\u0001\u0000"+ - "\u0000\u0000\u029a\u028c\u0001\u0000\u0000\u0000\u029b_\u0001\u0000\u0000"+ - "\u0000\u029c\u029d\u0005\u0001\u0000\u0000\u029d\u029f\u0005y\u0000\u0000"+ - "\u029e\u02a0\u0003\"\u0011\u0000\u029f\u029e\u0001\u0000\u0000\u0000\u029f"+ - "\u02a0\u0001\u0000\u0000\u0000\u02a0\u02a1\u0001\u0000\u0000\u0000\u02a1"+ - "\u02a2\u0003b1\u0000\u02a2\u02a3\u0005\u0002\u0000\u0000\u02a3a\u0001"+ - "\u0000\u0000\u0000\u02a4\u02b5\u0003\u001a\r\u0000\u02a5\u02a6\u0003l"+ - "6\u0000\u02a6\u02a7\u0003\u001a\r\u0000\u02a7\u02b5\u0001\u0000\u0000"+ - "\u0000\u02a8\u02a9\u0003r9\u0000\u02a9\u02aa\u0003b1\u0000\u02aa\u02b5"+ - "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0005\u0001\u0000\u0000\u02ac\u02b0"+ - "\u0005{\u0000\u0000\u02ad\u02af\u0005\u0006\u0000\u0000\u02ae\u02ad\u0001"+ - "\u0000\u0000\u0000\u02af\u02b2\u0001\u0000\u0000\u0000\u02b0\u02ae\u0001"+ - "\u0000\u0000\u0000\u02b0\u02b1\u0001\u0000\u0000\u0000\u02b1\u02b3\u0001"+ - "\u0000\u0000\u0000\u02b2\u02b0\u0001\u0000\u0000\u0000\u02b3\u02b5\u0005"+ - "\u0002\u0000\u0000\u02b4\u02a4\u0001\u0000\u0000\u0000\u02b4\u02a5\u0001"+ - "\u0000\u0000\u0000\u02b4\u02a8\u0001\u0000\u0000\u0000\u02b4\u02ab\u0001"+ - "\u0000\u0000\u0000\u02b5c\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005\u0001"+ - "\u0000\u0000\u02b7\u02b9\u0005w\u0000\u0000\u02b8\u02ba\u0003\"\u0011"+ - "\u0000\u02b9\u02b8\u0001\u0000\u0000\u0000\u02b9\u02ba\u0001\u0000\u0000"+ - "\u0000\u02ba\u02bb\u0001\u0000\u0000\u0000\u02bb\u02bc\u0003f3\u0000\u02bc"+ - "\u02bd\u0005\u0002\u0000\u0000\u02bde\u0001\u0000\u0000\u0000\u02be\u02bf"+ - "\u0003\u000e\u0007\u0000\u02bf\u02c0\u0003L&\u0000\u02c0\u02c8\u0001\u0000"+ - "\u0000\u0000\u02c1\u02c2\u0003l6\u0000\u02c2\u02c3\u0003\u000e\u0007\u0000"+ - "\u02c3\u02c8\u0001\u0000\u0000\u0000\u02c4\u02c5\u0003r9\u0000\u02c5\u02c6"+ - "\u0003f3\u0000\u02c6\u02c8\u0001\u0000\u0000\u0000\u02c7\u02be\u0001\u0000"+ - "\u0000\u0000\u02c7\u02c1\u0001\u0000\u0000\u0000\u02c7\u02c4\u0001\u0000"+ - "\u0000\u0000\u02c8g\u0001\u0000\u0000\u0000\u02c9\u02ca\u0005\u0001\u0000"+ - "\u0000\u02ca\u02cc\u0005q\u0000\u0000\u02cb\u02cd\u0003\"\u0011\u0000"+ - "\u02cc\u02cb\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000"+ - "\u02cd\u02ce\u0001\u0000\u0000\u0000\u02ce\u02cf\u0003\u001c\u000e\u0000"+ - "\u02cf\u02d0\u0005\u0002\u0000\u0000\u02d0\u02f2\u0001\u0000\u0000\u0000"+ - "\u02d1\u02d2\u0005\u0001\u0000\u0000\u02d2\u02d4\u0005q\u0000\u0000\u02d3"+ - "\u02d5\u0003\"\u0011\u0000\u02d4\u02d3\u0001\u0000\u0000\u0000\u02d4\u02d5"+ - "\u0001\u0000\u0000\u0000\u02d5\u02d6\u0001\u0000\u0000\u0000\u02d6\u02d7"+ - "\u0003\u0016\u000b\u0000\u02d7\u02d8\u0005\u0002\u0000\u0000\u02d8\u02f2"+ - "\u0001\u0000\u0000\u0000\u02d9\u02da\u0005\u0001\u0000\u0000\u02da\u02dc"+ - "\u0005x\u0000\u0000\u02db\u02dd\u0003\"\u0011\u0000\u02dc\u02db\u0001"+ - "\u0000\u0000\u0000\u02dc\u02dd\u0001\u0000\u0000\u0000\u02dd\u02de\u0001"+ - "\u0000\u0000\u0000\u02de\u02df\u0003\u0018\f\u0000\u02df\u02e0\u0005\u0002"+ - "\u0000\u0000\u02e0\u02f2\u0001\u0000\u0000\u0000\u02e1\u02e2\u0005\u0001"+ - "\u0000\u0000\u02e2\u02e4\u0005y\u0000\u0000\u02e3\u02e5\u0003\"\u0011"+ - "\u0000\u02e4\u02e3\u0001\u0000\u0000\u0000\u02e4\u02e5\u0001\u0000\u0000"+ - "\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7\u0003\u001a\r\u0000"+ - "\u02e7\u02e8\u0005\u0002\u0000\u0000\u02e8\u02f2\u0001\u0000\u0000\u0000"+ - "\u02e9\u02ea\u0005\u0001\u0000\u0000\u02ea\u02ec\u0005w\u0000\u0000\u02eb"+ - "\u02ed\u0003\"\u0011\u0000\u02ec\u02eb\u0001\u0000\u0000\u0000\u02ec\u02ed"+ - "\u0001\u0000\u0000\u0000\u02ed\u02ee\u0001\u0000\u0000\u0000\u02ee\u02ef"+ - "\u0003\u000e\u0007\u0000\u02ef\u02f0\u0005\u0002\u0000\u0000\u02f0\u02f2"+ - "\u0001\u0000\u0000\u0000\u02f1\u02c9\u0001\u0000\u0000\u0000\u02f1\u02d1"+ - "\u0001\u0000\u0000\u0000\u02f1\u02d9\u0001\u0000\u0000\u0000\u02f1\u02e1"+ - "\u0001\u0000\u0000\u0000\u02f1\u02e9\u0001\u0000\u0000\u0000\u02f2i\u0001"+ - "\u0000\u0000\u0000\u02f3\u02f4\u0005\u0001\u0000\u0000\u02f4\u02f5\u0005"+ - "}\u0000\u0000\u02f5\u02f6\u0003\u0002\u0001\u0000\u02f6\u02f7\u0003\u0002"+ - "\u0001\u0000\u02f7\u02f8\u0003h4\u0000\u02f8\u02f9\u0005\u0002\u0000\u0000"+ - "\u02f9k\u0001\u0000\u0000\u0000\u02fa\u02fb\u0005\u0001\u0000\u0000\u02fb"+ - "\u02fc\u0005}\u0000\u0000\u02fc\u02fd\u0003\u0002\u0001\u0000\u02fd\u02fe"+ - "\u0003\u0002\u0001\u0000\u02fe\u02ff\u0005\u0002\u0000\u0000\u02ffm\u0001"+ - "\u0000\u0000\u0000\u0300\u0301\u0005\u0001\u0000\u0000\u0301\u0302\u0005"+ - "q\u0000\u0000\u0302\u0303\u0003 \u0010\u0000\u0303\u0304\u0005\u0002\u0000"+ - "\u0000\u0304\u0315\u0001\u0000\u0000\u0000\u0305\u0306\u0005\u0001\u0000"+ - "\u0000\u0306\u0307\u0005x\u0000\u0000\u0307\u0308\u0003 \u0010\u0000\u0308"+ - "\u0309\u0005\u0002\u0000\u0000\u0309\u0315\u0001\u0000\u0000\u0000\u030a"+ - "\u030b\u0005\u0001\u0000\u0000\u030b\u030c\u0005y\u0000\u0000\u030c\u030d"+ - "\u0003 \u0010\u0000\u030d\u030e\u0005\u0002\u0000\u0000\u030e\u0315\u0001"+ - "\u0000\u0000\u0000\u030f\u0310\u0005\u0001\u0000\u0000\u0310\u0311\u0005"+ - "w\u0000\u0000\u0311\u0312\u0003 \u0010\u0000\u0312\u0313\u0005\u0002\u0000"+ - "\u0000\u0313\u0315\u0001\u0000\u0000\u0000\u0314\u0300\u0001\u0000\u0000"+ - "\u0000\u0314\u0305\u0001\u0000\u0000\u0000\u0314\u030a\u0001\u0000\u0000"+ - "\u0000\u0314\u030f\u0001\u0000\u0000\u0000\u0315o\u0001\u0000\u0000\u0000"+ - "\u0316\u0317\u0005\u0001\u0000\u0000\u0317\u0318\u0005~\u0000\u0000\u0318"+ - "\u0319\u0003\u0002\u0001\u0000\u0319\u031a\u0003n7\u0000\u031a\u031b\u0005"+ - "\u0002\u0000\u0000\u031bq\u0001\u0000\u0000\u0000\u031c\u031d\u0005\u0001"+ - "\u0000\u0000\u031d\u031e\u0005~\u0000\u0000\u031e\u031f\u0003\u0002\u0001"+ - "\u0000\u031f\u0320\u0005\u0002\u0000\u0000\u0320s\u0001\u0000\u0000\u0000"+ - "\u0321\u0322\u0005\u0001\u0000\u0000\u0322\u0324\u0005p\u0000\u0000\u0323"+ - "\u0325\u0003\"\u0011\u0000\u0324\u0323\u0001\u0000\u0000\u0000\u0324\u0325"+ - "\u0001\u0000\u0000\u0000\u0325\u0326\u0001\u0000\u0000\u0000\u0326\u0327"+ - "\u0003\u0010\b\u0000\u0327\u0328\u0005\u0002\u0000\u0000\u0328u\u0001"+ - "\u0000\u0000\u0000\u0329\u032a\u0005\u0001\u0000\u0000\u032a\u032b\u0005"+ - "s\u0000\u0000\u032b\u032c\u0003 \u0010\u0000\u032c\u032d\u0005\u0002\u0000"+ - "\u0000\u032dw\u0001\u0000\u0000\u0000\u032e\u0339\u0003t:\u0000\u032f"+ - "\u0339\u0003d2\u0000\u0330\u0339\u0003Z-\u0000\u0331\u0339\u0003`0\u0000"+ - "\u0332\u0339\u0003N\'\u0000\u0333\u0339\u0003X,\u0000\u0334\u0339\u0003"+ - "^/\u0000\u0335\u0339\u0003v;\u0000\u0336\u0339\u0003j5\u0000\u0337\u0339"+ - "\u0003p8\u0000\u0338\u032e\u0001\u0000\u0000\u0000\u0338\u032f\u0001\u0000"+ - "\u0000\u0000\u0338\u0330\u0001\u0000\u0000\u0000\u0338\u0331\u0001\u0000"+ - "\u0000\u0000\u0338\u0332\u0001\u0000\u0000\u0000\u0338\u0333\u0001\u0000"+ - "\u0000\u0000\u0338\u0334\u0001\u0000\u0000\u0000\u0338\u0335\u0001\u0000"+ - "\u0000\u0000\u0338\u0336\u0001\u0000\u0000\u0000\u0338\u0337\u0001\u0000"+ - "\u0000\u0000\u0339y\u0001\u0000\u0000\u0000\u033a\u033b\u0005\u0001\u0000"+ - "\u0000\u033b\u033d\u0005\u007f\u0000\u0000\u033c\u033e\u0005\u0090\u0000"+ - "\u0000\u033d\u033c\u0001\u0000\u0000\u0000\u033d\u033e\u0001\u0000\u0000"+ - "\u0000\u033e\u0342\u0001\u0000\u0000\u0000\u033f\u0341\u0003x<\u0000\u0340"+ - "\u033f\u0001\u0000\u0000\u0000\u0341\u0344\u0001\u0000\u0000\u0000\u0342"+ - "\u0340\u0001\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343"+ - "\u0345\u0001\u0000\u0000\u0000\u0344\u0342\u0001\u0000\u0000\u0000\u0345"+ - "\u0346\u0005\u0002\u0000\u0000\u0346{\u0001\u0000\u0000\u0000\u0347\u0356"+ - "\u0003z=\u0000\u0348\u0349\u0005\u0001\u0000\u0000\u0349\u034b\u0005\u007f"+ - "\u0000\u0000\u034a\u034c\u0005\u0090\u0000\u0000\u034b\u034a\u0001\u0000"+ - "\u0000\u0000\u034b\u034c\u0001\u0000\u0000\u0000\u034c\u034d\u0001\u0000"+ - "\u0000\u0000\u034d\u0351\u0007\u0005\u0000\u0000\u034e\u0350\u0005\u0006"+ - "\u0000\u0000\u034f\u034e\u0001\u0000\u0000\u0000\u0350\u0353\u0001\u0000"+ - "\u0000\u0000\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0352\u0001\u0000"+ - "\u0000\u0000\u0352\u0354\u0001\u0000\u0000\u0000\u0353\u0351\u0001\u0000"+ - "\u0000\u0000\u0354\u0356\u0005\u0002\u0000\u0000\u0355\u0347\u0001\u0000"+ - "\u0000\u0000\u0355\u0348\u0001\u0000\u0000\u0000\u0356}\u0001\u0000\u0000"+ - "\u0000\u0357\u0358\u0005\u0001\u0000\u0000\u0358\u035a\u0005\u0084\u0000"+ - "\u0000\u0359\u035b\u0005\u0090\u0000\u0000\u035a\u0359\u0001\u0000\u0000"+ - "\u0000\u035a\u035b\u0001\u0000\u0000\u0000\u035b\u035c\u0001\u0000\u0000"+ - "\u0000\u035c\u035d\u0003\u0002\u0001\u0000\u035d\u035e\u0003\u0088D\u0000"+ - "\u035e\u035f\u0005\u0002\u0000\u0000\u035f\u0369\u0001\u0000\u0000\u0000"+ - "\u0360\u0361\u0005\u0001\u0000\u0000\u0361\u0363\u0005\u0085\u0000\u0000"+ - "\u0362\u0364\u0005\u0090\u0000\u0000\u0363\u0362\u0001\u0000\u0000\u0000"+ - "\u0363\u0364\u0001\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000"+ - "\u0365\u0366\u0003\u0002\u0001\u0000\u0366\u0367\u0005\u0002\u0000\u0000"+ - "\u0367\u0369\u0001\u0000\u0000\u0000\u0368\u0357\u0001\u0000\u0000\u0000"+ - "\u0368\u0360\u0001\u0000\u0000\u0000\u0369\u007f\u0001\u0000\u0000\u0000"+ - "\u036a\u036b\u0005\u0001\u0000\u0000\u036b\u036c\u0005\u0086\u0000\u0000"+ - "\u036c\u036d\u0003|>\u0000\u036d\u036e\u0005\u0006\u0000\u0000\u036e\u036f"+ - "\u0005\u0002\u0000\u0000\u036f\u039f\u0001\u0000\u0000\u0000\u0370\u0371"+ - "\u0005\u0001\u0000\u0000\u0371\u0372\u0005\u0087\u0000\u0000\u0372\u0373"+ - "\u0003|>\u0000\u0373\u0374\u0005\u0006\u0000\u0000\u0374\u0375\u0005\u0002"+ - "\u0000\u0000\u0375\u039f\u0001\u0000\u0000\u0000\u0376\u0377\u0005\u0001"+ - "\u0000\u0000\u0377\u0378\u0005\u0088\u0000\u0000\u0378\u0379\u0003|>\u0000"+ - "\u0379\u037a\u0005\u0006\u0000\u0000\u037a\u037b\u0005\u0002\u0000\u0000"+ - "\u037b\u039f\u0001\u0000\u0000\u0000\u037c\u037d\u0005\u0001\u0000\u0000"+ - "\u037d\u037e\u0005\u008c\u0000\u0000\u037e\u037f\u0003|>\u0000\u037f\u0380"+ - "\u0005\u0006\u0000\u0000\u0380\u0381\u0005\u0002\u0000\u0000\u0381\u039f"+ - "\u0001\u0000\u0000\u0000\u0382\u0383\u0005\u0001\u0000\u0000\u0383\u0384"+ - "\u0005\u0089\u0000\u0000\u0384\u0385\u0003~?\u0000\u0385\u0386\u0003\u0088"+ - "D\u0000\u0386\u0387\u0005\u0002\u0000\u0000\u0387\u039f\u0001\u0000\u0000"+ - "\u0000\u0388\u0389\u0005\u0001\u0000\u0000\u0389\u038a\u0005\u008a\u0000"+ - "\u0000\u038a\u038b\u0003~?\u0000\u038b\u038c\u0005\u0002\u0000\u0000\u038c"+ - "\u039f\u0001\u0000\u0000\u0000\u038d\u038e\u0005\u0001\u0000\u0000\u038e"+ - "\u038f\u0005\u008b\u0000\u0000\u038f\u0390\u0003~?\u0000\u0390\u0391\u0005"+ - "\u0002\u0000\u0000\u0391\u039f\u0001\u0000\u0000\u0000\u0392\u0393\u0005"+ - "\u0001\u0000\u0000\u0393\u0394\u0005\u008c\u0000\u0000\u0394\u0395\u0003"+ - "~?\u0000\u0395\u0396\u0005\u0006\u0000\u0000\u0396\u0397\u0005\u0002\u0000"+ - "\u0000\u0397\u039f\u0001\u0000\u0000\u0000\u0398\u0399\u0005\u0001\u0000"+ - "\u0000\u0399\u039a\u0005\u008d\u0000\u0000\u039a\u039b\u0003~?\u0000\u039b"+ - "\u039c\u0005\u0006\u0000\u0000\u039c\u039d\u0005\u0002\u0000\u0000\u039d"+ - "\u039f\u0001\u0000\u0000\u0000\u039e\u036a\u0001\u0000\u0000\u0000\u039e"+ - "\u0370\u0001\u0000\u0000\u0000\u039e\u0376\u0001\u0000\u0000\u0000\u039e"+ - "\u037c\u0001\u0000\u0000\u0000\u039e\u0382\u0001\u0000\u0000\u0000\u039e"+ - "\u0388\u0001\u0000\u0000\u0000\u039e\u038d\u0001\u0000\u0000\u0000\u039e"+ - "\u0392\u0001\u0000\u0000\u0000\u039e\u0398\u0001\u0000\u0000\u0000\u039f"+ - "\u0081\u0001\u0000\u0000\u0000\u03a0\u03ad\u0003~?\u0000\u03a1\u03ad\u0003"+ - "\u0080@\u0000\u03a2\u03ad\u0003|>\u0000\u03a3\u03a4\u0005\u0001\u0000"+ - "\u0000\u03a4\u03a5\u0005\u0083\u0000\u0000\u03a5\u03a7\u0003\u0002\u0001"+ - "\u0000\u03a6\u03a8\u0005\u0090\u0000\u0000\u03a7\u03a6\u0001\u0000\u0000"+ - "\u0000\u03a7\u03a8\u0001\u0000\u0000\u0000\u03a8\u03a9\u0001\u0000\u0000"+ - "\u0000\u03a9\u03aa\u0005\u0002\u0000\u0000\u03aa\u03ad\u0001\u0000\u0000"+ - "\u0000\u03ab\u03ad\u0003\u0084B\u0000\u03ac\u03a0\u0001\u0000\u0000\u0000"+ - "\u03ac\u03a1\u0001\u0000\u0000\u0000\u03ac\u03a2\u0001\u0000\u0000\u0000"+ - "\u03ac\u03a3\u0001\u0000\u0000\u0000\u03ac\u03ab\u0001\u0000\u0000\u0000"+ - "\u03ad\u0083\u0001\u0000\u0000\u0000\u03ae\u03af\u0005\u0001\u0000\u0000"+ - "\u03af\u03b1\u0005\u0082\u0000\u0000\u03b0\u03b2\u0005\u0090\u0000\u0000"+ - "\u03b1\u03b0\u0001\u0000\u0000\u0000\u03b1\u03b2\u0001\u0000\u0000\u0000"+ - "\u03b2\u03b6\u0001\u0000\u0000\u0000\u03b3\u03b5\u0003\u0082A\u0000\u03b4"+ - "\u03b3\u0001\u0000\u0000\u0000\u03b5\u03b8\u0001\u0000\u0000\u0000\u03b6"+ - "\u03b4\u0001\u0000\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7"+ - "\u03b9\u0001\u0000\u0000\u0000\u03b8\u03b6\u0001\u0000\u0000\u0000\u03b9"+ - "\u03cf\u0005\u0002\u0000\u0000\u03ba\u03bb\u0005\u0001\u0000\u0000\u03bb"+ - "\u03bd\u0005\u008e\u0000\u0000\u03bc\u03be\u0005\u0090\u0000\u0000\u03bd"+ - "\u03bc\u0001\u0000\u0000\u0000\u03bd\u03be\u0001\u0000\u0000\u0000\u03be"+ - "\u03bf\u0001\u0000\u0000\u0000\u03bf\u03c0\u0005\u0006\u0000\u0000\u03c0"+ - "\u03cf\u0005\u0002\u0000\u0000\u03c1\u03c2\u0005\u0001\u0000\u0000\u03c2"+ - "\u03c4\u0005\u008f\u0000\u0000\u03c3\u03c5\u0005\u0090\u0000\u0000\u03c4"+ - "\u03c3\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001\u0000\u0000\u0000\u03c5"+ - "\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0005\u0006\u0000\u0000\u03c7"+ - "\u03cf\u0005\u0002\u0000\u0000\u03c8\u03c9\u0005\u0001\u0000\u0000\u03c9"+ - "\u03cb\u0005\u008f\u0000\u0000\u03ca\u03cc\u0005\u0090\u0000\u0000\u03cb"+ - "\u03ca\u0001\u0000\u0000\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000\u03cc"+ - "\u03cd\u0001\u0000\u0000\u0000\u03cd\u03cf\u0005\u0002\u0000\u0000\u03ce"+ - "\u03ae\u0001\u0000\u0000\u0000\u03ce\u03ba\u0001\u0000\u0000\u0000\u03ce"+ - "\u03c1\u0001\u0000\u0000\u0000\u03ce\u03c8\u0001\u0000\u0000\u0000\u03cf"+ - "\u0085\u0001\u0000\u0000\u0000\u03d0\u03d1\u0005\u0001\u0000\u0000\u03d1"+ - "\u03d2\u0005\b\u0000\u0000\u03d2\u03d3\u0003\u001e\u000f\u0000\u03d3\u03d4"+ - "\u0005\u0002\u0000\u0000\u03d4\u0087\u0001\u0000\u0000\u0000\u03d5\u03d7"+ - "\u0003\u0086C\u0000\u03d6\u03d5\u0001\u0000\u0000\u0000\u03d7\u03da\u0001"+ - "\u0000\u0000\u0000\u03d8\u03d6\u0001\u0000\u0000\u0000\u03d8\u03d9\u0001"+ - "\u0000\u0000\u0000\u03d9\u0089\u0001\u0000\u0000\u0000\u03da\u03d8\u0001"+ - "\u0000\u0000\u0000\u03db\u03dd\u0003\u0082A\u0000\u03dc\u03db\u0001\u0000"+ - "\u0000\u0000\u03dd\u03e0\u0001\u0000\u0000\u0000\u03de\u03dc\u0001\u0000"+ - "\u0000\u0000\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e1\u0001\u0000"+ - "\u0000\u0000\u03e0\u03de\u0001\u0000\u0000\u0000\u03e1\u03ea\u0005\u0000"+ - "\u0000\u0001\u03e2\u03e4\u0003x<\u0000\u03e3\u03e2\u0001\u0000\u0000\u0000"+ - "\u03e4\u03e5\u0001\u0000\u0000\u0000\u03e5\u03e3\u0001\u0000\u0000\u0000"+ - "\u03e5\u03e6\u0001\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000"+ - "\u03e7\u03e8\u0005\u0000\u0000\u0001\u03e8\u03ea\u0001\u0000\u0000\u0000"+ - "\u03e9\u03de\u0001\u0000\u0000\u0000\u03e9\u03e3\u0001\u0000\u0000\u0000"+ - "\u03ea\u008b\u0001\u0000\u0000\u0000\u03eb\u03ec\u0003z=\u0000\u03ec\u03ed"+ - "\u0005\u0000\u0000\u0001\u03ed\u03f6\u0001\u0000\u0000\u0000\u03ee\u03f0"+ - "\u0003x<\u0000\u03ef\u03ee\u0001\u0000\u0000\u0000\u03f0\u03f3\u0001\u0000"+ - "\u0000\u0000\u03f1\u03ef\u0001\u0000\u0000\u0000\u03f1\u03f2\u0001\u0000"+ - "\u0000\u0000\u03f2\u03f4\u0001\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000"+ - "\u0000\u0000\u03f4\u03f6\u0005\u0000\u0000\u0001\u03f5\u03eb\u0001\u0000"+ - "\u0000\u0000\u03f5\u03f1\u0001\u0000\u0000\u0000\u03f6\u008d\u0001\u0000"+ - "\u0000\u0000m\u009b\u00a5\u00b1\u00b7\u00bc\u00c4\u00ca\u00d2\u00d8\u00e8"+ + "\u0000\u0000\u01a1;\u0001\u0000\u0000\u0000\u01a2\u01a3\u0005\u0001\u0000"+ + "\u0000\u01a3\u01a4\u0005u\u0000\u0000\u01a4\u01a5\u0003\n\u0005\u0000"+ + "\u01a5\u01a6\u0005\u0002\u0000\u0000\u01a6\u01a8\u0001\u0000\u0000\u0000"+ + "\u01a7\u01a2\u0001\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000"+ + "\u01a8\u01ae\u0001\u0000\u0000\u0000\u01a9\u01aa\u0003\u001c\u000e\u0000"+ + "\u01aa\u01ab\u0003\u0016\u000b\u0000\u01ab\u01ae\u0001\u0000\u0000\u0000"+ + "\u01ac\u01ae\u0003\u0016\u000b\u0000\u01ad\u01a7\u0001\u0000\u0000\u0000"+ + "\u01ad\u01a9\u0001\u0000\u0000\u0000\u01ad\u01ac\u0001\u0000\u0000\u0000"+ + "\u01ae=\u0001\u0000\u0000\u0000\u01af\u01b0\u0003<\u001e\u0000\u01b0\u01b1"+ + "\u0003J%\u0000\u01b1?\u0001\u0000\u0000\u0000\u01b2\u01b3\u0005\u0001"+ + "\u0000\u0000\u01b3\u01b4\u0003B!\u0000\u01b4\u01b5\u0005\u0002\u0000\u0000"+ + "\u01b5A\u0001\u0000\u0000\u0000\u01b6\u01ba\u0003&\u0013\u0000\u01b7\u01b9"+ + "\u0003B!\u0000\u01b8\u01b7\u0001\u0000\u0000\u0000\u01b9\u01bc\u0001\u0000"+ + "\u0000\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01ba\u01bb\u0001\u0000"+ + "\u0000\u0000\u01bb\u01df\u0001\u0000\u0000\u0000\u01bc\u01ba\u0001\u0000"+ + "\u0000\u0000\u01bd\u01be\u0005\u001f\u0000\u0000\u01be\u01df\u0003D\""+ + "\u0000\u01bf\u01c1\u0005\u0013\u0000\u0000\u01c0\u01c2\u0003\"\u0011\u0000"+ + "\u01c1\u01c0\u0001\u0000\u0000\u0000\u01c1\u01c2\u0001\u0000\u0000\u0000"+ + "\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01df\u0003>\u001f\u0000\u01c4"+ + "\u01c6\u0005\u0014\u0000\u0000\u01c5\u01c7\u0003\"\u0011\u0000\u01c6\u01c5"+ + "\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7\u01c8"+ + "\u0001\u0000\u0000\u0000\u01c8\u01df\u0003>\u001f\u0000\u01c9\u01cb\u0005"+ + "\u001a\u0000\u0000\u01ca\u01cc\u0003\"\u0011\u0000\u01cb\u01ca\u0001\u0000"+ + "\u0000\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc\u01cd\u0001\u0000"+ + "\u0000\u0000\u01cd\u01d1\u0003<\u001e\u0000\u01ce\u01d0\u0003@ \u0000"+ + "\u01cf\u01ce\u0001\u0000\u0000\u0000\u01d0\u01d3\u0001\u0000\u0000\u0000"+ + "\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000"+ + "\u01d2\u01d4\u0001\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000"+ + "\u01d4\u01d5\u0005\u0001\u0000\u0000\u01d5\u01d6\u0005\u001b\u0000\u0000"+ + "\u01d6\u01dc\u0003J%\u0000\u01d7\u01d8\u0005\u0001\u0000\u0000\u01d8\u01d9"+ + "\u0005\u001c\u0000\u0000\u01d9\u01da\u0003J%\u0000\u01da\u01db\u0005\u0002"+ + "\u0000\u0000\u01db\u01dd\u0001\u0000\u0000\u0000\u01dc\u01d7\u0001\u0000"+ + "\u0000\u0000\u01dc\u01dd\u0001\u0000\u0000\u0000\u01dd\u01df\u0001\u0000"+ + "\u0000\u0000\u01de\u01b6\u0001\u0000\u0000\u0000\u01de\u01bd\u0001\u0000"+ + "\u0000\u0000\u01de\u01bf\u0001\u0000\u0000\u0000\u01de\u01c4\u0001\u0000"+ + "\u0000\u0000\u01de\u01c9\u0001\u0000\u0000\u0000\u01dfC\u0001\u0000\u0000"+ + "\u0000\u01e0\u01e2\u0003\u001c\u000e\u0000\u01e1\u01e0\u0001\u0000\u0000"+ + "\u0000\u01e1\u01e2\u0001\u0000\u0000\u0000\u01e2\u01e3\u0001\u0000\u0000"+ + "\u0000\u01e3\u01e4\u0003F#\u0000\u01e4E\u0001\u0000\u0000\u0000\u01e5"+ + "\u01e6\u0005\u0001\u0000\u0000\u01e6\u01ea\u0005t\u0000\u0000\u01e7\u01e9"+ + "\u0003\n\u0005\u0000\u01e8\u01e7\u0001\u0000\u0000\u0000\u01e9\u01ec\u0001"+ + "\u0000\u0000\u0000\u01ea\u01e8\u0001\u0000\u0000\u0000\u01ea\u01eb\u0001"+ + "\u0000\u0000\u0000\u01eb\u01ed\u0001\u0000\u0000\u0000\u01ec\u01ea\u0001"+ + "\u0000\u0000\u0000\u01ed\u01ef\u0005\u0002\u0000\u0000\u01ee\u01e5\u0001"+ + "\u0000\u0000\u0000\u01ef\u01f2\u0001\u0000\u0000\u0000\u01f0\u01ee\u0001"+ + "\u0000\u0000\u0000\u01f0\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f3\u0001"+ + "\u0000\u0000\u0000\u01f2\u01f0\u0001\u0000\u0000\u0000\u01f3\u01f4\u0003"+ + "H$\u0000\u01f4G\u0001\u0000\u0000\u0000\u01f5\u01f6\u0005\u0001\u0000"+ + "\u0000\u01f6\u01fa\u0005u\u0000\u0000\u01f7\u01f9\u0003\n\u0005\u0000"+ + "\u01f8\u01f7\u0001\u0000\u0000\u0000\u01f9\u01fc\u0001\u0000\u0000\u0000"+ + "\u01fa\u01f8\u0001\u0000\u0000\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000"+ + "\u01fb\u01fd\u0001\u0000\u0000\u0000\u01fc\u01fa\u0001\u0000\u0000\u0000"+ + "\u01fd\u01ff\u0005\u0002\u0000\u0000\u01fe\u01f5\u0001\u0000\u0000\u0000"+ + "\u01ff\u0202\u0001\u0000\u0000\u0000\u0200\u01fe\u0001\u0000\u0000\u0000"+ + "\u0200\u0201\u0001\u0000\u0000\u0000\u0201\u0206\u0001\u0000\u0000\u0000"+ + "\u0202\u0200\u0001\u0000\u0000\u0000\u0203\u0205\u0003B!\u0000\u0204\u0203"+ + "\u0001\u0000\u0000\u0000\u0205\u0208\u0001\u0000\u0000\u0000\u0206\u0204"+ + "\u0001\u0000\u0000\u0000\u0206\u0207\u0001\u0000\u0000\u0000\u0207I\u0001"+ + "\u0000\u0000\u0000\u0208\u0206\u0001\u0000\u0000\u0000\u0209\u020b\u0003"+ + "$\u0012\u0000\u020a\u0209\u0001\u0000\u0000\u0000\u020b\u020e\u0001\u0000"+ + "\u0000\u0000\u020c\u020a\u0001\u0000\u0000\u0000\u020c\u020d\u0001\u0000"+ + "\u0000\u0000\u020d\u0210\u0001\u0000\u0000\u0000\u020e\u020c\u0001\u0000"+ + "\u0000\u0000\u020f\u0211\u00032\u0019\u0000\u0210\u020f\u0001\u0000\u0000"+ + "\u0000\u0210\u0211\u0001\u0000\u0000\u0000\u0211K\u0001\u0000\u0000\u0000"+ + "\u0212\u0213\u0003J%\u0000\u0213M\u0001\u0000\u0000\u0000\u0214\u0215"+ + "\u0005\u0001\u0000\u0000\u0215\u0217\u0005q\u0000\u0000\u0216\u0218\u0003"+ + "\"\u0011\u0000\u0217\u0216\u0001\u0000\u0000\u0000\u0217\u0218\u0001\u0000"+ + "\u0000\u0000\u0218\u0219\u0001\u0000\u0000\u0000\u0219\u021a\u0003P(\u0000"+ + "\u021a\u021b\u0005\u0002\u0000\u0000\u021bO\u0001\u0000\u0000\u0000\u021c"+ + "\u021e\u0003\u001c\u000e\u0000\u021d\u021c\u0001\u0000\u0000\u0000\u021d"+ + "\u021e\u0001\u0000\u0000\u0000\u021e\u021f\u0001\u0000\u0000\u0000\u021f"+ + "\u022a\u0003R)\u0000\u0220\u0222\u0003l6\u0000\u0221\u0223\u0003\u001c"+ + "\u000e\u0000\u0222\u0221\u0001\u0000\u0000\u0000\u0222\u0223\u0001\u0000"+ + "\u0000\u0000\u0223\u0224\u0001\u0000\u0000\u0000\u0224\u0225\u0003\u0016"+ + "\u000b\u0000\u0225\u022a\u0001\u0000\u0000\u0000\u0226\u0227\u0003r9\u0000"+ + "\u0227\u0228\u0003P(\u0000\u0228\u022a\u0001\u0000\u0000\u0000\u0229\u021d"+ + "\u0001\u0000\u0000\u0000\u0229\u0220\u0001\u0000\u0000\u0000\u0229\u0226"+ + "\u0001\u0000\u0000\u0000\u022aQ\u0001\u0000\u0000\u0000\u022b\u022c\u0003"+ + "\u0016\u000b\u0000\u022c\u022d\u0003T*\u0000\u022dS\u0001\u0000\u0000"+ + "\u0000\u022e\u022f\u0005\u0001\u0000\u0000\u022f\u0239\u0005v\u0000\u0000"+ + "\u0230\u0232\u0003\n\u0005\u0000\u0231\u0230\u0001\u0000\u0000\u0000\u0232"+ + "\u0235\u0001\u0000\u0000\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233"+ + "\u0234\u0001\u0000\u0000\u0000\u0234\u023a\u0001\u0000\u0000\u0000\u0235"+ + "\u0233\u0001\u0000\u0000\u0000\u0236\u0237\u0003\"\u0011\u0000\u0237\u0238"+ + "\u0003\n\u0005\u0000\u0238\u023a\u0001\u0000\u0000\u0000\u0239\u0233\u0001"+ + "\u0000\u0000\u0000\u0239\u0236\u0001\u0000\u0000\u0000\u023a\u023b\u0001"+ + "\u0000\u0000\u0000\u023b\u023d\u0005\u0002\u0000\u0000\u023c\u022e\u0001"+ + "\u0000\u0000\u0000\u023d\u0240\u0001\u0000\u0000\u0000\u023e\u023c\u0001"+ + "\u0000\u0000\u0000\u023e\u023f\u0001\u0000\u0000\u0000\u023f\u0241\u0001"+ + "\u0000\u0000\u0000\u0240\u023e\u0001\u0000\u0000\u0000\u0241\u0242\u0003"+ + "J%\u0000\u0242U\u0001\u0000\u0000\u0000\u0243\u0244\u0005\u0001\u0000"+ + "\u0000\u0244\u0245\u0005|\u0000\u0000\u0245\u0246\u0003L&\u0000\u0246"+ + "\u0247\u0005\u0002\u0000\u0000\u0247\u024a\u0001\u0000\u0000\u0000\u0248"+ + "\u024a\u0003B!\u0000\u0249\u0243\u0001\u0000\u0000\u0000\u0249\u0248\u0001"+ + "\u0000\u0000\u0000\u024aW\u0001\u0000\u0000\u0000\u024b\u024c\u0005\u0001"+ + "\u0000\u0000\u024c\u024e\u0005z\u0000\u0000\u024d\u024f\u0003 \u0010\u0000"+ + "\u024e\u024d\u0001\u0000\u0000\u0000\u024e\u024f\u0001\u0000\u0000\u0000"+ + "\u024f\u0250\u0001\u0000\u0000\u0000\u0250\u0251\u0005\u0001\u0000\u0000"+ + "\u0251\u0252\u0003$\u0012\u0000\u0252\u0256\u0005\u0002\u0000\u0000\u0253"+ + "\u0255\u0003 \u0010\u0000\u0254\u0253\u0001\u0000\u0000\u0000\u0255\u0258"+ + "\u0001\u0000\u0000\u0000\u0256\u0254\u0001\u0000\u0000\u0000\u0256\u0257"+ + "\u0001\u0000\u0000\u0000\u0257\u0259\u0001\u0000\u0000\u0000\u0258\u0256"+ + "\u0001\u0000\u0000\u0000\u0259\u025a\u0005\u0002\u0000\u0000\u025a\u026a"+ + "\u0001\u0000\u0000\u0000\u025b\u025c\u0005\u0001\u0000\u0000\u025c\u025e"+ + "\u0005z\u0000\u0000\u025d\u025f\u0003 \u0010\u0000\u025e\u025d\u0001\u0000"+ + "\u0000\u0000\u025e\u025f\u0001\u0000\u0000\u0000\u025f\u0260\u0001\u0000"+ + "\u0000\u0000\u0260\u0264\u0003V+\u0000\u0261\u0263\u0003 \u0010\u0000"+ + "\u0262\u0261\u0001\u0000\u0000\u0000\u0263\u0266\u0001\u0000\u0000\u0000"+ + "\u0264\u0262\u0001\u0000\u0000\u0000\u0264\u0265\u0001\u0000\u0000\u0000"+ + "\u0265\u0267\u0001\u0000\u0000\u0000\u0266\u0264\u0001\u0000\u0000\u0000"+ + "\u0267\u0268\u0005\u0002\u0000\u0000\u0268\u026a\u0001\u0000\u0000\u0000"+ + "\u0269\u024b\u0001\u0000\u0000\u0000\u0269\u025b\u0001\u0000\u0000\u0000"+ + "\u026aY\u0001\u0000\u0000\u0000\u026b\u026c\u0005\u0001\u0000\u0000\u026c"+ + "\u026e\u0005x\u0000\u0000\u026d\u026f\u0003\"\u0011\u0000\u026e\u026d"+ + "\u0001\u0000\u0000\u0000\u026e\u026f\u0001\u0000\u0000\u0000\u026f\u0270"+ + "\u0001\u0000\u0000\u0000\u0270\u0271\u0003\\.\u0000\u0271\u0272\u0005"+ + "\u0002\u0000\u0000\u0272[\u0001\u0000\u0000\u0000\u0273\u0286\u0003\u0018"+ + "\f\u0000\u0274\u0275\u0003l6\u0000\u0275\u0276\u0003\u0018\f\u0000\u0276"+ + "\u0286\u0001\u0000\u0000\u0000\u0277\u0278\u0003r9\u0000\u0278\u0279\u0003"+ + "\\.\u0000\u0279\u0286\u0001\u0000\u0000\u0000\u027a\u027b\u0003\u0006"+ + "\u0003\u0000\u027b\u027c\u0005\u0001\u0000\u0000\u027c\u0280\u0005z\u0000"+ + "\u0000\u027d\u027f\u0003 \u0010\u0000\u027e\u027d\u0001\u0000\u0000\u0000"+ + "\u027f\u0282\u0001\u0000\u0000\u0000\u0280\u027e\u0001\u0000\u0000\u0000"+ + "\u0280\u0281\u0001\u0000\u0000\u0000\u0281\u0283\u0001\u0000\u0000\u0000"+ + "\u0282\u0280\u0001\u0000\u0000\u0000\u0283\u0284\u0005\u0002\u0000\u0000"+ + "\u0284\u0286\u0001\u0000\u0000\u0000\u0285\u0273\u0001\u0000\u0000\u0000"+ + "\u0285\u0274\u0001\u0000\u0000\u0000\u0285\u0277\u0001\u0000\u0000\u0000"+ + "\u0285\u027a\u0001\u0000\u0000\u0000\u0286]\u0001\u0000\u0000\u0000\u0287"+ + "\u0288\u0005\u0001\u0000\u0000\u0288\u028a\u0005{\u0000\u0000\u0289\u028b"+ + "\u0003 \u0010\u0000\u028a\u0289\u0001\u0000\u0000\u0000\u028a\u028b\u0001"+ + "\u0000\u0000\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d\u0005"+ + "\u0001\u0000\u0000\u028d\u028e\u0003$\u0012\u0000\u028e\u0292\u0005\u0002"+ + "\u0000\u0000\u028f\u0291\u0005\u0006\u0000\u0000\u0290\u028f\u0001\u0000"+ + "\u0000\u0000\u0291\u0294\u0001\u0000\u0000\u0000\u0292\u0290\u0001\u0000"+ + "\u0000\u0000\u0292\u0293\u0001\u0000\u0000\u0000\u0293\u0295\u0001\u0000"+ + "\u0000\u0000\u0294\u0292\u0001\u0000\u0000\u0000\u0295\u0296\u0005\u0002"+ + "\u0000\u0000\u0296\u02a6\u0001\u0000\u0000\u0000\u0297\u0298\u0005\u0001"+ + "\u0000\u0000\u0298\u029a\u0005{\u0000\u0000\u0299\u029b\u0003 \u0010\u0000"+ + "\u029a\u0299\u0001\u0000\u0000\u0000\u029a\u029b\u0001\u0000\u0000\u0000"+ + "\u029b\u029c\u0001\u0000\u0000\u0000\u029c\u02a0\u0003V+\u0000\u029d\u029f"+ + "\u0005\u0006\u0000\u0000\u029e\u029d\u0001\u0000\u0000\u0000\u029f\u02a2"+ + "\u0001\u0000\u0000\u0000\u02a0\u029e\u0001\u0000\u0000\u0000\u02a0\u02a1"+ + "\u0001\u0000\u0000\u0000\u02a1\u02a3\u0001\u0000\u0000\u0000\u02a2\u02a0"+ + "\u0001\u0000\u0000\u0000\u02a3\u02a4\u0005\u0002\u0000\u0000\u02a4\u02a6"+ + "\u0001\u0000\u0000\u0000\u02a5\u0287\u0001\u0000\u0000\u0000\u02a5\u0297"+ + "\u0001\u0000\u0000\u0000\u02a6_\u0001\u0000\u0000\u0000\u02a7\u02a8\u0005"+ + "\u0001\u0000\u0000\u02a8\u02aa\u0005y\u0000\u0000\u02a9\u02ab\u0003\""+ + "\u0011\u0000\u02aa\u02a9\u0001\u0000\u0000\u0000\u02aa\u02ab\u0001\u0000"+ + "\u0000\u0000\u02ab\u02ac\u0001\u0000\u0000\u0000\u02ac\u02ad\u0003b1\u0000"+ + "\u02ad\u02ae\u0005\u0002\u0000\u0000\u02aea\u0001\u0000\u0000\u0000\u02af"+ + "\u02c0\u0003\u001a\r\u0000\u02b0\u02b1\u0003l6\u0000\u02b1\u02b2\u0003"+ + "\u001a\r\u0000\u02b2\u02c0\u0001\u0000\u0000\u0000\u02b3\u02b4\u0003r"+ + "9\u0000\u02b4\u02b5\u0003b1\u0000\u02b5\u02c0\u0001\u0000\u0000\u0000"+ + "\u02b6\u02b7\u0005\u0001\u0000\u0000\u02b7\u02bb\u0005{\u0000\u0000\u02b8"+ + "\u02ba\u0005\u0006\u0000\u0000\u02b9\u02b8\u0001\u0000\u0000\u0000\u02ba"+ + "\u02bd\u0001\u0000\u0000\u0000\u02bb\u02b9\u0001\u0000\u0000\u0000\u02bb"+ + "\u02bc\u0001\u0000\u0000\u0000\u02bc\u02be\u0001\u0000\u0000\u0000\u02bd"+ + "\u02bb\u0001\u0000\u0000\u0000\u02be\u02c0\u0005\u0002\u0000\u0000\u02bf"+ + "\u02af\u0001\u0000\u0000\u0000\u02bf\u02b0\u0001\u0000\u0000\u0000\u02bf"+ + "\u02b3\u0001\u0000\u0000\u0000\u02bf\u02b6\u0001\u0000\u0000\u0000\u02c0"+ + "c\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005\u0001\u0000\u0000\u02c2\u02c4"+ + "\u0005w\u0000\u0000\u02c3\u02c5\u0003\"\u0011\u0000\u02c4\u02c3\u0001"+ + "\u0000\u0000\u0000\u02c4\u02c5\u0001\u0000\u0000\u0000\u02c5\u02c6\u0001"+ + "\u0000\u0000\u0000\u02c6\u02c7\u0003f3\u0000\u02c7\u02c8\u0005\u0002\u0000"+ + "\u0000\u02c8e\u0001\u0000\u0000\u0000\u02c9\u02ca\u0003\u000e\u0007\u0000"+ + "\u02ca\u02cb\u0003L&\u0000\u02cb\u02d3\u0001\u0000\u0000\u0000\u02cc\u02cd"+ + "\u0003l6\u0000\u02cd\u02ce\u0003\u000e\u0007\u0000\u02ce\u02d3\u0001\u0000"+ + "\u0000\u0000\u02cf\u02d0\u0003r9\u0000\u02d0\u02d1\u0003f3\u0000\u02d1"+ + "\u02d3\u0001\u0000\u0000\u0000\u02d2\u02c9\u0001\u0000\u0000\u0000\u02d2"+ + "\u02cc\u0001\u0000\u0000\u0000\u02d2\u02cf\u0001\u0000\u0000\u0000\u02d3"+ + "g\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005\u0001\u0000\u0000\u02d5\u02d7"+ + "\u0005q\u0000\u0000\u02d6\u02d8\u0003\"\u0011\u0000\u02d7\u02d6\u0001"+ + "\u0000\u0000\u0000\u02d7\u02d8\u0001\u0000\u0000\u0000\u02d8\u02d9\u0001"+ + "\u0000\u0000\u0000\u02d9\u02da\u0003\u001c\u000e\u0000\u02da\u02db\u0005"+ + "\u0002\u0000\u0000\u02db\u02fd\u0001\u0000\u0000\u0000\u02dc\u02dd\u0005"+ + "\u0001\u0000\u0000\u02dd\u02df\u0005q\u0000\u0000\u02de\u02e0\u0003\""+ + "\u0011\u0000\u02df\u02de\u0001\u0000\u0000\u0000\u02df\u02e0\u0001\u0000"+ + "\u0000\u0000\u02e0\u02e1\u0001\u0000\u0000\u0000\u02e1\u02e2\u0003\u0016"+ + "\u000b\u0000\u02e2\u02e3\u0005\u0002\u0000\u0000\u02e3\u02fd\u0001\u0000"+ + "\u0000\u0000\u02e4\u02e5\u0005\u0001\u0000\u0000\u02e5\u02e7\u0005x\u0000"+ + "\u0000\u02e6\u02e8\u0003\"\u0011\u0000\u02e7\u02e6\u0001\u0000\u0000\u0000"+ + "\u02e7\u02e8\u0001\u0000\u0000\u0000\u02e8\u02e9\u0001\u0000\u0000\u0000"+ + "\u02e9\u02ea\u0003\u0018\f\u0000\u02ea\u02eb\u0005\u0002\u0000\u0000\u02eb"+ + "\u02fd\u0001\u0000\u0000\u0000\u02ec\u02ed\u0005\u0001\u0000\u0000\u02ed"+ + "\u02ef\u0005y\u0000\u0000\u02ee\u02f0\u0003\"\u0011\u0000\u02ef\u02ee"+ + "\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0\u02f1"+ + "\u0001\u0000\u0000\u0000\u02f1\u02f2\u0003\u001a\r\u0000\u02f2\u02f3\u0005"+ + "\u0002\u0000\u0000\u02f3\u02fd\u0001\u0000\u0000\u0000\u02f4\u02f5\u0005"+ + "\u0001\u0000\u0000\u02f5\u02f7\u0005w\u0000\u0000\u02f6\u02f8\u0003\""+ + "\u0011\u0000\u02f7\u02f6\u0001\u0000\u0000\u0000\u02f7\u02f8\u0001\u0000"+ + "\u0000\u0000\u02f8\u02f9\u0001\u0000\u0000\u0000\u02f9\u02fa\u0003\u000e"+ + "\u0007\u0000\u02fa\u02fb\u0005\u0002\u0000\u0000\u02fb\u02fd\u0001\u0000"+ + "\u0000\u0000\u02fc\u02d4\u0001\u0000\u0000\u0000\u02fc\u02dc\u0001\u0000"+ + "\u0000\u0000\u02fc\u02e4\u0001\u0000\u0000\u0000\u02fc\u02ec\u0001\u0000"+ + "\u0000\u0000\u02fc\u02f4\u0001\u0000\u0000\u0000\u02fdi\u0001\u0000\u0000"+ + "\u0000\u02fe\u02ff\u0005\u0001\u0000\u0000\u02ff\u0300\u0005}\u0000\u0000"+ + "\u0300\u0301\u0003\u0002\u0001\u0000\u0301\u0302\u0003\u0002\u0001\u0000"+ + "\u0302\u0303\u0003h4\u0000\u0303\u0304\u0005\u0002\u0000\u0000\u0304k"+ + "\u0001\u0000\u0000\u0000\u0305\u0306\u0005\u0001\u0000\u0000\u0306\u0307"+ + "\u0005}\u0000\u0000\u0307\u0308\u0003\u0002\u0001\u0000\u0308\u0309\u0003"+ + "\u0002\u0001\u0000\u0309\u030a\u0005\u0002\u0000\u0000\u030am\u0001\u0000"+ + "\u0000\u0000\u030b\u030c\u0005\u0001\u0000\u0000\u030c\u030d\u0005q\u0000"+ + "\u0000\u030d\u030e\u0003 \u0010\u0000\u030e\u030f\u0005\u0002\u0000\u0000"+ + "\u030f\u0320\u0001\u0000\u0000\u0000\u0310\u0311\u0005\u0001\u0000\u0000"+ + "\u0311\u0312\u0005x\u0000\u0000\u0312\u0313\u0003 \u0010\u0000\u0313\u0314"+ + "\u0005\u0002\u0000\u0000\u0314\u0320\u0001\u0000\u0000\u0000\u0315\u0316"+ + "\u0005\u0001\u0000\u0000\u0316\u0317\u0005y\u0000\u0000\u0317\u0318\u0003"+ + " \u0010\u0000\u0318\u0319\u0005\u0002\u0000\u0000\u0319\u0320\u0001\u0000"+ + "\u0000\u0000\u031a\u031b\u0005\u0001\u0000\u0000\u031b\u031c\u0005w\u0000"+ + "\u0000\u031c\u031d\u0003 \u0010\u0000\u031d\u031e\u0005\u0002\u0000\u0000"+ + "\u031e\u0320\u0001\u0000\u0000\u0000\u031f\u030b\u0001\u0000\u0000\u0000"+ + "\u031f\u0310\u0001\u0000\u0000\u0000\u031f\u0315\u0001\u0000\u0000\u0000"+ + "\u031f\u031a\u0001\u0000\u0000\u0000\u0320o\u0001\u0000\u0000\u0000\u0321"+ + "\u0322\u0005\u0001\u0000\u0000\u0322\u0323\u0005~\u0000\u0000\u0323\u0324"+ + "\u0003\u0002\u0001\u0000\u0324\u0325\u0003n7\u0000\u0325\u0326\u0005\u0002"+ + "\u0000\u0000\u0326q\u0001\u0000\u0000\u0000\u0327\u0328\u0005\u0001\u0000"+ + "\u0000\u0328\u0329\u0005~\u0000\u0000\u0329\u032a\u0003\u0002\u0001\u0000"+ + "\u032a\u032b\u0005\u0002\u0000\u0000\u032bs\u0001\u0000\u0000\u0000\u032c"+ + "\u032d\u0005\u0001\u0000\u0000\u032d\u032f\u0005p\u0000\u0000\u032e\u0330"+ + "\u0003\"\u0011\u0000\u032f\u032e\u0001\u0000\u0000\u0000\u032f\u0330\u0001"+ + "\u0000\u0000\u0000\u0330\u0331\u0001\u0000\u0000\u0000\u0331\u0332\u0003"+ + "\u0010\b\u0000\u0332\u0333\u0005\u0002\u0000\u0000\u0333u\u0001\u0000"+ + "\u0000\u0000\u0334\u0335\u0005\u0001\u0000\u0000\u0335\u0336\u0005s\u0000"+ + "\u0000\u0336\u0337\u0003 \u0010\u0000\u0337\u0338\u0005\u0002\u0000\u0000"+ + "\u0338w\u0001\u0000\u0000\u0000\u0339\u0344\u0003t:\u0000\u033a\u0344"+ + "\u0003d2\u0000\u033b\u0344\u0003Z-\u0000\u033c\u0344\u0003`0\u0000\u033d"+ + "\u0344\u0003N\'\u0000\u033e\u0344\u0003X,\u0000\u033f\u0344\u0003^/\u0000"+ + "\u0340\u0344\u0003v;\u0000\u0341\u0344\u0003j5\u0000\u0342\u0344\u0003"+ + "p8\u0000\u0343\u0339\u0001\u0000\u0000\u0000\u0343\u033a\u0001\u0000\u0000"+ + "\u0000\u0343\u033b\u0001\u0000\u0000\u0000\u0343\u033c\u0001\u0000\u0000"+ + "\u0000\u0343\u033d\u0001\u0000\u0000\u0000\u0343\u033e\u0001\u0000\u0000"+ + "\u0000\u0343\u033f\u0001\u0000\u0000\u0000\u0343\u0340\u0001\u0000\u0000"+ + "\u0000\u0343\u0341\u0001\u0000\u0000\u0000\u0343\u0342\u0001\u0000\u0000"+ + "\u0000\u0344y\u0001\u0000\u0000\u0000\u0345\u0346\u0005\u0001\u0000\u0000"+ + "\u0346\u0348\u0005\u007f\u0000\u0000\u0347\u0349\u0005\u0090\u0000\u0000"+ + "\u0348\u0347\u0001\u0000\u0000\u0000\u0348\u0349\u0001\u0000\u0000\u0000"+ + "\u0349\u034d\u0001\u0000\u0000\u0000\u034a\u034c\u0003x<\u0000\u034b\u034a"+ + "\u0001\u0000\u0000\u0000\u034c\u034f\u0001\u0000\u0000\u0000\u034d\u034b"+ + "\u0001\u0000\u0000\u0000\u034d\u034e\u0001\u0000\u0000\u0000\u034e\u0350"+ + "\u0001\u0000\u0000\u0000\u034f\u034d\u0001\u0000\u0000\u0000\u0350\u0351"+ + "\u0005\u0002\u0000\u0000\u0351{\u0001\u0000\u0000\u0000\u0352\u0361\u0003"+ + "z=\u0000\u0353\u0354\u0005\u0001\u0000\u0000\u0354\u0356\u0005\u007f\u0000"+ + "\u0000\u0355\u0357\u0005\u0090\u0000\u0000\u0356\u0355\u0001\u0000\u0000"+ + "\u0000\u0356\u0357\u0001\u0000\u0000\u0000\u0357\u0358\u0001\u0000\u0000"+ + "\u0000\u0358\u035c\u0007\u0005\u0000\u0000\u0359\u035b\u0005\u0006\u0000"+ + "\u0000\u035a\u0359\u0001\u0000\u0000\u0000\u035b\u035e\u0001\u0000\u0000"+ + "\u0000\u035c\u035a\u0001\u0000\u0000\u0000\u035c\u035d\u0001\u0000\u0000"+ + "\u0000\u035d\u035f\u0001\u0000\u0000\u0000\u035e\u035c\u0001\u0000\u0000"+ + "\u0000\u035f\u0361\u0005\u0002\u0000\u0000\u0360\u0352\u0001\u0000\u0000"+ + "\u0000\u0360\u0353\u0001\u0000\u0000\u0000\u0361}\u0001\u0000\u0000\u0000"+ + "\u0362\u0363\u0005\u0001\u0000\u0000\u0363\u0365\u0005\u0084\u0000\u0000"+ + "\u0364\u0366\u0005\u0090\u0000\u0000\u0365\u0364\u0001\u0000\u0000\u0000"+ + "\u0365\u0366\u0001\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000\u0000"+ + "\u0367\u0368\u0003\u0002\u0001\u0000\u0368\u0369\u0003\u0088D\u0000\u0369"+ + "\u036a\u0005\u0002\u0000\u0000\u036a\u0374\u0001\u0000\u0000\u0000\u036b"+ + "\u036c\u0005\u0001\u0000\u0000\u036c\u036e\u0005\u0085\u0000\u0000\u036d"+ + "\u036f\u0005\u0090\u0000\u0000\u036e\u036d\u0001\u0000\u0000\u0000\u036e"+ + "\u036f\u0001\u0000\u0000\u0000\u036f\u0370\u0001\u0000\u0000\u0000\u0370"+ + "\u0371\u0003\u0002\u0001\u0000\u0371\u0372\u0005\u0002\u0000\u0000\u0372"+ + "\u0374\u0001\u0000\u0000\u0000\u0373\u0362\u0001\u0000\u0000\u0000\u0373"+ + "\u036b\u0001\u0000\u0000\u0000\u0374\u007f\u0001\u0000\u0000\u0000\u0375"+ + "\u0376\u0005\u0001\u0000\u0000\u0376\u0377\u0005\u0086\u0000\u0000\u0377"+ + "\u0378\u0003|>\u0000\u0378\u0379\u0005\u0006\u0000\u0000\u0379\u037a\u0005"+ + "\u0002\u0000\u0000\u037a\u03aa\u0001\u0000\u0000\u0000\u037b\u037c\u0005"+ + "\u0001\u0000\u0000\u037c\u037d\u0005\u0087\u0000\u0000\u037d\u037e\u0003"+ + "|>\u0000\u037e\u037f\u0005\u0006\u0000\u0000\u037f\u0380\u0005\u0002\u0000"+ + "\u0000\u0380\u03aa\u0001\u0000\u0000\u0000\u0381\u0382\u0005\u0001\u0000"+ + "\u0000\u0382\u0383\u0005\u0088\u0000\u0000\u0383\u0384\u0003|>\u0000\u0384"+ + "\u0385\u0005\u0006\u0000\u0000\u0385\u0386\u0005\u0002\u0000\u0000\u0386"+ + "\u03aa\u0001\u0000\u0000\u0000\u0387\u0388\u0005\u0001\u0000\u0000\u0388"+ + "\u0389\u0005\u008c\u0000\u0000\u0389\u038a\u0003|>\u0000\u038a\u038b\u0005"+ + "\u0006\u0000\u0000\u038b\u038c\u0005\u0002\u0000\u0000\u038c\u03aa\u0001"+ + "\u0000\u0000\u0000\u038d\u038e\u0005\u0001\u0000\u0000\u038e\u038f\u0005"+ + "\u0089\u0000\u0000\u038f\u0390\u0003~?\u0000\u0390\u0391\u0003\u0088D"+ + "\u0000\u0391\u0392\u0005\u0002\u0000\u0000\u0392\u03aa\u0001\u0000\u0000"+ + "\u0000\u0393\u0394\u0005\u0001\u0000\u0000\u0394\u0395\u0005\u008a\u0000"+ + "\u0000\u0395\u0396\u0003~?\u0000\u0396\u0397\u0005\u0002\u0000\u0000\u0397"+ + "\u03aa\u0001\u0000\u0000\u0000\u0398\u0399\u0005\u0001\u0000\u0000\u0399"+ + "\u039a\u0005\u008b\u0000\u0000\u039a\u039b\u0003~?\u0000\u039b\u039c\u0005"+ + "\u0002\u0000\u0000\u039c\u03aa\u0001\u0000\u0000\u0000\u039d\u039e\u0005"+ + "\u0001\u0000\u0000\u039e\u039f\u0005\u008c\u0000\u0000\u039f\u03a0\u0003"+ + "~?\u0000\u03a0\u03a1\u0005\u0006\u0000\u0000\u03a1\u03a2\u0005\u0002\u0000"+ + "\u0000\u03a2\u03aa\u0001\u0000\u0000\u0000\u03a3\u03a4\u0005\u0001\u0000"+ + "\u0000\u03a4\u03a5\u0005\u008d\u0000\u0000\u03a5\u03a6\u0003~?\u0000\u03a6"+ + "\u03a7\u0005\u0006\u0000\u0000\u03a7\u03a8\u0005\u0002\u0000\u0000\u03a8"+ + "\u03aa\u0001\u0000\u0000\u0000\u03a9\u0375\u0001\u0000\u0000\u0000\u03a9"+ + "\u037b\u0001\u0000\u0000\u0000\u03a9\u0381\u0001\u0000\u0000\u0000\u03a9"+ + "\u0387\u0001\u0000\u0000\u0000\u03a9\u038d\u0001\u0000\u0000\u0000\u03a9"+ + "\u0393\u0001\u0000\u0000\u0000\u03a9\u0398\u0001\u0000\u0000\u0000\u03a9"+ + "\u039d\u0001\u0000\u0000\u0000\u03a9\u03a3\u0001\u0000\u0000\u0000\u03aa"+ + "\u0081\u0001\u0000\u0000\u0000\u03ab\u03b8\u0003~?\u0000\u03ac\u03b8\u0003"+ + "\u0080@\u0000\u03ad\u03b8\u0003|>\u0000\u03ae\u03af\u0005\u0001\u0000"+ + "\u0000\u03af\u03b0\u0005\u0083\u0000\u0000\u03b0\u03b2\u0003\u0002\u0001"+ + "\u0000\u03b1\u03b3\u0005\u0090\u0000\u0000\u03b2\u03b1\u0001\u0000\u0000"+ + "\u0000\u03b2\u03b3\u0001\u0000\u0000\u0000\u03b3\u03b4\u0001\u0000\u0000"+ + "\u0000\u03b4\u03b5\u0005\u0002\u0000\u0000\u03b5\u03b8\u0001\u0000\u0000"+ + "\u0000\u03b6\u03b8\u0003\u0084B\u0000\u03b7\u03ab\u0001\u0000\u0000\u0000"+ + "\u03b7\u03ac\u0001\u0000\u0000\u0000\u03b7\u03ad\u0001\u0000\u0000\u0000"+ + "\u03b7\u03ae\u0001\u0000\u0000\u0000\u03b7\u03b6\u0001\u0000\u0000\u0000"+ + "\u03b8\u0083\u0001\u0000\u0000\u0000\u03b9\u03ba\u0005\u0001\u0000\u0000"+ + "\u03ba\u03bc\u0005\u0082\u0000\u0000\u03bb\u03bd\u0005\u0090\u0000\u0000"+ + "\u03bc\u03bb\u0001\u0000\u0000\u0000\u03bc\u03bd\u0001\u0000\u0000\u0000"+ + "\u03bd\u03c1\u0001\u0000\u0000\u0000\u03be\u03c0\u0003\u0082A\u0000\u03bf"+ + "\u03be\u0001\u0000\u0000\u0000\u03c0\u03c3\u0001\u0000\u0000\u0000\u03c1"+ + "\u03bf\u0001\u0000\u0000\u0000\u03c1\u03c2\u0001\u0000\u0000\u0000\u03c2"+ + "\u03c4\u0001\u0000\u0000\u0000\u03c3\u03c1\u0001\u0000\u0000\u0000\u03c4"+ + "\u03da\u0005\u0002\u0000\u0000\u03c5\u03c6\u0005\u0001\u0000\u0000\u03c6"+ + "\u03c8\u0005\u008e\u0000\u0000\u03c7\u03c9\u0005\u0090\u0000\u0000\u03c8"+ + "\u03c7\u0001\u0000\u0000\u0000\u03c8\u03c9\u0001\u0000\u0000\u0000\u03c9"+ + "\u03ca\u0001\u0000\u0000\u0000\u03ca\u03cb\u0005\u0006\u0000\u0000\u03cb"+ + "\u03da\u0005\u0002\u0000\u0000\u03cc\u03cd\u0005\u0001\u0000\u0000\u03cd"+ + "\u03cf\u0005\u008f\u0000\u0000\u03ce\u03d0\u0005\u0090\u0000\u0000\u03cf"+ + "\u03ce\u0001\u0000\u0000\u0000\u03cf\u03d0\u0001\u0000\u0000\u0000\u03d0"+ + "\u03d1\u0001\u0000\u0000\u0000\u03d1\u03d2\u0005\u0006\u0000\u0000\u03d2"+ + "\u03da\u0005\u0002\u0000\u0000\u03d3\u03d4\u0005\u0001\u0000\u0000\u03d4"+ + "\u03d6\u0005\u008f\u0000\u0000\u03d5\u03d7\u0005\u0090\u0000\u0000\u03d6"+ + "\u03d5\u0001\u0000\u0000\u0000\u03d6\u03d7\u0001\u0000\u0000\u0000\u03d7"+ + "\u03d8\u0001\u0000\u0000\u0000\u03d8\u03da\u0005\u0002\u0000\u0000\u03d9"+ + "\u03b9\u0001\u0000\u0000\u0000\u03d9\u03c5\u0001\u0000\u0000\u0000\u03d9"+ + "\u03cc\u0001\u0000\u0000\u0000\u03d9\u03d3\u0001\u0000\u0000\u0000\u03da"+ + "\u0085\u0001\u0000\u0000\u0000\u03db\u03dc\u0005\u0001\u0000\u0000\u03dc"+ + "\u03dd\u0005\b\u0000\u0000\u03dd\u03de\u0003\u001e\u000f\u0000\u03de\u03df"+ + "\u0005\u0002\u0000\u0000\u03df\u0087\u0001\u0000\u0000\u0000\u03e0\u03e2"+ + "\u0003\u0086C\u0000\u03e1\u03e0\u0001\u0000\u0000\u0000\u03e2\u03e5\u0001"+ + "\u0000\u0000\u0000\u03e3\u03e1\u0001\u0000\u0000\u0000\u03e3\u03e4\u0001"+ + "\u0000\u0000\u0000\u03e4\u0089\u0001\u0000\u0000\u0000\u03e5\u03e3\u0001"+ + "\u0000\u0000\u0000\u03e6\u03e8\u0003\u0082A\u0000\u03e7\u03e6\u0001\u0000"+ + "\u0000\u0000\u03e8\u03eb\u0001\u0000\u0000\u0000\u03e9\u03e7\u0001\u0000"+ + "\u0000\u0000\u03e9\u03ea\u0001\u0000\u0000\u0000\u03ea\u03ec\u0001\u0000"+ + "\u0000\u0000\u03eb\u03e9\u0001\u0000\u0000\u0000\u03ec\u03f5\u0005\u0000"+ + "\u0000\u0001\u03ed\u03ef\u0003x<\u0000\u03ee\u03ed\u0001\u0000\u0000\u0000"+ + "\u03ef\u03f0\u0001\u0000\u0000\u0000\u03f0\u03ee\u0001\u0000\u0000\u0000"+ + "\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f2\u0001\u0000\u0000\u0000"+ + "\u03f2\u03f3\u0005\u0000\u0000\u0001\u03f3\u03f5\u0001\u0000\u0000\u0000"+ + "\u03f4\u03e9\u0001\u0000\u0000\u0000\u03f4\u03ee\u0001\u0000\u0000\u0000"+ + "\u03f5\u008b\u0001\u0000\u0000\u0000\u03f6\u03f7\u0003z=\u0000\u03f7\u03f8"+ + "\u0005\u0000\u0000\u0001\u03f8\u0401\u0001\u0000\u0000\u0000\u03f9\u03fb"+ + "\u0003x<\u0000\u03fa\u03f9\u0001\u0000\u0000\u0000\u03fb\u03fe\u0001\u0000"+ + "\u0000\u0000\u03fc\u03fa\u0001\u0000\u0000\u0000\u03fc\u03fd\u0001\u0000"+ + "\u0000\u0000\u03fd\u03ff\u0001\u0000\u0000\u0000\u03fe\u03fc\u0001\u0000"+ + "\u0000\u0000\u03ff\u0401\u0005\u0000\u0000\u0001\u0400\u03f6\u0001\u0000"+ + "\u0000\u0000\u0400\u03fc\u0001\u0000\u0000\u0000\u0401\u008d\u0001\u0000"+ + "\u0000\u0000o\u009b\u00a5\u00b1\u00b7\u00bc\u00c4\u00ca\u00d2\u00d8\u00e8"+ "\u00f6\u0107\u010a\u010e\u0111\u0125\u0132\u0137\u013e\u0147\u014d\u0155"+ "\u015b\u0163\u0169\u0173\u0179\u0180\u0185\u0189\u018e\u0192\u0197\u019a"+ - "\u019e\u01a0\u01af\u01b6\u01bb\u01c0\u01c6\u01d1\u01d3\u01d6\u01df\u01e5"+ - "\u01ef\u01f5\u01fb\u0201\u0205\u020c\u0212\u0217\u021e\u0228\u022e\u0233"+ - "\u023e\u0243\u024b\u0253\u0259\u025e\u0263\u0275\u027a\u027f\u0287\u028f"+ - "\u0295\u029a\u029f\u02b0\u02b4\u02b9\u02c7\u02cc\u02d4\u02dc\u02e4\u02ec"+ - "\u02f1\u0314\u0324\u0338\u033d\u0342\u034b\u0351\u0355\u035a\u0363\u0368"+ - "\u039e\u03a7\u03ac\u03b1\u03b6\u03bd\u03c4\u03cb\u03ce\u03d8\u03de\u03e5"+ - "\u03e9\u03f1\u03f5"; + "\u019e\u01a0\u01a7\u01ad\u01ba\u01c1\u01c6\u01cb\u01d1\u01dc\u01de\u01e1"+ + "\u01ea\u01f0\u01fa\u0200\u0206\u020c\u0210\u0217\u021d\u0222\u0229\u0233"+ + "\u0239\u023e\u0249\u024e\u0256\u025e\u0264\u0269\u026e\u0280\u0285\u028a"+ + "\u0292\u029a\u02a0\u02a5\u02aa\u02bb\u02bf\u02c4\u02d2\u02d7\u02df\u02e7"+ + "\u02ef\u02f7\u02fc\u031f\u032f\u0343\u0348\u034d\u0356\u035c\u0360\u0365"+ + "\u036e\u0373\u03a9\u03b2\u03b7\u03bc\u03c1\u03c8\u03cf\u03d6\u03d9\u03e3"+ + "\u03e9\u03f0\u03f4\u03fc\u0400"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/scala/wasm/AST.scala b/src/main/scala/wasm/AST.scala index 154b9c52a..9b1445c26 100644 --- a/src/main/scala/wasm/AST.scala +++ b/src/main/scala/wasm/AST.scala @@ -1,7 +1,7 @@ package gensym.wasm.ast import scala.collection.mutable.HashMap -import gensym.wasm.eval.ModuleInstance +import gensym.wasm.miniwasm.ModuleInstance import gensym.wasm.source._ abstract class WIR @@ -61,17 +61,17 @@ case object Drop extends Instr case object Alloc extends Instr case object Free extends Instr case class Select(ty: Option[List[ValueType]]) extends Instr -case class Block(ty: FuncType, instrs: List[Instr]) extends Instr -case class IdBlock(id: Int, ty: FuncType, instrs: List[Instr]) +case class Block(ty: BlockType, instrs: List[Instr]) extends Instr +case class IdBlock(id: Int, ty: BlockType, instrs: List[Instr]) extends Instr -case class Loop(ty: FuncType, instrs: List[Instr]) extends Instr -case class IdLoop(id: Int, ty: FuncType, instrs: List[Instr]) +case class Loop(ty: BlockType, instrs: List[Instr]) extends Instr +case class IdLoop(id: Int, ty: BlockType, instrs: List[Instr]) extends Instr -case class If(ty: FuncType, +case class If(ty: BlockType, thenInstrs: List[Instr], elseInstrs: List[Instr]) extends Instr -case class IdIf(ty: FuncType, thenInstrs: IdBlock, elseInstrs: IdBlock) +case class IdIf(ty: BlockType, thenInstrs: IdBlock, elseInstrs: IdBlock) extends Instr // FIXME: labelId can be string? case class Br(labelId: Int) extends Instr @@ -244,13 +244,12 @@ case class FuncType(argNames /*optional*/: List[String], inps: List[ValueType], case class GlobalType(ty: ValueType, mut: Boolean) extends WasmType -/* abstract class BlockType extends WIR { def toFuncType(moduleInst: ModuleInstance): FuncType } -case class VarBlockType(vR: Int) extends BlockType { - def toFuncType(moduleInst: ModuleInstance): FuncType = ??? +case class VarBlockType(index: Int) extends BlockType { + def toFuncType(moduleInst: ModuleInstance): FuncType = moduleInst.types(index) } case class ValBlockType(tipe: Option[ValueType]) extends BlockType { @@ -258,8 +257,7 @@ case class ValBlockType(tipe: Option[ValueType]) extends BlockType { case Some(t) => FuncType(List(), List(), List(t)) case None => FuncType(List(), List(), List()) } - } - */ +} // Globals case class RTGlobal(ty: GlobalType, var value: Value) diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index 2ba2ef4ae..ccd1c45b6 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -277,30 +277,33 @@ object Evaluator { eval(rest, stack, frame, kont, trail, ret) case Unreachable => throw Trap() case Block(ty, inner) => - val (inputs, restStack) = stack.splitAt(ty.inps.size) + val funcTy = ty.toFuncType(frame.module) + val (inputs, restStack) = stack.splitAt(funcTy.inps.size) val restK: Cont[Ans] = (retStack) => - eval(rest, retStack.take(ty.out.size) ++ restStack, frame, kont, trail, ret) + eval(rest, retStack.take(funcTy.out.size) ++ restStack, frame, kont, trail, ret) eval(inner, inputs, frame, restK, restK :: trail, ret + 1) case Loop(ty, inner) => // We construct two continuations, one for the break (to the begining of the loop), // and one for fall-through to the next instruction following the syntactic structure // of the program. - val (inputs, restStack) = stack.splitAt(ty.inps.size) + val funcTy = ty.toFuncType(frame.module) + val (inputs, restStack) = stack.splitAt(funcTy.inps.size) val restK: Cont[Ans] = (retStack) => - eval(rest, retStack.take(ty.out.size) ++ restStack, frame, kont, trail, ret) + eval(rest, retStack.take(funcTy.out.size) ++ restStack, frame, kont, trail, ret) def loop(retStack: List[Value]): Ans = { val k: Cont[Ans] = (retStack) => loop(retStack) // k is just same as loop - eval(inner, retStack.take(ty.inps.size), frame, restK, k :: trail, ret + 1) + eval(inner, retStack.take(funcTy.inps.size), frame, restK, k :: trail, ret + 1) } loop(inputs) case If(ty, thn, els) => + val funcTy = ty.toFuncType(frame.module) val I32V(cond) :: newStack = stack val inner = if (cond != 0) thn else els - val (inputs, restStack) = newStack.splitAt(ty.inps.size) + val (inputs, restStack) = newStack.splitAt(funcTy.inps.size) val restK: Cont[Ans] = (retStack) => - eval(rest, retStack.take(ty.out.size) ++ restStack, frame, kont, trail, ret) + eval(rest, retStack.take(funcTy.out.size) ++ restStack, frame, kont, trail, ret) eval(inner, inputs, frame, restK, restK :: trail, ret + 1) case Br(label) => trail(label)(stack) diff --git a/src/main/scala/wasm/Parser.scala b/src/main/scala/wasm/Parser.scala index a1283c16f..bb7301b28 100644 --- a/src/main/scala/wasm/Parser.scala +++ b/src/main/scala/wasm/Parser.scala @@ -7,14 +7,15 @@ import scala.util.parsing.combinator._ import scala.util.parsing.input.Positional import scala.util.matching.Regex import scala.language.postfixOps - import scala.annotation.tailrec import org.antlr.v4.runtime._ -import scala.collection.JavaConverters._ -import collection.mutable.HashMap +import scala.collection.JavaConverters._ +import collection.mutable.{HashMap, ListBuffer} import gensym.wasm._ +import scala.collection.mutable + class GSWasmVisitor extends WatParserBaseVisitor[WIR] { import WatParser._ @@ -29,6 +30,8 @@ class GSWasmVisitor extends WatParserBaseVisitor[WIR] { // TODO: instead of using WIR, define a trait for function-like definitions val fnMapInv: HashMap[Int, WIR] = HashMap() + val tyList: ListBuffer[WasmType] = ListBuffer() + def error = throw new RuntimeException("Unspported") def getVar(ctx: BindVarContext): Option[String] = @@ -396,8 +399,37 @@ class GSWasmVisitor extends WatParserBaseVisitor[WIR] { // ??? // } + + override def visitBlockType(ctx: BlockTypeContext): BlockType = { + if (ctx.typeUse != null) { + // explicit type use + val tyIndex = getVar(ctx.typeUse).get.toInt + // TODO: Verify the indexed type is same as the inline declared type + VarBlockType(tyIndex) + } else if (ctx.funcType != null){ + // abbreviation form + val ty = visitFuncType(ctx.funcType) + // add ty to the global type list when it not exist. + val tyIndex = tyList.indexOf(ty) + if (tyIndex == -1) { + tyList += ty + VarBlockType(tyList.size - 1) + } else { + VarBlockType(tyList.indexOf(ty)) + } + } + else { + // just one explicit stated result type + if (ctx.valType != null) { + ValBlockType(Some(visitValType(ctx.valType()).asInstanceOf[ValueType])) + } else { + ValBlockType(None) + } + } + } + override def visitBlock(ctx: BlockContext): WIR = { - val ty = visitFuncType(ctx.blockType().funcType()) + val ty = visitBlockType(ctx.blockType()) val InstrList(instrs) = visit(ctx.instrList) Block(ty, instrs) } @@ -445,7 +477,7 @@ class GSWasmVisitor extends WatParserBaseVisitor[WIR] { case (acc, inst: Instr) => acc ++ List(inst) case (acc, InstrList(instrs)) => acc ++ instrs } - val ty = visitFuncType(ctx.blockType().funcType()) + val ty = visitBlockType(ctx.blockType()) val InstrList(thn) = visit(ctx.instrList(0)) val els = if (ctx.ELSE != null) { val InstrList(elsInstr) = visit(ctx.instrList(1)) From 213676e4a2532d159d2d9be3a943c6dff094dbb5 Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Tue, 15 Oct 2024 23:55:59 +0800 Subject: [PATCH 10/15] leave usage of type use syntax as placeholder --- src/main/scala/wasm/AST.scala | 17 +++-------------- src/main/scala/wasm/MiniWasm.scala | 15 ++++++++++++--- src/main/scala/wasm/Parser.scala | 21 ++++++--------------- src/main/scala/wasm/attic/Eval.scala | 22 ++++++++++++++++------ 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/main/scala/wasm/AST.scala b/src/main/scala/wasm/AST.scala index 9b1445c26..bbdffe82d 100644 --- a/src/main/scala/wasm/AST.scala +++ b/src/main/scala/wasm/AST.scala @@ -244,20 +244,9 @@ case class FuncType(argNames /*optional*/: List[String], inps: List[ValueType], case class GlobalType(ty: ValueType, mut: Boolean) extends WasmType -abstract class BlockType extends WIR { - def toFuncType(moduleInst: ModuleInstance): FuncType -} - -case class VarBlockType(index: Int) extends BlockType { - def toFuncType(moduleInst: ModuleInstance): FuncType = moduleInst.types(index) -} - -case class ValBlockType(tipe: Option[ValueType]) extends BlockType { - def toFuncType(moduleInst: ModuleInstance): FuncType = tipe match { - case Some(t) => FuncType(List(), List(), List(t)) - case None => FuncType(List(), List(), List()) - } -} +abstract class BlockType extends WIR +case class VarBlockType(index: Int, tipe: Option[FuncType]) extends BlockType +case class ValBlockType(tipe: Option[ValueType]) extends BlockType; // Globals case class RTGlobal(ty: GlobalType, var value: Value) diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index ccd1c45b6..d91e64c68 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -184,6 +184,15 @@ object Evaluator { type Cont[A] = List[Value] => A + def getFuncType(module: ModuleInstance, ty: BlockType): FuncType = { + ty match { + case VarBlockType(_, None) => ??? // TODO: fill this branch until we handle type index correctly + case VarBlockType(_, Some(tipe)) => tipe + case ValBlockType(Some(tipe)) => FuncType(List(), List(), List(tipe)) + case ValBlockType(None) => FuncType(List(), List(), List()) + } + } + def eval[Ans](insts: List[Instr], stack: List[Value], frame: Frame, @@ -277,7 +286,7 @@ object Evaluator { eval(rest, stack, frame, kont, trail, ret) case Unreachable => throw Trap() case Block(ty, inner) => - val funcTy = ty.toFuncType(frame.module) + val funcTy = getFuncType(frame.module, ty) val (inputs, restStack) = stack.splitAt(funcTy.inps.size) val restK: Cont[Ans] = (retStack) => eval(rest, retStack.take(funcTy.out.size) ++ restStack, frame, kont, trail, ret) @@ -286,7 +295,7 @@ object Evaluator { // We construct two continuations, one for the break (to the begining of the loop), // and one for fall-through to the next instruction following the syntactic structure // of the program. - val funcTy = ty.toFuncType(frame.module) + val funcTy = getFuncType(frame.module, ty) val (inputs, restStack) = stack.splitAt(funcTy.inps.size) val restK: Cont[Ans] = (retStack) => eval(rest, retStack.take(funcTy.out.size) ++ restStack, frame, kont, trail, ret) @@ -298,7 +307,7 @@ object Evaluator { loop(inputs) case If(ty, thn, els) => - val funcTy = ty.toFuncType(frame.module) + val funcTy = getFuncType(frame.module, ty) val I32V(cond) :: newStack = stack val inner = if (cond != 0) thn else els val (inputs, restStack) = newStack.splitAt(funcTy.inps.size) diff --git a/src/main/scala/wasm/Parser.scala b/src/main/scala/wasm/Parser.scala index bb7301b28..788966741 100644 --- a/src/main/scala/wasm/Parser.scala +++ b/src/main/scala/wasm/Parser.scala @@ -30,8 +30,6 @@ class GSWasmVisitor extends WatParserBaseVisitor[WIR] { // TODO: instead of using WIR, define a trait for function-like definitions val fnMapInv: HashMap[Int, WIR] = HashMap() - val tyList: ListBuffer[WasmType] = ListBuffer() - def error = throw new RuntimeException("Unspported") def getVar(ctx: BindVarContext): Option[String] = @@ -402,24 +400,17 @@ class GSWasmVisitor extends WatParserBaseVisitor[WIR] { override def visitBlockType(ctx: BlockTypeContext): BlockType = { if (ctx.typeUse != null) { - // explicit type use - val tyIndex = getVar(ctx.typeUse).get.toInt - // TODO: Verify the indexed type is same as the inline declared type - VarBlockType(tyIndex) + // TODO: explicit type use + val tyIndex = -1 + VarBlockType(tyIndex, None) } else if (ctx.funcType != null){ // abbreviation form val ty = visitFuncType(ctx.funcType) - // add ty to the global type list when it not exist. - val tyIndex = tyList.indexOf(ty) - if (tyIndex == -1) { - tyList += ty - VarBlockType(tyList.size - 1) - } else { - VarBlockType(tyList.indexOf(ty)) - } + // TODO: append ty to the type definition list of parsing context, when necessarily + VarBlockType(-1, Some(ty)) } else { - // just one explicit stated result type + // just one explicit result type if (ctx.valType != null) { ValBlockType(Some(visitValType(ctx.valType()).asInstanceOf[ValueType])) } else { diff --git a/src/main/scala/wasm/attic/Eval.scala b/src/main/scala/wasm/attic/Eval.scala index 9ff82a7b1..3eb420b8a 100644 --- a/src/main/scala/wasm/attic/Eval.scala +++ b/src/main/scala/wasm/attic/Eval.scala @@ -169,6 +169,16 @@ case class Config(var frame: Frame, stackBudget: Int) { end > memory.size } + // TODO: remove duplication with definition at MiniWasm.scala + def getFuncType(module: ModuleInstance, ty: BlockType): FuncType = { + ty match { + case VarBlockType(_, None) => ??? + case VarBlockType(_, Some(tipe)) => tipe + case ValBlockType(Some(tipe)) => FuncType(List(), List(), List(tipe)) + case ValBlockType(None) => FuncType(List(), List(), List()) + } + } + def eval(stack: List[Value], instrs: List[Instr]): EvalResult = { if (instrs.isEmpty) return Continue(stack) println(s"Stack: $stack, instr: ${instrs.head}, locals: ${frame.locals}") @@ -304,22 +314,22 @@ case class Config(var frame: Frame, stackBudget: Int) { case Nop => this.eval(stack, instrs.tail) case Unreachable => throw new Exception("Unreachable") case Block(blockTy, blockInstrs) => { - //val funcType = blockTy.toFuncType(frame.module) - evalBlock(blockTy.out.length, blockInstrs.toList).onContinue { retStack => + val funcType = getFuncType(frame.module, blockTy) + evalBlock(funcType.out.length, blockInstrs.toList).onContinue { retStack => this.eval(retStack ++ stack, instrs.tail) } } case Loop(blockTy, loopInstrs) => { - //val funcType = blockTy.toFuncType(frame.module) - evalBlock(blockTy.out.length, loopInstrs.toList).onContinue { retStack => + val funcType = getFuncType(frame.module, blockTy) + evalBlock(funcType.out.length, loopInstrs.toList).onContinue { retStack => this.eval(retStack ++ stack, instrs) // instead of instrs.tail } } case If(blockTy, thenInstrs, elseInstrs) => stack match { case I32V(cond) :: newStack => { + val funcType = getFuncType(frame.module, blockTy) val condInstrs = if (cond == 0) elseInstrs else thenInstrs - //val funcType = blockTy.toFuncType(frame.module) - evalBlock(blockTy.out.length, condInstrs.toList).onContinue { retStack => + evalBlock(funcType.out.length, condInstrs.toList).onContinue { retStack => this.eval(retStack ++ newStack, instrs.tail) } } From 7d1540798307e33ac603dc430e3f58501addaf72 Mon Sep 17 00:00:00 2001 From: ahuoguo Date: Wed, 16 Oct 2024 10:00:54 -0400 Subject: [PATCH 11/15] try loop poly --- benchmarks/wasm/loop_poly.wat | 21 +++++++++++++++++++++ src/test/scala/genwasym/TestEval.scala | 4 ++++ 2 files changed, 25 insertions(+) create mode 100644 benchmarks/wasm/loop_poly.wat diff --git a/benchmarks/wasm/loop_poly.wat b/benchmarks/wasm/loop_poly.wat new file mode 100644 index 000000000..727a66420 --- /dev/null +++ b/benchmarks/wasm/loop_poly.wat @@ -0,0 +1,21 @@ +(module + (type (;0;) (func)) + (type (;1;) (func (param i32) (result i32))) + (func $test_poly_loop (;0;) (type 0) + i32.const 42 + i32.const 0 + block (param i32 i32) (result i32 i32) + loop (type 1) (param i32) (result i32) ;; label = @1 + i32.const 1 + i32.const 2 + br 1 (;@1;) + end + end + ;; - [return, 0 ] + i32.add + drop + ) + +;; (export "main" (func $test_poly_loop)) +(start 0) +) \ No newline at end of file diff --git a/src/test/scala/genwasym/TestEval.scala b/src/test/scala/genwasym/TestEval.scala index 5474a92ab..b2491c0af 100644 --- a/src/test/scala/genwasym/TestEval.scala +++ b/src/test/scala/genwasym/TestEval.scala @@ -60,6 +60,10 @@ class TestEval extends FunSuite { testFile("./benchmarks/wasm/block.wat", Some("$test_poly_br"), Some(0)) } + test("poly loop") { + testFile("./benchmarks/wasm/loop_poly.wat", None , None) + } + // FIXME: //test("tribonacci-ret") { testFile("./benchmarks/wasm/tribonacci_ret.wat", None, Some(504)) } From 19f448bdec1b9e6def8ae7e813dd5ebbd1354bbb Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Wed, 16 Oct 2024 22:46:17 +0800 Subject: [PATCH 12/15] still enable type use syntax, only ignore their index --- benchmarks/wasm/loop_poly.wat | 1 + src/main/scala/wasm/Parser.scala | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/benchmarks/wasm/loop_poly.wat b/benchmarks/wasm/loop_poly.wat index 727a66420..41814c6b2 100644 --- a/benchmarks/wasm/loop_poly.wat +++ b/benchmarks/wasm/loop_poly.wat @@ -6,6 +6,7 @@ i32.const 0 block (param i32 i32) (result i32 i32) loop (type 1) (param i32) (result i32) ;; label = @1 + ;; this type use will be ignored for now i32.const 1 i32.const 2 br 1 (;@1;) diff --git a/src/main/scala/wasm/Parser.scala b/src/main/scala/wasm/Parser.scala index 788966741..b6155e396 100644 --- a/src/main/scala/wasm/Parser.scala +++ b/src/main/scala/wasm/Parser.scala @@ -402,7 +402,8 @@ class GSWasmVisitor extends WatParserBaseVisitor[WIR] { if (ctx.typeUse != null) { // TODO: explicit type use val tyIndex = -1 - VarBlockType(tyIndex, None) + val funcType = visitFuncType(ctx.funcType) + VarBlockType(tyIndex, Some(funcType)) } else if (ctx.funcType != null){ // abbreviation form val ty = visitFuncType(ctx.funcType) From 9cc5940fd4f6e6c25a971e77f5d10b333ef57692 Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Wed, 16 Oct 2024 23:10:04 +0800 Subject: [PATCH 13/15] tweak test case to align new exporting requirement --- benchmarks/wasm/block.wat | 8 ++++---- src/test/scala/genwasym/TestEval.scala | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/benchmarks/wasm/block.wat b/benchmarks/wasm/block.wat index 65c08311c..d445695b9 100644 --- a/benchmarks/wasm/block.wat +++ b/benchmarks/wasm/block.wat @@ -63,8 +63,8 @@ ;; We can't use i32.add instruction here, because the overflowed value has been truncted ;; when block exited. ) - (export "real_main" (func $real_main)) - (export "test_loop_input" (func $test_loop_input)) - (export "test_if_input" (func $test_if_input)) - (export "test_poly_br" (func $test_poly_br)) + (export "real_main" (func 1)) + (export "test_loop_input" (func 2)) + (export "test_if_input" (func 3)) + (export "test_poly_br" (func 4)) ) diff --git a/src/test/scala/genwasym/TestEval.scala b/src/test/scala/genwasym/TestEval.scala index b2491c0af..d06936260 100644 --- a/src/test/scala/genwasym/TestEval.scala +++ b/src/test/scala/genwasym/TestEval.scala @@ -48,16 +48,16 @@ class TestEval extends FunSuite { } test("input_block.block") { - testFile("./benchmarks/wasm/block.wat", Some("$real_main"), Some(9)) + testFile("./benchmarks/wasm/block.wat", Some("real_main"), Some(9)) } test("input_block.loop") { - testFile("./benchmarks/wasm/block.wat", Some("$test_loop_input"), Some(55)) + testFile("./benchmarks/wasm/block.wat", Some("test_loop_input"), Some(55)) } test("input_block.if") { - testFile("./benchmarks/wasm/block.wat", Some("$test_if_input"), Some(25)) + testFile("./benchmarks/wasm/block.wat", Some("test_if_input"), Some(25)) } test("input_block.poly_br") { - testFile("./benchmarks/wasm/block.wat", Some("$test_poly_br"), Some(0)) + testFile("./benchmarks/wasm/block.wat", Some("test_poly_br"), Some(0)) } test("poly loop") { From 044da0be4ed8117e1663333ea0fec41ffdd333e2 Mon Sep 17 00:00:00 2001 From: Guannan Wei Date: Thu, 17 Oct 2024 14:25:13 +0200 Subject: [PATCH 14/15] update test case --- benchmarks/wasm/loop_poly.wat | 16 ++++---- src/test/scala/genwasym/TestEval.scala | 53 +++++++++++++++----------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/benchmarks/wasm/loop_poly.wat b/benchmarks/wasm/loop_poly.wat index 41814c6b2..7cbb2e26a 100644 --- a/benchmarks/wasm/loop_poly.wat +++ b/benchmarks/wasm/loop_poly.wat @@ -5,18 +5,16 @@ i32.const 42 i32.const 0 block (param i32 i32) (result i32 i32) - loop (type 1) (param i32) (result i32) ;; label = @1 - ;; this type use will be ignored for now + loop (type 1) (param i32) (result i32) ;; label = @1 i32.const 1 i32.const 2 br 1 (;@1;) - end + end end - ;; - [return, 0 ] - i32.add - drop + ;; this is not a valid wasm program due to the mismatch of stack shape, + ;; we only do this for testing purposes. + ;; i32.add + ;; drop ) - -;; (export "main" (func $test_poly_loop)) -(start 0) + (start 0) ) \ No newline at end of file diff --git a/src/test/scala/genwasym/TestEval.scala b/src/test/scala/genwasym/TestEval.scala index d06936260..29ab13bb1 100644 --- a/src/test/scala/genwasym/TestEval.scala +++ b/src/test/scala/genwasym/TestEval.scala @@ -14,14 +14,22 @@ import collection.mutable.ArrayBuffer import org.scalatest.FunSuite class TestEval extends FunSuite { - def testFile(filename: String, main: Option[String] = None, expected: Option[Int] = None) = { + abstract class ExpResult + case class ExpInt(i: Int) extends ExpResult + case class ExpStack(stack: List[Value]) extends ExpResult + case object Ignore extends ExpResult + + implicit def toI32V(i: Int): Value = I32V(i) + + def testFile(filename: String, main: Option[String] = None, expected: ExpResult = Ignore) = { val module = Parser.parseFile(filename) //println(module) val haltK: Evaluator.Cont[Unit] = stack => { println(s"halt cont: $stack") expected match { - case Some(e) => assert(stack(0) == I32V(e)) - case None => () + case ExpInt(e) => assert(stack(0) == I32V(e)) + case ExpStack(e) => assert(stack == e) + case Ignore => () } } Evaluator.evalTop(module, haltK, main) @@ -30,38 +38,37 @@ class TestEval extends FunSuite { // TODO: the power test can be used to test the stack // For now: 2^10 works, 2^100 results in 0 (TODO: why?), // and 2^1000 results in a stack overflow - test("ack") { testFile("./benchmarks/wasm/ack.wat", Some("real_main"), Some(7)) } - test("power") { testFile("./benchmarks/wasm/pow.wat", Some("real_main"), Some(1024)) } + test("ack") { testFile("./benchmarks/wasm/ack.wat", Some("real_main"), ExpInt(7)) } + test("power") { testFile("./benchmarks/wasm/pow.wat", Some("real_main"), ExpInt(1024)) } test("start") { testFile("./benchmarks/wasm/start.wat") } - test("fact") { testFile("./benchmarks/wasm/fact.wat", None, Some(120)) } - test("loop") { testFile("./benchmarks/wasm/loop.wat", None, Some(10)) } - test("even-odd") { testFile("./benchmarks/wasm/even_odd.wat", None, Some(1)) } - test("load") { testFile("./benchmarks/wasm/load.wat", None, Some(1)) } + test("fact") { testFile("./benchmarks/wasm/fact.wat", None, ExpInt(120)) } + test("loop") { testFile("./benchmarks/wasm/loop.wat", None, ExpInt(10)) } + test("even-odd") { testFile("./benchmarks/wasm/even_odd.wat", None, ExpInt(1)) } + test("load") { testFile("./benchmarks/wasm/load.wat", None, ExpInt(1)) } test("btree") { testFile("./benchmarks/wasm/btree/2o1u-unlabeled.wat") } - test("fib") { testFile("./benchmarks/wasm/fib.wat", None, Some(144)) } - test("tribonacci") { testFile("./benchmarks/wasm/tribonacci.wat", None, Some(504)) } + test("fib") { testFile("./benchmarks/wasm/fib.wat", None, ExpInt(144)) } + test("tribonacci") { testFile("./benchmarks/wasm/tribonacci.wat", None, ExpInt(504)) } test("return") { intercept[gensym.wasm.miniwasm.Trap] { - testFile("./benchmarks/wasm/return.wat", Some("$real_main"), None) + testFile("./benchmarks/wasm/return.wat", Some("$real_main")) } } - test("input_block.block") { - testFile("./benchmarks/wasm/block.wat", Some("real_main"), Some(9)) + test("block input") { + testFile("./benchmarks/wasm/block.wat", Some("real_main"), ExpInt(9)) } - test("input_block.loop") { - testFile("./benchmarks/wasm/block.wat", Some("test_loop_input"), Some(55)) + test("loop block input") { + testFile("./benchmarks/wasm/block.wat", Some("test_loop_input"), ExpInt(55)) } - test("input_block.if") { - testFile("./benchmarks/wasm/block.wat", Some("test_if_input"), Some(25)) + test("if block input") { + testFile("./benchmarks/wasm/block.wat", Some("test_if_input"), ExpInt(25)) } - test("input_block.poly_br") { - testFile("./benchmarks/wasm/block.wat", Some("test_poly_br"), Some(0)) + test("block input - poly br") { + testFile("./benchmarks/wasm/block.wat", Some("test_poly_br"), ExpInt(0)) } - - test("poly loop") { - testFile("./benchmarks/wasm/loop_poly.wat", None , None) + test("loop block - poly br") { + testFile("./benchmarks/wasm/loop_poly.wat", None, ExpStack(List(2, 1))) } // FIXME: From 9b6e23c0ca19987e6f968509c956ee8f3f2e66bf Mon Sep 17 00:00:00 2001 From: butterunderflow Date: Fri, 18 Oct 2024 19:10:25 +0800 Subject: [PATCH 15/15] remove some line wrappings --- src/main/scala/wasm/AST.scala | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/scala/wasm/AST.scala b/src/main/scala/wasm/AST.scala index bbdffe82d..f57f8a91d 100644 --- a/src/main/scala/wasm/AST.scala +++ b/src/main/scala/wasm/AST.scala @@ -62,17 +62,11 @@ case object Alloc extends Instr case object Free extends Instr case class Select(ty: Option[List[ValueType]]) extends Instr case class Block(ty: BlockType, instrs: List[Instr]) extends Instr -case class IdBlock(id: Int, ty: BlockType, instrs: List[Instr]) - extends Instr +case class IdBlock(id: Int, ty: BlockType, instrs: List[Instr]) extends Instr case class Loop(ty: BlockType, instrs: List[Instr]) extends Instr -case class IdLoop(id: Int, ty: BlockType, instrs: List[Instr]) - extends Instr -case class If(ty: BlockType, - thenInstrs: List[Instr], - elseInstrs: List[Instr]) - extends Instr -case class IdIf(ty: BlockType, thenInstrs: IdBlock, elseInstrs: IdBlock) - extends Instr +case class IdLoop(id: Int, ty: BlockType, instrs: List[Instr]) extends Instr +case class If(ty: BlockType, thenInstrs: List[Instr], elseInstrs: List[Instr]) extends Instr +case class IdIf(ty: BlockType, thenInstrs: IdBlock, elseInstrs: IdBlock) extends Instr // FIXME: labelId can be string? case class Br(labelId: Int) extends Instr case class BrIf(labelId: Int) extends Instr