diff --git a/ethereumj-core/src/main/java/org/ethereum/serpent/Serpent.g4 b/ethereumj-core/src/main/java/org/ethereum/serpent/Serpent.g4
index b912c219..4f422804 100644
--- a/ethereumj-core/src/main/java/org/ethereum/serpent/Serpent.g4
+++ b/ethereumj-core/src/main/java/org/ethereum/serpent/Serpent.g4
@@ -29,7 +29,7 @@ parse: block EOF
parse_init_code_block : 'init' ':' INDENT block DEDENT 'code' ':' INDENT block DEDENT;
-block: ( asm | assign | contract_storage_assign | special_func | if_elif_else_stmt |
+block: ( asm | array_assign | assign | contract_storage_assign | special_func | if_elif_else_stmt |
while_stmt | ret_func_1 | ret_func_2 | suicide_func | stop_func)* ;
@@ -106,7 +106,13 @@ send_func: 'send' '(' int_val ',' int_val ',' int_val ')';
msg_data: 'msg.data' '[' expression ']' ;
-assign: VAR EQ_OP expression NL;
+array_assign: VAR '[' int_val ']' EQ_OP expression NL;
+array_retreive: VAR '[' int_val ']';
+
+assign: VAR EQ_OP (expression | arr_def) NL;
+arr_def : '[' (int_val ','?)* ']';
+
+
contract_storage_assign: 'contract.storage' '[' expression ']' EQ_OP expression NL;
contract_storage_load: 'contract.storage' '[' expression ']';
@@ -171,9 +177,11 @@ int_val : INT |
msg_func |
msg_data |
send_func |
- contract_storage_load
+ contract_storage_load |
+ array_retreive
;
-// todo: here the val should include also retrieve a variable
+
+
hex_num
: HEX_NUMBER
@@ -189,7 +197,7 @@ get_var: VAR;
INT: [0-9]+;
-ASM_SYMBOLS: 'STOP' | 'ADD' | 'MUL' | 'SUB' | 'DIV' | 'SDIV' | 'MOD' |'SMOD' | 'EXP' | 'NEG' | 'LT' | 'GT' | 'SLT' | 'SGT'| 'EQ' | 'NOT' | 'AND' | 'OR' | 'XOR' | 'BYTE' | 'SHA3' | 'ADDRESS' | 'BALANCE' | 'ORIGIN' | 'CALLER' | 'CALLVALUE' | 'CALLDATALOAD' | 'CALLDATASIZE' | 'CALLDATACOPY' | 'CODESIZE' | 'CODECOPY' | 'GASPRICE' | 'PREVHASH' | 'COINBASE' | 'TIMESTAMP' | 'NUMBER' | 'DIFFICULTY' | 'GASLIMIT' | 'POP' | 'DUP' | 'SWAP' | 'MLOAD' | 'MSTORE' | 'MSTORE8' | 'SLOAD' | 'SSTORE' | 'JUMP' | 'JUMPI' | 'PC' | 'MSIZE' | 'GAS' | 'PUSH1' | 'PUSH2' | 'PUSH3' | 'PUSH4' | 'PUSH5' | 'PUSH6' | 'PUSH7' | 'PUSH8' | 'PUSH9' | 'PUSH10' | 'PUSH11' | 'PUSH12' | 'PUSH13' | 'PUSH14' | 'PUSH15' | 'PUSH16' | 'PUSH17' | 'PUSH18' | 'PUSH19' | 'PUSH20' | 'PUSH21' | 'PUSH22' | 'PUSH23' | 'PUSH24' | 'PUSH25' | 'PUSH26' | 'PUSH27' | 'PUSH28' | 'PUSH29' | 'PUSH30' | 'PUSH31' | 'PUSH32' | 'CREATE' | 'CALL' | 'RETURN' | 'SUICIDE';
+ASM_SYMBOLS: 'STOP' | 'ADD' | 'MUL' | 'SUB' | 'DIV' | 'SDIV' | 'MOD' |'SMOD' | 'EXP' | 'NEG' | 'LT' | 'GT' | 'SLT' | 'SGT'| 'EQ' | 'NOT' | 'AND' | 'OR' | 'XOR' | 'BYTE' | 'SHA3' | 'ADDRESS' | 'BALANCE' | 'ORIGIN' | 'CALLER' | 'CALLVALUE' | 'CALLDATALOAD' | 'CALLDATASIZE' | 'CALLDATACOPY' | 'CODESIZE' | 'CODECOPY' | 'GASPRICE' | 'PREVHASH' | 'COINBASE' | 'TIMESTAMP' | 'NUMBER' | 'DIFFICULTY' | 'GASLIMIT' | 'POP' | 'DUP' | 'SWAP' | 'MLOAD' | 'MSTORE' | 'MSTORE8' | 'SLOAD' | 'SSTORE' | 'JUMP' | 'JUMPI' | 'PC' | 'MEMSIZE' | 'GAS' | 'PUSH1' | 'PUSH2' | 'PUSH3' | 'PUSH4' | 'PUSH5' | 'PUSH6' | 'PUSH7' | 'PUSH8' | 'PUSH9' | 'PUSH10' | 'PUSH11' | 'PUSH12' | 'PUSH13' | 'PUSH14' | 'PUSH15' | 'PUSH16' | 'PUSH17' | 'PUSH18' | 'PUSH19' | 'PUSH20' | 'PUSH21' | 'PUSH22' | 'PUSH23' | 'PUSH24' | 'PUSH25' | 'PUSH26' | 'PUSH27' | 'PUSH28' | 'PUSH29' | 'PUSH30' | 'PUSH31' | 'PUSH32' | 'CREATE' | 'CALL' | 'RETURN' | 'SUICIDE';
/* 'xor', 'and', 'or', 'not' operands should be defined
@@ -210,6 +218,7 @@ LINE_COMMENT: '#' ~[\r\n]* -> skip;
VAR: [a-zA-Z][a-zA-Z0-9]* ;
+
OP_ADD : '+' | '-';
OP_MUL : '*' | '/' | '^' | '%' ;
diff --git a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentBaseListener.java b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentBaseListener.java
index e4465e73..24a61e1e 100644
--- a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentBaseListener.java
+++ b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentBaseListener.java
@@ -207,6 +207,32 @@ public class SerpentBaseListener implements SerpentListener {
*/
@Override public void exitBlock_difficulty(@NotNull SerpentParser.Block_difficultyContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArray_assign(@NotNull SerpentParser.Array_assignContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArray_assign(@NotNull SerpentParser.Array_assignContext ctx) { }
+
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArray_retreive(@NotNull SerpentParser.Array_retreiveContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArray_retreive(@NotNull SerpentParser.Array_retreiveContext ctx) { }
+
/**
* {@inheritDoc}
*
@@ -428,6 +454,19 @@ public class SerpentBaseListener implements SerpentListener {
*/
@Override public void exitSend_func(@NotNull SerpentParser.Send_funcContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArr_def(@NotNull SerpentParser.Arr_defContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArr_def(@NotNull SerpentParser.Arr_defContext ctx) { }
+
/**
* {@inheritDoc}
*
diff --git a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentBaseVisitor.java b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentBaseVisitor.java
index 4831cf48..81c36c08 100644
--- a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentBaseVisitor.java
+++ b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentBaseVisitor.java
@@ -132,6 +132,22 @@ public class SerpentBaseVisitor extends AbstractParseTreeVisitor implement
*/
@Override public T visitBlock_difficulty(@NotNull SerpentParser.Block_difficultyContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitArray_assign(@NotNull SerpentParser.Array_assignContext ctx) { return visitChildren(ctx); }
+
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitArray_retreive(@NotNull SerpentParser.Array_retreiveContext ctx) { return visitChildren(ctx); }
+
/**
* {@inheritDoc}
*
@@ -268,6 +284,14 @@ public class SerpentBaseVisitor extends AbstractParseTreeVisitor implement
*/
@Override public T visitSend_func(@NotNull SerpentParser.Send_funcContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitArr_def(@NotNull SerpentParser.Arr_defContext ctx) { return visitChildren(ctx); }
+
/**
* {@inheritDoc}
*
diff --git a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentCompiler.java b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentCompiler.java
index aa381562..c5c0462e 100644
--- a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentCompiler.java
+++ b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentCompiler.java
@@ -225,4 +225,6 @@ public class SerpentCompiler {
return result;
}
+
+
}
diff --git a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentLexer.java b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentLexer.java
index b2fd39da..0c7af71f 100644
--- a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentLexer.java
+++ b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentLexer.java
@@ -108,7 +108,7 @@ public class SerpentLexer extends Lexer {
}
public static final String _serializedATN =
- "\3\uacf5\uee8c\u4f5d\u8b0d\u4a45\u78bd\u1b2f\u3378\2\67\u03be\b\1\4\2"+
+ "\3\uacf5\uee8c\u4f5d\u8b0d\u4a45\u78bd\u1b2f\u3378\2\67\u03c0\b\1\4\2"+
"\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4"+
"\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
@@ -154,296 +154,297 @@ public class SerpentLexer extends Lexer {
"\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%"+
"\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%"+
"\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%"+
- "\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u0361\n%\3&\3&\3&\3&\3\'\3\'\3"+
- "\'\3\'\3\'\5\'\u036c\n\'\3(\3(\3(\3(\5(\u0372\n(\3)\3)\3)\3)\5)\u0378"+
- "\n)\3*\3*\3+\5+\u037d\n+\3+\3+\7+\u0381\n+\f+\16+\u0384\13+\3,\6,\u0387"+
- "\n,\r,\16,\u0388\3,\3,\3-\3-\7-\u038f\n-\f-\16-\u0392\13-\3-\3-\3.\3."+
- "\7.\u0398\n.\f.\16.\u039b\13.\3/\3/\3\60\3\60\3\61\3\61\3\61\3\61\3\61"+
- "\5\61\u03a6\n\61\3\62\3\62\3\62\3\62\5\62\u03ac\n\62\3\63\3\63\3\64\3"+
- "\64\3\65\3\65\3\66\3\66\3\66\3\66\5\66\u03b8\n\66\3\66\6\66\u03bb\n\66"+
- "\r\66\16\66\u03bc\2\67\3\3\1\5\4\1\7\5\1\t\6\1\13\7\1\r\b\1\17\t\1\21"+
- "\n\1\23\13\1\25\f\1\27\r\1\31\16\1\33\17\1\35\20\1\37\21\1!\22\1#\23\1"+
- "%\24\1\'\25\1)\26\1+\27\1-\30\1/\31\1\61\32\1\63\33\1\65\34\1\67\35\1"+
- "9\36\1;\37\1= \1?!\1A\"\1C#\1E$\1G%\1I&\1K\'\1M(\1O)\1Q*\1S+\1U,\1W-\2"+
- "Y.\3[/\1]\60\1_\61\1a\62\1c\63\1e\64\1g\65\1i\66\1k\67\1\3\2\13\3\2\62"+
- ";\4\2\13\13\"\"\4\2\f\f\17\17\4\2C\\c|\5\2\62;C\\c|\4\2--//\6\2\'\',,"+
- "\61\61``\4\2>>@@\5\2\62;CHch\u0421\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2"+
- "\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3"+
- "\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2"+
- "\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2"+
- "\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2"+
- "\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2"+
- "\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2"+
- "O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3"+
- "\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2"+
- "\2\2i\3\2\2\2\2k\3\2\2\2\3m\3\2\2\2\5o\3\2\2\2\7t\3\2\2\2\t\u0083\3\2"+
- "\2\2\13\u0085\3\2\2\2\r\u0089\3\2\2\2\17\u0090\3\2\2\2\21\u0096\3\2\2"+
- "\2\23\u0098\3\2\2\2\25\u009a\3\2\2\2\27\u009c\3\2\2\2\31\u009f\3\2\2\2"+
- "\33\u00a4\3\2\2\2\35\u00b4\3\2\2\2\37\u00b9\3\2\2\2!\u00c3\3\2\2\2#\u00c8"+
- "\3\2\2\2%\u00d7\3\2\2\2\'\u00e8\3\2\2\2)\u00f0\3\2\2\2+\u0101\3\2\2\2"+
- "-\u010e\3\2\2\2/\u0110\3\2\2\2\61\u011c\3\2\2\2\63\u0122\3\2\2\2\65\u012c"+
- "\3\2\2\2\67\u0135\3\2\2\29\u013a\3\2\2\2;\u0141\3\2\2\2=\u014c\3\2\2\2"+
- "?\u015d\3\2\2\2A\u0162\3\2\2\2C\u0171\3\2\2\2E\u017e\3\2\2\2G\u0184\3"+
- "\2\2\2I\u0360\3\2\2\2K\u0362\3\2\2\2M\u036b\3\2\2\2O\u0371\3\2\2\2Q\u0377"+
- "\3\2\2\2S\u0379\3\2\2\2U\u037c\3\2\2\2W\u0386\3\2\2\2Y\u038c\3\2\2\2["+
- "\u0395\3\2\2\2]\u039c\3\2\2\2_\u039e\3\2\2\2a\u03a5\3\2\2\2c\u03ab\3\2"+
- "\2\2e\u03ad\3\2\2\2g\u03af\3\2\2\2i\u03b1\3\2\2\2k\u03b7\3\2\2\2mn\7_"+
- "\2\2n\4\3\2\2\2op\7u\2\2pq\7v\2\2qr\7q\2\2rs\7r\2\2s\6\3\2\2\2tu\7d\2"+
- "\2uv\7n\2\2vw\7q\2\2wx\7e\2\2xy\7m\2\2yz\7\60\2\2z{\7e\2\2{|\7q\2\2|}"+
- "\7k\2\2}~\7p\2\2~\177\7d\2\2\177\u0080\7c\2\2\u0080\u0081\7u\2\2\u0081"+
- "\u0082\7g\2\2\u0082\b\3\2\2\2\u0083\u0084\7.\2\2\u0084\n\3\2\2\2\u0085"+
- "\u0086\7o\2\2\u0086\u0087\7u\2\2\u0087\u0088\7i\2\2\u0088\f\3\2\2\2\u0089"+
- "\u008a\7v\2\2\u008a\u008b\7z\2\2\u008b\u008c\7\60\2\2\u008c\u008d\7i\2"+
- "\2\u008d\u008e\7c\2\2\u008e\u008f\7u\2\2\u008f\16\3\2\2\2\u0090\u0091"+
- "\7y\2\2\u0091\u0092\7j\2\2\u0092\u0093\7k\2\2\u0093\u0094\7n\2\2\u0094"+
- "\u0095\7g\2\2\u0095\20\3\2\2\2\u0096\u0097\7]\2\2\u0097\22\3\2\2\2\u0098"+
- "\u0099\7*\2\2\u0099\24\3\2\2\2\u009a\u009b\7<\2\2\u009b\26\3\2\2\2\u009c"+
- "\u009d\7k\2\2\u009d\u009e\7h\2\2\u009e\30\3\2\2\2\u009f\u00a0\7u\2\2\u00a0"+
- "\u00a1\7g\2\2\u00a1\u00a2\7p\2\2\u00a2\u00a3\7f\2\2\u00a3\32\3\2\2\2\u00a4"+
- "\u00a5\7d\2\2\u00a5\u00a6\7n\2\2\u00a6\u00a7\7q\2\2\u00a7\u00a8\7e\2\2"+
- "\u00a8\u00a9\7m\2\2\u00a9\u00aa\7\60\2\2\u00aa\u00ab\7v\2\2\u00ab\u00ac"+
- "\7k\2\2\u00ac\u00ad\7o\2\2\u00ad\u00ae\7g\2\2\u00ae\u00af\7u\2\2\u00af"+
- "\u00b0\7v\2\2\u00b0\u00b1\7c\2\2\u00b1\u00b2\7o\2\2\u00b2\u00b3\7r\2\2"+
- "\u00b3\34\3\2\2\2\u00b4\u00b5\7]\2\2\u00b5\u00b6\7c\2\2\u00b6\u00b7\7"+
- "u\2\2\u00b7\u00b8\7o\2\2\u00b8\36\3\2\2\2\u00b9\u00ba\7o\2\2\u00ba\u00bb"+
- "\7u\2\2\u00bb\u00bc\7i\2\2\u00bc\u00bd\7\60\2\2\u00bd\u00be\7x\2\2\u00be"+
- "\u00bf\7c\2\2\u00bf\u00c0\7n\2\2\u00c0\u00c1\7w\2\2\u00c1\u00c2\7g\2\2"+
- "\u00c2 \3\2\2\2\u00c3\u00c4\7k\2\2\u00c4\u00c5\7p\2\2\u00c5\u00c6\7k\2"+
- "\2\u00c6\u00c7\7v\2\2\u00c7\"\3\2\2\2\u00c8\u00c9\7d\2\2\u00c9\u00ca\7"+
- "n\2\2\u00ca\u00cb\7q\2\2\u00cb\u00cc\7e\2\2\u00cc\u00cd\7m\2\2\u00cd\u00ce"+
- "\7\60\2\2\u00ce\u00cf\7r\2\2\u00cf\u00d0\7t\2\2\u00d0\u00d1\7g\2\2\u00d1"+
- "\u00d2\7x\2\2\u00d2\u00d3\7j\2\2\u00d3\u00d4\7c\2\2\u00d4\u00d5\7u\2\2"+
- "\u00d5\u00d6\7j\2\2\u00d6$\3\2\2\2\u00d7\u00d8\7e\2\2\u00d8\u00d9\7q\2"+
- "\2\u00d9\u00da\7p\2\2\u00da\u00db\7v\2\2\u00db\u00dc\7t\2\2\u00dc\u00dd"+
- "\7c\2\2\u00dd\u00de\7e\2\2\u00de\u00df\7v\2\2\u00df\u00e0\7\60\2\2\u00e0"+
- "\u00e1\7u\2\2\u00e1\u00e2\7v\2\2\u00e2\u00e3\7q\2\2\u00e3\u00e4\7t\2\2"+
- "\u00e4\u00e5\7c\2\2\u00e5\u00e6\7i\2\2\u00e6\u00e7\7g\2\2\u00e7&\3\2\2"+
- "\2\u00e8\u00e9\7u\2\2\u00e9\u00ea\7w\2\2\u00ea\u00eb\7k\2\2\u00eb\u00ec"+
- "\7e\2\2\u00ec\u00ed\7k\2\2\u00ed\u00ee\7f\2\2\u00ee\u00ef\7g\2\2\u00ef"+
- "(\3\2\2\2\u00f0\u00f1\7d\2\2\u00f1\u00f2\7n\2\2\u00f2\u00f3\7q\2\2\u00f3"+
- "\u00f4\7e\2\2\u00f4\u00f5\7m\2\2\u00f5\u00f6\7\60\2\2\u00f6\u00f7\7f\2"+
- "\2\u00f7\u00f8\7k\2\2\u00f8\u00f9\7h\2\2\u00f9\u00fa\7h\2\2\u00fa\u00fb"+
- "\7k\2\2\u00fb\u00fc\7e\2\2\u00fc\u00fd\7w\2\2\u00fd\u00fe\7n\2\2\u00fe"+
- "\u00ff\7v\2\2\u00ff\u0100\7{\2\2\u0100*\3\2\2\2\u0101\u0102\7o\2\2\u0102"+
- "\u0103\7u\2\2\u0103\u0104\7i\2\2\u0104\u0105\7\60\2\2\u0105\u0106\7f\2"+
- "\2\u0106\u0107\7c\2\2\u0107\u0108\7v\2\2\u0108\u0109\7c\2\2\u0109\u010a"+
- "\7u\2\2\u010a\u010b\7k\2\2\u010b\u010c\7|\2\2\u010c\u010d\7g\2\2\u010d"+
- ",\3\2\2\2\u010e\u010f\7+\2\2\u010f.\3\2\2\2\u0110\u0111\7v\2\2\u0111\u0112"+
- "\7z\2\2\u0112\u0113\7\60\2\2\u0113\u0114\7i\2\2\u0114\u0115\7c\2\2\u0115"+
- "\u0116\7u\2\2\u0116\u0117\7r\2\2\u0117\u0118\7t\2\2\u0118\u0119\7k\2\2"+
- "\u0119\u011a\7e\2\2\u011a\u011b\7g\2\2\u011b\60\3\2\2\2\u011c\u011d\7"+
- "g\2\2\u011d\u011e\7n\2\2\u011e\u011f\7u\2\2\u011f\u0120\7g\2\2\u0120\u0121"+
- "\7<\2\2\u0121\62\3\2\2\2\u0122\u0123\7v\2\2\u0123\u0124\7z\2\2\u0124\u0125"+
- "\7\60\2\2\u0125\u0126\7q\2\2\u0126\u0127\7t\2\2\u0127\u0128\7k\2\2\u0128"+
- "\u0129\7i\2\2\u0129\u012a\7k\2\2\u012a\u012b\7p\2\2\u012b\64\3\2\2\2\u012c"+
- "\u012d\7o\2\2\u012d\u012e\7u\2\2\u012e\u012f\7i\2\2\u012f\u0130\7\60\2"+
- "\2\u0130\u0131\7f\2\2\u0131\u0132\7c\2\2\u0132\u0133\7v\2\2\u0133\u0134"+
- "\7c\2\2\u0134\66\3\2\2\2\u0135\u0136\7g\2\2\u0136\u0137\7n\2\2\u0137\u0138"+
- "\7k\2\2\u0138\u0139\7h\2\2\u01398\3\2\2\2\u013a\u013b\7t\2\2\u013b\u013c"+
- "\7g\2\2\u013c\u013d\7v\2\2\u013d\u013e\7w\2\2\u013e\u013f\7t\2\2\u013f"+
- "\u0140\7p\2\2\u0140:\3\2\2\2\u0141\u0142\7o\2\2\u0142\u0143\7u\2\2\u0143"+
- "\u0144\7i\2\2\u0144\u0145\7\60\2\2\u0145\u0146\7u\2\2\u0146\u0147\7g\2"+
- "\2\u0147\u0148\7p\2\2\u0148\u0149\7f\2\2\u0149\u014a\7g\2\2\u014a\u014b"+
- "\7t\2\2\u014b<\3\2\2\2\u014c\u014d\7e\2\2\u014d\u014e\7q\2\2\u014e\u014f"+
- "\7p\2\2\u014f\u0150\7v\2\2\u0150\u0151\7t\2\2\u0151\u0152\7c\2\2\u0152"+
- "\u0153\7e\2\2\u0153\u0154\7v\2\2\u0154\u0155\7\60\2\2\u0155\u0156\7d\2"+
- "\2\u0156\u0157\7c\2\2\u0157\u0158\7n\2\2\u0158\u0159\7c\2\2\u0159\u015a"+
- "\7p\2\2\u015a\u015b\7e\2\2\u015b\u015c\7g\2\2\u015c>\3\2\2\2\u015d\u015e"+
- "\7c\2\2\u015e\u015f\7u\2\2\u015f\u0160\7o\2\2\u0160\u0161\7_\2\2\u0161"+
- "@\3\2\2\2\u0162\u0163\7d\2\2\u0163\u0164\7n\2\2\u0164\u0165\7q\2\2\u0165"+
- "\u0166\7e\2\2\u0166\u0167\7m\2\2\u0167\u0168\7\60\2\2\u0168\u0169\7i\2"+
- "\2\u0169\u016a\7c\2\2\u016a\u016b\7u\2\2\u016b\u016c\7n\2\2\u016c\u016d"+
- "\7k\2\2\u016d\u016e\7o\2\2\u016e\u016f\7k\2\2\u016f\u0170\7v\2\2\u0170"+
- "B\3\2\2\2\u0171\u0172\7d\2\2\u0172\u0173\7n\2\2\u0173\u0174\7q\2\2\u0174"+
- "\u0175\7e\2\2\u0175\u0176\7m\2\2\u0176\u0177\7\60\2\2\u0177\u0178\7p\2"+
- "\2\u0178\u0179\7w\2\2\u0179\u017a\7o\2\2\u017a\u017b\7d\2\2\u017b\u017c"+
- "\7g\2\2\u017c\u017d\7t\2\2\u017dD\3\2\2\2\u017e\u017f\7e\2\2\u017f\u0180"+
- "\7q\2\2\u0180\u0181\7f\2\2\u0181\u0182\7g\2\2\u0182F\3\2\2\2\u0183\u0185"+
- "\t\2\2\2\u0184\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0184\3\2\2\2\u0186"+
- "\u0187\3\2\2\2\u0187H\3\2\2\2\u0188\u0189\7U\2\2\u0189\u018a\7V\2\2\u018a"+
- "\u018b\7Q\2\2\u018b\u0361\7R\2\2\u018c\u018d\7C\2\2\u018d\u018e\7F\2\2"+
- "\u018e\u0361\7F\2\2\u018f\u0190\7O\2\2\u0190\u0191\7W\2\2\u0191\u0361"+
- "\7N\2\2\u0192\u0193\7U\2\2\u0193\u0194\7W\2\2\u0194\u0361\7D\2\2\u0195"+
- "\u0196\7F\2\2\u0196\u0197\7K\2\2\u0197\u0361\7X\2\2\u0198\u0199\7U\2\2"+
- "\u0199\u019a\7F\2\2\u019a\u019b\7K\2\2\u019b\u0361\7X\2\2\u019c\u019d"+
- "\7O\2\2\u019d\u019e\7Q\2\2\u019e\u0361\7F\2\2\u019f\u01a0\7U\2\2\u01a0"+
- "\u01a1\7O\2\2\u01a1\u01a2\7Q\2\2\u01a2\u0361\7F\2\2\u01a3\u01a4\7G\2\2"+
- "\u01a4\u01a5\7Z\2\2\u01a5\u0361\7R\2\2\u01a6\u01a7\7P\2\2\u01a7\u01a8"+
- "\7G\2\2\u01a8\u0361\7I\2\2\u01a9\u01aa\7N\2\2\u01aa\u0361\7V\2\2\u01ab"+
- "\u01ac\7I\2\2\u01ac\u0361\7V\2\2\u01ad\u01ae\7U\2\2\u01ae\u01af\7N\2\2"+
- "\u01af\u0361\7V\2\2\u01b0\u01b1\7U\2\2\u01b1\u01b2\7I\2\2\u01b2\u0361"+
- "\7V\2\2\u01b3\u01b4\7G\2\2\u01b4\u0361\7S\2\2\u01b5\u01b6\7P\2\2\u01b6"+
- "\u01b7\7Q\2\2\u01b7\u0361\7V\2\2\u01b8\u01b9\7C\2\2\u01b9\u01ba\7P\2\2"+
- "\u01ba\u0361\7F\2\2\u01bb\u01bc\7Q\2\2\u01bc\u0361\7T\2\2\u01bd\u01be"+
- "\7Z\2\2\u01be\u01bf\7Q\2\2\u01bf\u0361\7T\2\2\u01c0\u01c1\7D\2\2\u01c1"+
- "\u01c2\7[\2\2\u01c2\u01c3\7V\2\2\u01c3\u0361\7G\2\2\u01c4\u01c5\7U\2\2"+
- "\u01c5\u01c6\7J\2\2\u01c6\u01c7\7C\2\2\u01c7\u0361\7\65\2\2\u01c8\u01c9"+
- "\7C\2\2\u01c9\u01ca\7F\2\2\u01ca\u01cb\7F\2\2\u01cb\u01cc\7T\2\2\u01cc"+
- "\u01cd\7G\2\2\u01cd\u01ce\7U\2\2\u01ce\u0361\7U\2\2\u01cf\u01d0\7D\2\2"+
- "\u01d0\u01d1\7C\2\2\u01d1\u01d2\7N\2\2\u01d2\u01d3\7C\2\2\u01d3\u01d4"+
- "\7P\2\2\u01d4\u01d5\7E\2\2\u01d5\u0361\7G\2\2\u01d6\u01d7\7Q\2\2\u01d7"+
- "\u01d8\7T\2\2\u01d8\u01d9\7K\2\2\u01d9\u01da\7I\2\2\u01da\u01db\7K\2\2"+
- "\u01db\u0361\7P\2\2\u01dc\u01dd\7E\2\2\u01dd\u01de\7C\2\2\u01de\u01df"+
- "\7N\2\2\u01df\u01e0\7N\2\2\u01e0\u01e1\7G\2\2\u01e1\u0361\7T\2\2\u01e2"+
- "\u01e3\7E\2\2\u01e3\u01e4\7C\2\2\u01e4\u01e5\7N\2\2\u01e5\u01e6\7N\2\2"+
- "\u01e6\u01e7\7X\2\2\u01e7\u01e8\7C\2\2\u01e8\u01e9\7N\2\2\u01e9\u01ea"+
- "\7W\2\2\u01ea\u0361\7G\2\2\u01eb\u01ec\7E\2\2\u01ec\u01ed\7C\2\2\u01ed"+
- "\u01ee\7N\2\2\u01ee\u01ef\7N\2\2\u01ef\u01f0\7F\2\2\u01f0\u01f1\7C\2\2"+
- "\u01f1\u01f2\7V\2\2\u01f2\u01f3\7C\2\2\u01f3\u01f4\7N\2\2\u01f4\u01f5"+
- "\7Q\2\2\u01f5\u01f6\7C\2\2\u01f6\u0361\7F\2\2\u01f7\u01f8\7E\2\2\u01f8"+
- "\u01f9\7C\2\2\u01f9\u01fa\7N\2\2\u01fa\u01fb\7N\2\2\u01fb\u01fc\7F\2\2"+
- "\u01fc\u01fd\7C\2\2\u01fd\u01fe\7V\2\2\u01fe\u01ff\7C\2\2\u01ff\u0200"+
- "\7U\2\2\u0200\u0201\7K\2\2\u0201\u0202\7\\\2\2\u0202\u0361\7G\2\2\u0203"+
- "\u0204\7E\2\2\u0204\u0205\7C\2\2\u0205\u0206\7N\2\2\u0206\u0207\7N\2\2"+
- "\u0207\u0208\7F\2\2\u0208\u0209\7C\2\2\u0209\u020a\7V\2\2\u020a\u020b"+
- "\7C\2\2\u020b\u020c\7E\2\2\u020c\u020d\7Q\2\2\u020d\u020e\7R\2\2\u020e"+
- "\u0361\7[\2\2\u020f\u0210\7E\2\2\u0210\u0211\7Q\2\2\u0211\u0212\7F\2\2"+
- "\u0212\u0213\7G\2\2\u0213\u0214\7U\2\2\u0214\u0215\7K\2\2\u0215\u0216"+
- "\7\\\2\2\u0216\u0361\7G\2\2\u0217\u0218\7E\2\2\u0218\u0219\7Q\2\2\u0219"+
- "\u021a\7F\2\2\u021a\u021b\7G\2\2\u021b\u021c\7E\2\2\u021c\u021d\7Q\2\2"+
- "\u021d\u021e\7R\2\2\u021e\u0361\7[\2\2\u021f\u0220\7I\2\2\u0220\u0221"+
- "\7C\2\2\u0221\u0222\7U\2\2\u0222\u0223\7R\2\2\u0223\u0224\7T\2\2\u0224"+
- "\u0225\7K\2\2\u0225\u0226\7E\2\2\u0226\u0361\7G\2\2\u0227\u0228\7R\2\2"+
- "\u0228\u0229\7T\2\2\u0229\u022a\7G\2\2\u022a\u022b\7X\2\2\u022b\u022c"+
- "\7J\2\2\u022c\u022d\7C\2\2\u022d\u022e\7U\2\2\u022e\u0361\7J\2\2\u022f"+
- "\u0230\7E\2\2\u0230\u0231\7Q\2\2\u0231\u0232\7K\2\2\u0232\u0233\7P\2\2"+
- "\u0233\u0234\7D\2\2\u0234\u0235\7C\2\2\u0235\u0236\7U\2\2\u0236\u0361"+
- "\7G\2\2\u0237\u0238\7V\2\2\u0238\u0239\7K\2\2\u0239\u023a\7O\2\2\u023a"+
- "\u023b\7G\2\2\u023b\u023c\7U\2\2\u023c\u023d\7V\2\2\u023d\u023e\7C\2\2"+
- "\u023e\u023f\7O\2\2\u023f\u0361\7R\2\2\u0240\u0241\7P\2\2\u0241\u0242"+
- "\7W\2\2\u0242\u0243\7O\2\2\u0243\u0244\7D\2\2\u0244\u0245\7G\2\2\u0245"+
- "\u0361\7T\2\2\u0246\u0247\7F\2\2\u0247\u0248\7K\2\2\u0248\u0249\7H\2\2"+
- "\u0249\u024a\7H\2\2\u024a\u024b\7K\2\2\u024b\u024c\7E\2\2\u024c\u024d"+
- "\7W\2\2\u024d\u024e\7N\2\2\u024e\u024f\7V\2\2\u024f\u0361\7[\2\2\u0250"+
- "\u0251\7I\2\2\u0251\u0252\7C\2\2\u0252\u0253\7U\2\2\u0253\u0254\7N\2\2"+
- "\u0254\u0255\7K\2\2\u0255\u0256\7O\2\2\u0256\u0257\7K\2\2\u0257\u0361"+
- "\7V\2\2\u0258\u0259\7R\2\2\u0259\u025a\7Q\2\2\u025a\u0361\7R\2\2\u025b"+
- "\u025c\7F\2\2\u025c\u025d\7W\2\2\u025d\u0361\7R\2\2\u025e\u025f\7U\2\2"+
- "\u025f\u0260\7Y\2\2\u0260\u0261\7C\2\2\u0261\u0361\7R\2\2\u0262\u0263"+
- "\7O\2\2\u0263\u0264\7N\2\2\u0264\u0265\7Q\2\2\u0265\u0266\7C\2\2\u0266"+
- "\u0361\7F\2\2\u0267\u0268\7O\2\2\u0268\u0269\7U\2\2\u0269\u026a\7V\2\2"+
- "\u026a\u026b\7Q\2\2\u026b\u026c\7T\2\2\u026c\u0361\7G\2\2\u026d\u026e"+
- "\7O\2\2\u026e\u026f\7U\2\2\u026f\u0270\7V\2\2\u0270\u0271\7Q\2\2\u0271"+
- "\u0272\7T\2\2\u0272\u0273\7G\2\2\u0273\u0361\7:\2\2\u0274\u0275\7U\2\2"+
- "\u0275\u0276\7N\2\2\u0276\u0277\7Q\2\2\u0277\u0278\7C\2\2\u0278\u0361"+
- "\7F\2\2\u0279\u027a\7U\2\2\u027a\u027b\7U\2\2\u027b\u027c\7V\2\2\u027c"+
- "\u027d\7Q\2\2\u027d\u027e\7T\2\2\u027e\u0361\7G\2\2\u027f\u0280\7L\2\2"+
- "\u0280\u0281\7W\2\2\u0281\u0282\7O\2\2\u0282\u0361\7R\2\2\u0283\u0284"+
- "\7L\2\2\u0284\u0285\7W\2\2\u0285\u0286\7O\2\2\u0286\u0287\7R\2\2\u0287"+
- "\u0361\7K\2\2\u0288\u0289\7R\2\2\u0289\u0361\7E\2\2\u028a\u028b\7O\2\2"+
- "\u028b\u028c\7U\2\2\u028c\u028d\7K\2\2\u028d\u028e\7\\\2\2\u028e\u0361"+
- "\7G\2\2\u028f\u0290\7I\2\2\u0290\u0291\7C\2\2\u0291\u0361\7U\2\2\u0292"+
- "\u0293\7R\2\2\u0293\u0294\7W\2\2\u0294\u0295\7U\2\2\u0295\u0296\7J\2\2"+
- "\u0296\u0361\7\63\2\2\u0297\u0298\7R\2\2\u0298\u0299\7W\2\2\u0299\u029a"+
- "\7U\2\2\u029a\u029b\7J\2\2\u029b\u0361\7\64\2\2\u029c\u029d\7R\2\2\u029d"+
- "\u029e\7W\2\2\u029e\u029f\7U\2\2\u029f\u02a0\7J\2\2\u02a0\u0361\7\65\2"+
- "\2\u02a1\u02a2\7R\2\2\u02a2\u02a3\7W\2\2\u02a3\u02a4\7U\2\2\u02a4\u02a5"+
- "\7J\2\2\u02a5\u0361\7\66\2\2\u02a6\u02a7\7R\2\2\u02a7\u02a8\7W\2\2\u02a8"+
- "\u02a9\7U\2\2\u02a9\u02aa\7J\2\2\u02aa\u0361\7\67\2\2\u02ab\u02ac\7R\2"+
- "\2\u02ac\u02ad\7W\2\2\u02ad\u02ae\7U\2\2\u02ae\u02af\7J\2\2\u02af\u0361"+
- "\78\2\2\u02b0\u02b1\7R\2\2\u02b1\u02b2\7W\2\2\u02b2\u02b3\7U\2\2\u02b3"+
- "\u02b4\7J\2\2\u02b4\u0361\79\2\2\u02b5\u02b6\7R\2\2\u02b6\u02b7\7W\2\2"+
- "\u02b7\u02b8\7U\2\2\u02b8\u02b9\7J\2\2\u02b9\u0361\7:\2\2\u02ba\u02bb"+
- "\7R\2\2\u02bb\u02bc\7W\2\2\u02bc\u02bd\7U\2\2\u02bd\u02be\7J\2\2\u02be"+
- "\u0361\7;\2\2\u02bf\u02c0\7R\2\2\u02c0\u02c1\7W\2\2\u02c1\u02c2\7U\2\2"+
- "\u02c2\u02c3\7J\2\2\u02c3\u02c4\7\63\2\2\u02c4\u0361\7\62\2\2\u02c5\u02c6"+
- "\7R\2\2\u02c6\u02c7\7W\2\2\u02c7\u02c8\7U\2\2\u02c8\u02c9\7J\2\2\u02c9"+
- "\u02ca\7\63\2\2\u02ca\u0361\7\63\2\2\u02cb\u02cc\7R\2\2\u02cc\u02cd\7"+
- "W\2\2\u02cd\u02ce\7U\2\2\u02ce\u02cf\7J\2\2\u02cf\u02d0\7\63\2\2\u02d0"+
- "\u0361\7\64\2\2\u02d1\u02d2\7R\2\2\u02d2\u02d3\7W\2\2\u02d3\u02d4\7U\2"+
- "\2\u02d4\u02d5\7J\2\2\u02d5\u02d6\7\63\2\2\u02d6\u0361\7\65\2\2\u02d7"+
- "\u02d8\7R\2\2\u02d8\u02d9\7W\2\2\u02d9\u02da\7U\2\2\u02da\u02db\7J\2\2"+
- "\u02db\u02dc\7\63\2\2\u02dc\u0361\7\66\2\2\u02dd\u02de\7R\2\2\u02de\u02df"+
- "\7W\2\2\u02df\u02e0\7U\2\2\u02e0\u02e1\7J\2\2\u02e1\u02e2\7\63\2\2\u02e2"+
- "\u0361\7\67\2\2\u02e3\u02e4\7R\2\2\u02e4\u02e5\7W\2\2\u02e5\u02e6\7U\2"+
- "\2\u02e6\u02e7\7J\2\2\u02e7\u02e8\7\63\2\2\u02e8\u0361\78\2\2\u02e9\u02ea"+
- "\7R\2\2\u02ea\u02eb\7W\2\2\u02eb\u02ec\7U\2\2\u02ec\u02ed\7J\2\2\u02ed"+
- "\u02ee\7\63\2\2\u02ee\u0361\79\2\2\u02ef\u02f0\7R\2\2\u02f0\u02f1\7W\2"+
- "\2\u02f1\u02f2\7U\2\2\u02f2\u02f3\7J\2\2\u02f3\u02f4\7\63\2\2\u02f4\u0361"+
- "\7:\2\2\u02f5\u02f6\7R\2\2\u02f6\u02f7\7W\2\2\u02f7\u02f8\7U\2\2\u02f8"+
- "\u02f9\7J\2\2\u02f9\u02fa\7\63\2\2\u02fa\u0361\7;\2\2\u02fb\u02fc\7R\2"+
- "\2\u02fc\u02fd\7W\2\2\u02fd\u02fe\7U\2\2\u02fe\u02ff\7J\2\2\u02ff\u0300"+
- "\7\64\2\2\u0300\u0361\7\62\2\2\u0301\u0302\7R\2\2\u0302\u0303\7W\2\2\u0303"+
- "\u0304\7U\2\2\u0304\u0305\7J\2\2\u0305\u0306\7\64\2\2\u0306\u0361\7\63"+
- "\2\2\u0307\u0308\7R\2\2\u0308\u0309\7W\2\2\u0309\u030a\7U\2\2\u030a\u030b"+
- "\7J\2\2\u030b\u030c\7\64\2\2\u030c\u0361\7\64\2\2\u030d\u030e\7R\2\2\u030e"+
- "\u030f\7W\2\2\u030f\u0310\7U\2\2\u0310\u0311\7J\2\2\u0311\u0312\7\64\2"+
- "\2\u0312\u0361\7\65\2\2\u0313\u0314\7R\2\2\u0314\u0315\7W\2\2\u0315\u0316"+
- "\7U\2\2\u0316\u0317\7J\2\2\u0317\u0318\7\64\2\2\u0318\u0361\7\66\2\2\u0319"+
- "\u031a\7R\2\2\u031a\u031b\7W\2\2\u031b\u031c\7U\2\2\u031c\u031d\7J\2\2"+
- "\u031d\u031e\7\64\2\2\u031e\u0361\7\67\2\2\u031f\u0320\7R\2\2\u0320\u0321"+
- "\7W\2\2\u0321\u0322\7U\2\2\u0322\u0323\7J\2\2\u0323\u0324\7\64\2\2\u0324"+
- "\u0361\78\2\2\u0325\u0326\7R\2\2\u0326\u0327\7W\2\2\u0327\u0328\7U\2\2"+
- "\u0328\u0329\7J\2\2\u0329\u032a\7\64\2\2\u032a\u0361\79\2\2\u032b\u032c"+
- "\7R\2\2\u032c\u032d\7W\2\2\u032d\u032e\7U\2\2\u032e\u032f\7J\2\2\u032f"+
- "\u0330\7\64\2\2\u0330\u0361\7:\2\2\u0331\u0332\7R\2\2\u0332\u0333\7W\2"+
- "\2\u0333\u0334\7U\2\2\u0334\u0335\7J\2\2\u0335\u0336\7\64\2\2\u0336\u0361"+
- "\7;\2\2\u0337\u0338\7R\2\2\u0338\u0339\7W\2\2\u0339\u033a\7U\2\2\u033a"+
- "\u033b\7J\2\2\u033b\u033c\7\65\2\2\u033c\u0361\7\62\2\2\u033d\u033e\7"+
- "R\2\2\u033e\u033f\7W\2\2\u033f\u0340\7U\2\2\u0340\u0341\7J\2\2\u0341\u0342"+
- "\7\65\2\2\u0342\u0361\7\63\2\2\u0343\u0344\7R\2\2\u0344\u0345\7W\2\2\u0345"+
- "\u0346\7U\2\2\u0346\u0347\7J\2\2\u0347\u0348\7\65\2\2\u0348\u0361\7\64"+
- "\2\2\u0349\u034a\7E\2\2\u034a\u034b\7T\2\2\u034b\u034c\7G\2\2\u034c\u034d"+
- "\7C\2\2\u034d\u034e\7V\2\2\u034e\u0361\7G\2\2\u034f\u0350\7E\2\2\u0350"+
- "\u0351\7C\2\2\u0351\u0352\7N\2\2\u0352\u0361\7N\2\2\u0353\u0354\7T\2\2"+
- "\u0354\u0355\7G\2\2\u0355\u0356\7V\2\2\u0356\u0357\7W\2\2\u0357\u0358"+
- "\7T\2\2\u0358\u0361\7P\2\2\u0359\u035a\7U\2\2\u035a\u035b\7W\2\2\u035b"+
- "\u035c\7K\2\2\u035c\u035d\7E\2\2\u035d\u035e\7K\2\2\u035e\u035f\7F\2\2"+
- "\u035f\u0361\7G\2\2\u0360\u0188\3\2\2\2\u0360\u018c\3\2\2\2\u0360\u018f"+
- "\3\2\2\2\u0360\u0192\3\2\2\2\u0360\u0195\3\2\2\2\u0360\u0198\3\2\2\2\u0360"+
- "\u019c\3\2\2\2\u0360\u019f\3\2\2\2\u0360\u01a3\3\2\2\2\u0360\u01a6\3\2"+
- "\2\2\u0360\u01a9\3\2\2\2\u0360\u01ab\3\2\2\2\u0360\u01ad\3\2\2\2\u0360"+
- "\u01b0\3\2\2\2\u0360\u01b3\3\2\2\2\u0360\u01b5\3\2\2\2\u0360\u01b8\3\2"+
- "\2\2\u0360\u01bb\3\2\2\2\u0360\u01bd\3\2\2\2\u0360\u01c0\3\2\2\2\u0360"+
- "\u01c4\3\2\2\2\u0360\u01c8\3\2\2\2\u0360\u01cf\3\2\2\2\u0360\u01d6\3\2"+
- "\2\2\u0360\u01dc\3\2\2\2\u0360\u01e2\3\2\2\2\u0360\u01eb\3\2\2\2\u0360"+
- "\u01f7\3\2\2\2\u0360\u0203\3\2\2\2\u0360\u020f\3\2\2\2\u0360\u0217\3\2"+
- "\2\2\u0360\u021f\3\2\2\2\u0360\u0227\3\2\2\2\u0360\u022f\3\2\2\2\u0360"+
- "\u0237\3\2\2\2\u0360\u0240\3\2\2\2\u0360\u0246\3\2\2\2\u0360\u0250\3\2"+
- "\2\2\u0360\u0258\3\2\2\2\u0360\u025b\3\2\2\2\u0360\u025e\3\2\2\2\u0360"+
- "\u0262\3\2\2\2\u0360\u0267\3\2\2\2\u0360\u026d\3\2\2\2\u0360\u0274\3\2"+
- "\2\2\u0360\u0279\3\2\2\2\u0360\u027f\3\2\2\2\u0360\u0283\3\2\2\2\u0360"+
- "\u0288\3\2\2\2\u0360\u028a\3\2\2\2\u0360\u028f\3\2\2\2\u0360\u0292\3\2"+
- "\2\2\u0360\u0297\3\2\2\2\u0360\u029c\3\2\2\2\u0360\u02a1\3\2\2\2\u0360"+
- "\u02a6\3\2\2\2\u0360\u02ab\3\2\2\2\u0360\u02b0\3\2\2\2\u0360\u02b5\3\2"+
- "\2\2\u0360\u02ba\3\2\2\2\u0360\u02bf\3\2\2\2\u0360\u02c5\3\2\2\2\u0360"+
- "\u02cb\3\2\2\2\u0360\u02d1\3\2\2\2\u0360\u02d7\3\2\2\2\u0360\u02dd\3\2"+
- "\2\2\u0360\u02e3\3\2\2\2\u0360\u02e9\3\2\2\2\u0360\u02ef\3\2\2\2\u0360"+
- "\u02f5\3\2\2\2\u0360\u02fb\3\2\2\2\u0360\u0301\3\2\2\2\u0360\u0307\3\2"+
- "\2\2\u0360\u030d\3\2\2\2\u0360\u0313\3\2\2\2\u0360\u0319\3\2\2\2\u0360"+
- "\u031f\3\2\2\2\u0360\u0325\3\2\2\2\u0360\u032b\3\2\2\2\u0360\u0331\3\2"+
- "\2\2\u0360\u0337\3\2\2\2\u0360\u033d\3\2\2\2\u0360\u0343\3\2\2\2\u0360"+
- "\u0349\3\2\2\2\u0360\u034f\3\2\2\2\u0360\u0353\3\2\2\2\u0360\u0359\3\2"+
- "\2\2\u0361J\3\2\2\2\u0362\u0363\7z\2\2\u0363\u0364\7q\2\2\u0364\u0365"+
- "\7t\2\2\u0365L\3\2\2\2\u0366\u0367\7(\2\2\u0367\u036c\7(\2\2\u0368\u0369"+
- "\7c\2\2\u0369\u036a\7p\2\2\u036a\u036c\7f\2\2\u036b\u0366\3\2\2\2\u036b"+
- "\u0368\3\2\2\2\u036cN\3\2\2\2\u036d\u036e\7~\2\2\u036e\u0372\7~\2\2\u036f"+
- "\u0370\7q\2\2\u0370\u0372\7t\2\2\u0371\u036d\3\2\2\2\u0371\u036f\3\2\2"+
- "\2\u0372P\3\2\2\2\u0373\u0378\7#\2\2\u0374\u0375\7p\2\2\u0375\u0376\7"+
- "q\2\2\u0376\u0378\7v\2\2\u0377\u0373\3\2\2\2\u0377\u0374\3\2\2\2\u0378"+
- "R\3\2\2\2\u0379\u037a\7?\2\2\u037aT\3\2\2\2\u037b\u037d\7\17\2\2\u037c"+
- "\u037b\3\2\2\2\u037c\u037d\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u0382\7\f"+
- "\2\2\u037f\u0381\7\"\2\2\u0380\u037f\3\2\2\2\u0381\u0384\3\2\2\2\u0382"+
- "\u0380\3\2\2\2\u0382\u0383\3\2\2\2\u0383V\3\2\2\2\u0384\u0382\3\2\2\2"+
- "\u0385\u0387\t\3\2\2\u0386\u0385\3\2\2\2\u0387\u0388\3\2\2\2\u0388\u0386"+
- "\3\2\2\2\u0388\u0389\3\2\2\2\u0389\u038a\3\2\2\2\u038a\u038b\b,\2\2\u038b"+
- "X\3\2\2\2\u038c\u0390\7%\2\2\u038d\u038f\n\4\2\2\u038e\u038d\3\2\2\2\u038f"+
- "\u0392\3\2\2\2\u0390\u038e\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0393\3\2"+
- "\2\2\u0392\u0390\3\2\2\2\u0393\u0394\b-\3\2\u0394Z\3\2\2\2\u0395\u0399"+
- "\t\5\2\2\u0396\u0398\t\6\2\2\u0397\u0396\3\2\2\2\u0398\u039b\3\2\2\2\u0399"+
- "\u0397\3\2\2\2\u0399\u039a\3\2\2\2\u039a\\\3\2\2\2\u039b\u0399\3\2\2\2"+
- "\u039c\u039d\t\7\2\2\u039d^\3\2\2\2\u039e\u039f\t\b\2\2\u039f`\3\2\2\2"+
- "\u03a0\u03a6\t\t\2\2\u03a1\u03a2\7>\2\2\u03a2\u03a6\7?\2\2\u03a3\u03a4"+
- "\7@\2\2\u03a4\u03a6\7?\2\2\u03a5\u03a0\3\2\2\2\u03a5\u03a1\3\2\2\2\u03a5"+
- "\u03a3\3\2\2\2\u03a6b\3\2\2\2\u03a7\u03a8\7?\2\2\u03a8\u03ac\7?\2\2\u03a9"+
- "\u03aa\7#\2\2\u03aa\u03ac\7?\2\2\u03ab\u03a7\3\2\2\2\u03ab\u03a9\3\2\2"+
- "\2\u03acd\3\2\2\2\u03ad\u03ae\7(\2\2\u03aef\3\2\2\2\u03af\u03b0\7~\2\2"+
- "\u03b0h\3\2\2\2\u03b1\u03b2\t\n\2\2\u03b2j\3\2\2\2\u03b3\u03b4\7\62\2"+
- "\2\u03b4\u03b8\7z\2\2\u03b5\u03b6\7\62\2\2\u03b6\u03b8\7Z\2\2\u03b7\u03b3"+
- "\3\2\2\2\u03b7\u03b5\3\2\2\2\u03b8\u03ba\3\2\2\2\u03b9\u03bb\5i\65\2\u03ba"+
- "\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u03ba\3\2\2\2\u03bc\u03bd\3\2"+
- "\2\2\u03bdl\3\2\2\2\21\2\u0186\u0360\u036b\u0371\u0377\u037c\u0382\u0388"+
- "\u0390\u0399\u03a5\u03ab\u03b7\u03bc";
+ "\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u0363\n%\3&\3&\3&\3&\3\'"+
+ "\3\'\3\'\3\'\3\'\5\'\u036e\n\'\3(\3(\3(\3(\5(\u0374\n(\3)\3)\3)\3)\5)"+
+ "\u037a\n)\3*\3*\3+\5+\u037f\n+\3+\3+\7+\u0383\n+\f+\16+\u0386\13+\3,\6"+
+ ",\u0389\n,\r,\16,\u038a\3,\3,\3-\3-\7-\u0391\n-\f-\16-\u0394\13-\3-\3"+
+ "-\3.\3.\7.\u039a\n.\f.\16.\u039d\13.\3/\3/\3\60\3\60\3\61\3\61\3\61\3"+
+ "\61\3\61\5\61\u03a8\n\61\3\62\3\62\3\62\3\62\5\62\u03ae\n\62\3\63\3\63"+
+ "\3\64\3\64\3\65\3\65\3\66\3\66\3\66\3\66\5\66\u03ba\n\66\3\66\6\66\u03bd"+
+ "\n\66\r\66\16\66\u03be\2\67\3\3\1\5\4\1\7\5\1\t\6\1\13\7\1\r\b\1\17\t"+
+ "\1\21\n\1\23\13\1\25\f\1\27\r\1\31\16\1\33\17\1\35\20\1\37\21\1!\22\1"+
+ "#\23\1%\24\1\'\25\1)\26\1+\27\1-\30\1/\31\1\61\32\1\63\33\1\65\34\1\67"+
+ "\35\19\36\1;\37\1= \1?!\1A\"\1C#\1E$\1G%\1I&\1K\'\1M(\1O)\1Q*\1S+\1U,"+
+ "\1W-\2Y.\3[/\1]\60\1_\61\1a\62\1c\63\1e\64\1g\65\1i\66\1k\67\1\3\2\13"+
+ "\3\2\62;\4\2\13\13\"\"\4\2\f\f\17\17\4\2C\\c|\5\2\62;C\\c|\4\2--//\6\2"+
+ "\'\',,\61\61``\4\2>>@@\5\2\62;CHch\u0423\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3"+
+ "\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2"+
+ "\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35"+
+ "\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)"+
+ "\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2"+
+ "\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2"+
+ "A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3"+
+ "\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2"+
+ "\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2"+
+ "g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\3m\3\2\2\2\5o\3\2\2\2\7t\3\2\2\2\t\u0083"+
+ "\3\2\2\2\13\u0085\3\2\2\2\r\u0089\3\2\2\2\17\u0090\3\2\2\2\21\u0096\3"+
+ "\2\2\2\23\u0098\3\2\2\2\25\u009a\3\2\2\2\27\u009c\3\2\2\2\31\u009f\3\2"+
+ "\2\2\33\u00a4\3\2\2\2\35\u00b4\3\2\2\2\37\u00b9\3\2\2\2!\u00c3\3\2\2\2"+
+ "#\u00c8\3\2\2\2%\u00d7\3\2\2\2\'\u00e8\3\2\2\2)\u00f0\3\2\2\2+\u0101\3"+
+ "\2\2\2-\u010e\3\2\2\2/\u0110\3\2\2\2\61\u011c\3\2\2\2\63\u0122\3\2\2\2"+
+ "\65\u012c\3\2\2\2\67\u0135\3\2\2\29\u013a\3\2\2\2;\u0141\3\2\2\2=\u014c"+
+ "\3\2\2\2?\u015d\3\2\2\2A\u0162\3\2\2\2C\u0171\3\2\2\2E\u017e\3\2\2\2G"+
+ "\u0184\3\2\2\2I\u0362\3\2\2\2K\u0364\3\2\2\2M\u036d\3\2\2\2O\u0373\3\2"+
+ "\2\2Q\u0379\3\2\2\2S\u037b\3\2\2\2U\u037e\3\2\2\2W\u0388\3\2\2\2Y\u038e"+
+ "\3\2\2\2[\u0397\3\2\2\2]\u039e\3\2\2\2_\u03a0\3\2\2\2a\u03a7\3\2\2\2c"+
+ "\u03ad\3\2\2\2e\u03af\3\2\2\2g\u03b1\3\2\2\2i\u03b3\3\2\2\2k\u03b9\3\2"+
+ "\2\2mn\7_\2\2n\4\3\2\2\2op\7u\2\2pq\7v\2\2qr\7q\2\2rs\7r\2\2s\6\3\2\2"+
+ "\2tu\7d\2\2uv\7n\2\2vw\7q\2\2wx\7e\2\2xy\7m\2\2yz\7\60\2\2z{\7e\2\2{|"+
+ "\7q\2\2|}\7k\2\2}~\7p\2\2~\177\7d\2\2\177\u0080\7c\2\2\u0080\u0081\7u"+
+ "\2\2\u0081\u0082\7g\2\2\u0082\b\3\2\2\2\u0083\u0084\7.\2\2\u0084\n\3\2"+
+ "\2\2\u0085\u0086\7o\2\2\u0086\u0087\7u\2\2\u0087\u0088\7i\2\2\u0088\f"+
+ "\3\2\2\2\u0089\u008a\7v\2\2\u008a\u008b\7z\2\2\u008b\u008c\7\60\2\2\u008c"+
+ "\u008d\7i\2\2\u008d\u008e\7c\2\2\u008e\u008f\7u\2\2\u008f\16\3\2\2\2\u0090"+
+ "\u0091\7y\2\2\u0091\u0092\7j\2\2\u0092\u0093\7k\2\2\u0093\u0094\7n\2\2"+
+ "\u0094\u0095\7g\2\2\u0095\20\3\2\2\2\u0096\u0097\7]\2\2\u0097\22\3\2\2"+
+ "\2\u0098\u0099\7*\2\2\u0099\24\3\2\2\2\u009a\u009b\7<\2\2\u009b\26\3\2"+
+ "\2\2\u009c\u009d\7k\2\2\u009d\u009e\7h\2\2\u009e\30\3\2\2\2\u009f\u00a0"+
+ "\7u\2\2\u00a0\u00a1\7g\2\2\u00a1\u00a2\7p\2\2\u00a2\u00a3\7f\2\2\u00a3"+
+ "\32\3\2\2\2\u00a4\u00a5\7d\2\2\u00a5\u00a6\7n\2\2\u00a6\u00a7\7q\2\2\u00a7"+
+ "\u00a8\7e\2\2\u00a8\u00a9\7m\2\2\u00a9\u00aa\7\60\2\2\u00aa\u00ab\7v\2"+
+ "\2\u00ab\u00ac\7k\2\2\u00ac\u00ad\7o\2\2\u00ad\u00ae\7g\2\2\u00ae\u00af"+
+ "\7u\2\2\u00af\u00b0\7v\2\2\u00b0\u00b1\7c\2\2\u00b1\u00b2\7o\2\2\u00b2"+
+ "\u00b3\7r\2\2\u00b3\34\3\2\2\2\u00b4\u00b5\7]\2\2\u00b5\u00b6\7c\2\2\u00b6"+
+ "\u00b7\7u\2\2\u00b7\u00b8\7o\2\2\u00b8\36\3\2\2\2\u00b9\u00ba\7o\2\2\u00ba"+
+ "\u00bb\7u\2\2\u00bb\u00bc\7i\2\2\u00bc\u00bd\7\60\2\2\u00bd\u00be\7x\2"+
+ "\2\u00be\u00bf\7c\2\2\u00bf\u00c0\7n\2\2\u00c0\u00c1\7w\2\2\u00c1\u00c2"+
+ "\7g\2\2\u00c2 \3\2\2\2\u00c3\u00c4\7k\2\2\u00c4\u00c5\7p\2\2\u00c5\u00c6"+
+ "\7k\2\2\u00c6\u00c7\7v\2\2\u00c7\"\3\2\2\2\u00c8\u00c9\7d\2\2\u00c9\u00ca"+
+ "\7n\2\2\u00ca\u00cb\7q\2\2\u00cb\u00cc\7e\2\2\u00cc\u00cd\7m\2\2\u00cd"+
+ "\u00ce\7\60\2\2\u00ce\u00cf\7r\2\2\u00cf\u00d0\7t\2\2\u00d0\u00d1\7g\2"+
+ "\2\u00d1\u00d2\7x\2\2\u00d2\u00d3\7j\2\2\u00d3\u00d4\7c\2\2\u00d4\u00d5"+
+ "\7u\2\2\u00d5\u00d6\7j\2\2\u00d6$\3\2\2\2\u00d7\u00d8\7e\2\2\u00d8\u00d9"+
+ "\7q\2\2\u00d9\u00da\7p\2\2\u00da\u00db\7v\2\2\u00db\u00dc\7t\2\2\u00dc"+
+ "\u00dd\7c\2\2\u00dd\u00de\7e\2\2\u00de\u00df\7v\2\2\u00df\u00e0\7\60\2"+
+ "\2\u00e0\u00e1\7u\2\2\u00e1\u00e2\7v\2\2\u00e2\u00e3\7q\2\2\u00e3\u00e4"+
+ "\7t\2\2\u00e4\u00e5\7c\2\2\u00e5\u00e6\7i\2\2\u00e6\u00e7\7g\2\2\u00e7"+
+ "&\3\2\2\2\u00e8\u00e9\7u\2\2\u00e9\u00ea\7w\2\2\u00ea\u00eb\7k\2\2\u00eb"+
+ "\u00ec\7e\2\2\u00ec\u00ed\7k\2\2\u00ed\u00ee\7f\2\2\u00ee\u00ef\7g\2\2"+
+ "\u00ef(\3\2\2\2\u00f0\u00f1\7d\2\2\u00f1\u00f2\7n\2\2\u00f2\u00f3\7q\2"+
+ "\2\u00f3\u00f4\7e\2\2\u00f4\u00f5\7m\2\2\u00f5\u00f6\7\60\2\2\u00f6\u00f7"+
+ "\7f\2\2\u00f7\u00f8\7k\2\2\u00f8\u00f9\7h\2\2\u00f9\u00fa\7h\2\2\u00fa"+
+ "\u00fb\7k\2\2\u00fb\u00fc\7e\2\2\u00fc\u00fd\7w\2\2\u00fd\u00fe\7n\2\2"+
+ "\u00fe\u00ff\7v\2\2\u00ff\u0100\7{\2\2\u0100*\3\2\2\2\u0101\u0102\7o\2"+
+ "\2\u0102\u0103\7u\2\2\u0103\u0104\7i\2\2\u0104\u0105\7\60\2\2\u0105\u0106"+
+ "\7f\2\2\u0106\u0107\7c\2\2\u0107\u0108\7v\2\2\u0108\u0109\7c\2\2\u0109"+
+ "\u010a\7u\2\2\u010a\u010b\7k\2\2\u010b\u010c\7|\2\2\u010c\u010d\7g\2\2"+
+ "\u010d,\3\2\2\2\u010e\u010f\7+\2\2\u010f.\3\2\2\2\u0110\u0111\7v\2\2\u0111"+
+ "\u0112\7z\2\2\u0112\u0113\7\60\2\2\u0113\u0114\7i\2\2\u0114\u0115\7c\2"+
+ "\2\u0115\u0116\7u\2\2\u0116\u0117\7r\2\2\u0117\u0118\7t\2\2\u0118\u0119"+
+ "\7k\2\2\u0119\u011a\7e\2\2\u011a\u011b\7g\2\2\u011b\60\3\2\2\2\u011c\u011d"+
+ "\7g\2\2\u011d\u011e\7n\2\2\u011e\u011f\7u\2\2\u011f\u0120\7g\2\2\u0120"+
+ "\u0121\7<\2\2\u0121\62\3\2\2\2\u0122\u0123\7v\2\2\u0123\u0124\7z\2\2\u0124"+
+ "\u0125\7\60\2\2\u0125\u0126\7q\2\2\u0126\u0127\7t\2\2\u0127\u0128\7k\2"+
+ "\2\u0128\u0129\7i\2\2\u0129\u012a\7k\2\2\u012a\u012b\7p\2\2\u012b\64\3"+
+ "\2\2\2\u012c\u012d\7o\2\2\u012d\u012e\7u\2\2\u012e\u012f\7i\2\2\u012f"+
+ "\u0130\7\60\2\2\u0130\u0131\7f\2\2\u0131\u0132\7c\2\2\u0132\u0133\7v\2"+
+ "\2\u0133\u0134\7c\2\2\u0134\66\3\2\2\2\u0135\u0136\7g\2\2\u0136\u0137"+
+ "\7n\2\2\u0137\u0138\7k\2\2\u0138\u0139\7h\2\2\u01398\3\2\2\2\u013a\u013b"+
+ "\7t\2\2\u013b\u013c\7g\2\2\u013c\u013d\7v\2\2\u013d\u013e\7w\2\2\u013e"+
+ "\u013f\7t\2\2\u013f\u0140\7p\2\2\u0140:\3\2\2\2\u0141\u0142\7o\2\2\u0142"+
+ "\u0143\7u\2\2\u0143\u0144\7i\2\2\u0144\u0145\7\60\2\2\u0145\u0146\7u\2"+
+ "\2\u0146\u0147\7g\2\2\u0147\u0148\7p\2\2\u0148\u0149\7f\2\2\u0149\u014a"+
+ "\7g\2\2\u014a\u014b\7t\2\2\u014b<\3\2\2\2\u014c\u014d\7e\2\2\u014d\u014e"+
+ "\7q\2\2\u014e\u014f\7p\2\2\u014f\u0150\7v\2\2\u0150\u0151\7t\2\2\u0151"+
+ "\u0152\7c\2\2\u0152\u0153\7e\2\2\u0153\u0154\7v\2\2\u0154\u0155\7\60\2"+
+ "\2\u0155\u0156\7d\2\2\u0156\u0157\7c\2\2\u0157\u0158\7n\2\2\u0158\u0159"+
+ "\7c\2\2\u0159\u015a\7p\2\2\u015a\u015b\7e\2\2\u015b\u015c\7g\2\2\u015c"+
+ ">\3\2\2\2\u015d\u015e\7c\2\2\u015e\u015f\7u\2\2\u015f\u0160\7o\2\2\u0160"+
+ "\u0161\7_\2\2\u0161@\3\2\2\2\u0162\u0163\7d\2\2\u0163\u0164\7n\2\2\u0164"+
+ "\u0165\7q\2\2\u0165\u0166\7e\2\2\u0166\u0167\7m\2\2\u0167\u0168\7\60\2"+
+ "\2\u0168\u0169\7i\2\2\u0169\u016a\7c\2\2\u016a\u016b\7u\2\2\u016b\u016c"+
+ "\7n\2\2\u016c\u016d\7k\2\2\u016d\u016e\7o\2\2\u016e\u016f\7k\2\2\u016f"+
+ "\u0170\7v\2\2\u0170B\3\2\2\2\u0171\u0172\7d\2\2\u0172\u0173\7n\2\2\u0173"+
+ "\u0174\7q\2\2\u0174\u0175\7e\2\2\u0175\u0176\7m\2\2\u0176\u0177\7\60\2"+
+ "\2\u0177\u0178\7p\2\2\u0178\u0179\7w\2\2\u0179\u017a\7o\2\2\u017a\u017b"+
+ "\7d\2\2\u017b\u017c\7g\2\2\u017c\u017d\7t\2\2\u017dD\3\2\2\2\u017e\u017f"+
+ "\7e\2\2\u017f\u0180\7q\2\2\u0180\u0181\7f\2\2\u0181\u0182\7g\2\2\u0182"+
+ "F\3\2\2\2\u0183\u0185\t\2\2\2\u0184\u0183\3\2\2\2\u0185\u0186\3\2\2\2"+
+ "\u0186\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187H\3\2\2\2\u0188\u0189\7"+
+ "U\2\2\u0189\u018a\7V\2\2\u018a\u018b\7Q\2\2\u018b\u0363\7R\2\2\u018c\u018d"+
+ "\7C\2\2\u018d\u018e\7F\2\2\u018e\u0363\7F\2\2\u018f\u0190\7O\2\2\u0190"+
+ "\u0191\7W\2\2\u0191\u0363\7N\2\2\u0192\u0193\7U\2\2\u0193\u0194\7W\2\2"+
+ "\u0194\u0363\7D\2\2\u0195\u0196\7F\2\2\u0196\u0197\7K\2\2\u0197\u0363"+
+ "\7X\2\2\u0198\u0199\7U\2\2\u0199\u019a\7F\2\2\u019a\u019b\7K\2\2\u019b"+
+ "\u0363\7X\2\2\u019c\u019d\7O\2\2\u019d\u019e\7Q\2\2\u019e\u0363\7F\2\2"+
+ "\u019f\u01a0\7U\2\2\u01a0\u01a1\7O\2\2\u01a1\u01a2\7Q\2\2\u01a2\u0363"+
+ "\7F\2\2\u01a3\u01a4\7G\2\2\u01a4\u01a5\7Z\2\2\u01a5\u0363\7R\2\2\u01a6"+
+ "\u01a7\7P\2\2\u01a7\u01a8\7G\2\2\u01a8\u0363\7I\2\2\u01a9\u01aa\7N\2\2"+
+ "\u01aa\u0363\7V\2\2\u01ab\u01ac\7I\2\2\u01ac\u0363\7V\2\2\u01ad\u01ae"+
+ "\7U\2\2\u01ae\u01af\7N\2\2\u01af\u0363\7V\2\2\u01b0\u01b1\7U\2\2\u01b1"+
+ "\u01b2\7I\2\2\u01b2\u0363\7V\2\2\u01b3\u01b4\7G\2\2\u01b4\u0363\7S\2\2"+
+ "\u01b5\u01b6\7P\2\2\u01b6\u01b7\7Q\2\2\u01b7\u0363\7V\2\2\u01b8\u01b9"+
+ "\7C\2\2\u01b9\u01ba\7P\2\2\u01ba\u0363\7F\2\2\u01bb\u01bc\7Q\2\2\u01bc"+
+ "\u0363\7T\2\2\u01bd\u01be\7Z\2\2\u01be\u01bf\7Q\2\2\u01bf\u0363\7T\2\2"+
+ "\u01c0\u01c1\7D\2\2\u01c1\u01c2\7[\2\2\u01c2\u01c3\7V\2\2\u01c3\u0363"+
+ "\7G\2\2\u01c4\u01c5\7U\2\2\u01c5\u01c6\7J\2\2\u01c6\u01c7\7C\2\2\u01c7"+
+ "\u0363\7\65\2\2\u01c8\u01c9\7C\2\2\u01c9\u01ca\7F\2\2\u01ca\u01cb\7F\2"+
+ "\2\u01cb\u01cc\7T\2\2\u01cc\u01cd\7G\2\2\u01cd\u01ce\7U\2\2\u01ce\u0363"+
+ "\7U\2\2\u01cf\u01d0\7D\2\2\u01d0\u01d1\7C\2\2\u01d1\u01d2\7N\2\2\u01d2"+
+ "\u01d3\7C\2\2\u01d3\u01d4\7P\2\2\u01d4\u01d5\7E\2\2\u01d5\u0363\7G\2\2"+
+ "\u01d6\u01d7\7Q\2\2\u01d7\u01d8\7T\2\2\u01d8\u01d9\7K\2\2\u01d9\u01da"+
+ "\7I\2\2\u01da\u01db\7K\2\2\u01db\u0363\7P\2\2\u01dc\u01dd\7E\2\2\u01dd"+
+ "\u01de\7C\2\2\u01de\u01df\7N\2\2\u01df\u01e0\7N\2\2\u01e0\u01e1\7G\2\2"+
+ "\u01e1\u0363\7T\2\2\u01e2\u01e3\7E\2\2\u01e3\u01e4\7C\2\2\u01e4\u01e5"+
+ "\7N\2\2\u01e5\u01e6\7N\2\2\u01e6\u01e7\7X\2\2\u01e7\u01e8\7C\2\2\u01e8"+
+ "\u01e9\7N\2\2\u01e9\u01ea\7W\2\2\u01ea\u0363\7G\2\2\u01eb\u01ec\7E\2\2"+
+ "\u01ec\u01ed\7C\2\2\u01ed\u01ee\7N\2\2\u01ee\u01ef\7N\2\2\u01ef\u01f0"+
+ "\7F\2\2\u01f0\u01f1\7C\2\2\u01f1\u01f2\7V\2\2\u01f2\u01f3\7C\2\2\u01f3"+
+ "\u01f4\7N\2\2\u01f4\u01f5\7Q\2\2\u01f5\u01f6\7C\2\2\u01f6\u0363\7F\2\2"+
+ "\u01f7\u01f8\7E\2\2\u01f8\u01f9\7C\2\2\u01f9\u01fa\7N\2\2\u01fa\u01fb"+
+ "\7N\2\2\u01fb\u01fc\7F\2\2\u01fc\u01fd\7C\2\2\u01fd\u01fe\7V\2\2\u01fe"+
+ "\u01ff\7C\2\2\u01ff\u0200\7U\2\2\u0200\u0201\7K\2\2\u0201\u0202\7\\\2"+
+ "\2\u0202\u0363\7G\2\2\u0203\u0204\7E\2\2\u0204\u0205\7C\2\2\u0205\u0206"+
+ "\7N\2\2\u0206\u0207\7N\2\2\u0207\u0208\7F\2\2\u0208\u0209\7C\2\2\u0209"+
+ "\u020a\7V\2\2\u020a\u020b\7C\2\2\u020b\u020c\7E\2\2\u020c\u020d\7Q\2\2"+
+ "\u020d\u020e\7R\2\2\u020e\u0363\7[\2\2\u020f\u0210\7E\2\2\u0210\u0211"+
+ "\7Q\2\2\u0211\u0212\7F\2\2\u0212\u0213\7G\2\2\u0213\u0214\7U\2\2\u0214"+
+ "\u0215\7K\2\2\u0215\u0216\7\\\2\2\u0216\u0363\7G\2\2\u0217\u0218\7E\2"+
+ "\2\u0218\u0219\7Q\2\2\u0219\u021a\7F\2\2\u021a\u021b\7G\2\2\u021b\u021c"+
+ "\7E\2\2\u021c\u021d\7Q\2\2\u021d\u021e\7R\2\2\u021e\u0363\7[\2\2\u021f"+
+ "\u0220\7I\2\2\u0220\u0221\7C\2\2\u0221\u0222\7U\2\2\u0222\u0223\7R\2\2"+
+ "\u0223\u0224\7T\2\2\u0224\u0225\7K\2\2\u0225\u0226\7E\2\2\u0226\u0363"+
+ "\7G\2\2\u0227\u0228\7R\2\2\u0228\u0229\7T\2\2\u0229\u022a\7G\2\2\u022a"+
+ "\u022b\7X\2\2\u022b\u022c\7J\2\2\u022c\u022d\7C\2\2\u022d\u022e\7U\2\2"+
+ "\u022e\u0363\7J\2\2\u022f\u0230\7E\2\2\u0230\u0231\7Q\2\2\u0231\u0232"+
+ "\7K\2\2\u0232\u0233\7P\2\2\u0233\u0234\7D\2\2\u0234\u0235\7C\2\2\u0235"+
+ "\u0236\7U\2\2\u0236\u0363\7G\2\2\u0237\u0238\7V\2\2\u0238\u0239\7K\2\2"+
+ "\u0239\u023a\7O\2\2\u023a\u023b\7G\2\2\u023b\u023c\7U\2\2\u023c\u023d"+
+ "\7V\2\2\u023d\u023e\7C\2\2\u023e\u023f\7O\2\2\u023f\u0363\7R\2\2\u0240"+
+ "\u0241\7P\2\2\u0241\u0242\7W\2\2\u0242\u0243\7O\2\2\u0243\u0244\7D\2\2"+
+ "\u0244\u0245\7G\2\2\u0245\u0363\7T\2\2\u0246\u0247\7F\2\2\u0247\u0248"+
+ "\7K\2\2\u0248\u0249\7H\2\2\u0249\u024a\7H\2\2\u024a\u024b\7K\2\2\u024b"+
+ "\u024c\7E\2\2\u024c\u024d\7W\2\2\u024d\u024e\7N\2\2\u024e\u024f\7V\2\2"+
+ "\u024f\u0363\7[\2\2\u0250\u0251\7I\2\2\u0251\u0252\7C\2\2\u0252\u0253"+
+ "\7U\2\2\u0253\u0254\7N\2\2\u0254\u0255\7K\2\2\u0255\u0256\7O\2\2\u0256"+
+ "\u0257\7K\2\2\u0257\u0363\7V\2\2\u0258\u0259\7R\2\2\u0259\u025a\7Q\2\2"+
+ "\u025a\u0363\7R\2\2\u025b\u025c\7F\2\2\u025c\u025d\7W\2\2\u025d\u0363"+
+ "\7R\2\2\u025e\u025f\7U\2\2\u025f\u0260\7Y\2\2\u0260\u0261\7C\2\2\u0261"+
+ "\u0363\7R\2\2\u0262\u0263\7O\2\2\u0263\u0264\7N\2\2\u0264\u0265\7Q\2\2"+
+ "\u0265\u0266\7C\2\2\u0266\u0363\7F\2\2\u0267\u0268\7O\2\2\u0268\u0269"+
+ "\7U\2\2\u0269\u026a\7V\2\2\u026a\u026b\7Q\2\2\u026b\u026c\7T\2\2\u026c"+
+ "\u0363\7G\2\2\u026d\u026e\7O\2\2\u026e\u026f\7U\2\2\u026f\u0270\7V\2\2"+
+ "\u0270\u0271\7Q\2\2\u0271\u0272\7T\2\2\u0272\u0273\7G\2\2\u0273\u0363"+
+ "\7:\2\2\u0274\u0275\7U\2\2\u0275\u0276\7N\2\2\u0276\u0277\7Q\2\2\u0277"+
+ "\u0278\7C\2\2\u0278\u0363\7F\2\2\u0279\u027a\7U\2\2\u027a\u027b\7U\2\2"+
+ "\u027b\u027c\7V\2\2\u027c\u027d\7Q\2\2\u027d\u027e\7T\2\2\u027e\u0363"+
+ "\7G\2\2\u027f\u0280\7L\2\2\u0280\u0281\7W\2\2\u0281\u0282\7O\2\2\u0282"+
+ "\u0363\7R\2\2\u0283\u0284\7L\2\2\u0284\u0285\7W\2\2\u0285\u0286\7O\2\2"+
+ "\u0286\u0287\7R\2\2\u0287\u0363\7K\2\2\u0288\u0289\7R\2\2\u0289\u0363"+
+ "\7E\2\2\u028a\u028b\7O\2\2\u028b\u028c\7G\2\2\u028c\u028d\7O\2\2\u028d"+
+ "\u028e\7U\2\2\u028e\u028f\7K\2\2\u028f\u0290\7\\\2\2\u0290\u0363\7G\2"+
+ "\2\u0291\u0292\7I\2\2\u0292\u0293\7C\2\2\u0293\u0363\7U\2\2\u0294\u0295"+
+ "\7R\2\2\u0295\u0296\7W\2\2\u0296\u0297\7U\2\2\u0297\u0298\7J\2\2\u0298"+
+ "\u0363\7\63\2\2\u0299\u029a\7R\2\2\u029a\u029b\7W\2\2\u029b\u029c\7U\2"+
+ "\2\u029c\u029d\7J\2\2\u029d\u0363\7\64\2\2\u029e\u029f\7R\2\2\u029f\u02a0"+
+ "\7W\2\2\u02a0\u02a1\7U\2\2\u02a1\u02a2\7J\2\2\u02a2\u0363\7\65\2\2\u02a3"+
+ "\u02a4\7R\2\2\u02a4\u02a5\7W\2\2\u02a5\u02a6\7U\2\2\u02a6\u02a7\7J\2\2"+
+ "\u02a7\u0363\7\66\2\2\u02a8\u02a9\7R\2\2\u02a9\u02aa\7W\2\2\u02aa\u02ab"+
+ "\7U\2\2\u02ab\u02ac\7J\2\2\u02ac\u0363\7\67\2\2\u02ad\u02ae\7R\2\2\u02ae"+
+ "\u02af\7W\2\2\u02af\u02b0\7U\2\2\u02b0\u02b1\7J\2\2\u02b1\u0363\78\2\2"+
+ "\u02b2\u02b3\7R\2\2\u02b3\u02b4\7W\2\2\u02b4\u02b5\7U\2\2\u02b5\u02b6"+
+ "\7J\2\2\u02b6\u0363\79\2\2\u02b7\u02b8\7R\2\2\u02b8\u02b9\7W\2\2\u02b9"+
+ "\u02ba\7U\2\2\u02ba\u02bb\7J\2\2\u02bb\u0363\7:\2\2\u02bc\u02bd\7R\2\2"+
+ "\u02bd\u02be\7W\2\2\u02be\u02bf\7U\2\2\u02bf\u02c0\7J\2\2\u02c0\u0363"+
+ "\7;\2\2\u02c1\u02c2\7R\2\2\u02c2\u02c3\7W\2\2\u02c3\u02c4\7U\2\2\u02c4"+
+ "\u02c5\7J\2\2\u02c5\u02c6\7\63\2\2\u02c6\u0363\7\62\2\2\u02c7\u02c8\7"+
+ "R\2\2\u02c8\u02c9\7W\2\2\u02c9\u02ca\7U\2\2\u02ca\u02cb\7J\2\2\u02cb\u02cc"+
+ "\7\63\2\2\u02cc\u0363\7\63\2\2\u02cd\u02ce\7R\2\2\u02ce\u02cf\7W\2\2\u02cf"+
+ "\u02d0\7U\2\2\u02d0\u02d1\7J\2\2\u02d1\u02d2\7\63\2\2\u02d2\u0363\7\64"+
+ "\2\2\u02d3\u02d4\7R\2\2\u02d4\u02d5\7W\2\2\u02d5\u02d6\7U\2\2\u02d6\u02d7"+
+ "\7J\2\2\u02d7\u02d8\7\63\2\2\u02d8\u0363\7\65\2\2\u02d9\u02da\7R\2\2\u02da"+
+ "\u02db\7W\2\2\u02db\u02dc\7U\2\2\u02dc\u02dd\7J\2\2\u02dd\u02de\7\63\2"+
+ "\2\u02de\u0363\7\66\2\2\u02df\u02e0\7R\2\2\u02e0\u02e1\7W\2\2\u02e1\u02e2"+
+ "\7U\2\2\u02e2\u02e3\7J\2\2\u02e3\u02e4\7\63\2\2\u02e4\u0363\7\67\2\2\u02e5"+
+ "\u02e6\7R\2\2\u02e6\u02e7\7W\2\2\u02e7\u02e8\7U\2\2\u02e8\u02e9\7J\2\2"+
+ "\u02e9\u02ea\7\63\2\2\u02ea\u0363\78\2\2\u02eb\u02ec\7R\2\2\u02ec\u02ed"+
+ "\7W\2\2\u02ed\u02ee\7U\2\2\u02ee\u02ef\7J\2\2\u02ef\u02f0\7\63\2\2\u02f0"+
+ "\u0363\79\2\2\u02f1\u02f2\7R\2\2\u02f2\u02f3\7W\2\2\u02f3\u02f4\7U\2\2"+
+ "\u02f4\u02f5\7J\2\2\u02f5\u02f6\7\63\2\2\u02f6\u0363\7:\2\2\u02f7\u02f8"+
+ "\7R\2\2\u02f8\u02f9\7W\2\2\u02f9\u02fa\7U\2\2\u02fa\u02fb\7J\2\2\u02fb"+
+ "\u02fc\7\63\2\2\u02fc\u0363\7;\2\2\u02fd\u02fe\7R\2\2\u02fe\u02ff\7W\2"+
+ "\2\u02ff\u0300\7U\2\2\u0300\u0301\7J\2\2\u0301\u0302\7\64\2\2\u0302\u0363"+
+ "\7\62\2\2\u0303\u0304\7R\2\2\u0304\u0305\7W\2\2\u0305\u0306\7U\2\2\u0306"+
+ "\u0307\7J\2\2\u0307\u0308\7\64\2\2\u0308\u0363\7\63\2\2\u0309\u030a\7"+
+ "R\2\2\u030a\u030b\7W\2\2\u030b\u030c\7U\2\2\u030c\u030d\7J\2\2\u030d\u030e"+
+ "\7\64\2\2\u030e\u0363\7\64\2\2\u030f\u0310\7R\2\2\u0310\u0311\7W\2\2\u0311"+
+ "\u0312\7U\2\2\u0312\u0313\7J\2\2\u0313\u0314\7\64\2\2\u0314\u0363\7\65"+
+ "\2\2\u0315\u0316\7R\2\2\u0316\u0317\7W\2\2\u0317\u0318\7U\2\2\u0318\u0319"+
+ "\7J\2\2\u0319\u031a\7\64\2\2\u031a\u0363\7\66\2\2\u031b\u031c\7R\2\2\u031c"+
+ "\u031d\7W\2\2\u031d\u031e\7U\2\2\u031e\u031f\7J\2\2\u031f\u0320\7\64\2"+
+ "\2\u0320\u0363\7\67\2\2\u0321\u0322\7R\2\2\u0322\u0323\7W\2\2\u0323\u0324"+
+ "\7U\2\2\u0324\u0325\7J\2\2\u0325\u0326\7\64\2\2\u0326\u0363\78\2\2\u0327"+
+ "\u0328\7R\2\2\u0328\u0329\7W\2\2\u0329\u032a\7U\2\2\u032a\u032b\7J\2\2"+
+ "\u032b\u032c\7\64\2\2\u032c\u0363\79\2\2\u032d\u032e\7R\2\2\u032e\u032f"+
+ "\7W\2\2\u032f\u0330\7U\2\2\u0330\u0331\7J\2\2\u0331\u0332\7\64\2\2\u0332"+
+ "\u0363\7:\2\2\u0333\u0334\7R\2\2\u0334\u0335\7W\2\2\u0335\u0336\7U\2\2"+
+ "\u0336\u0337\7J\2\2\u0337\u0338\7\64\2\2\u0338\u0363\7;\2\2\u0339\u033a"+
+ "\7R\2\2\u033a\u033b\7W\2\2\u033b\u033c\7U\2\2\u033c\u033d\7J\2\2\u033d"+
+ "\u033e\7\65\2\2\u033e\u0363\7\62\2\2\u033f\u0340\7R\2\2\u0340\u0341\7"+
+ "W\2\2\u0341\u0342\7U\2\2\u0342\u0343\7J\2\2\u0343\u0344\7\65\2\2\u0344"+
+ "\u0363\7\63\2\2\u0345\u0346\7R\2\2\u0346\u0347\7W\2\2\u0347\u0348\7U\2"+
+ "\2\u0348\u0349\7J\2\2\u0349\u034a\7\65\2\2\u034a\u0363\7\64\2\2\u034b"+
+ "\u034c\7E\2\2\u034c\u034d\7T\2\2\u034d\u034e\7G\2\2\u034e\u034f\7C\2\2"+
+ "\u034f\u0350\7V\2\2\u0350\u0363\7G\2\2\u0351\u0352\7E\2\2\u0352\u0353"+
+ "\7C\2\2\u0353\u0354\7N\2\2\u0354\u0363\7N\2\2\u0355\u0356\7T\2\2\u0356"+
+ "\u0357\7G\2\2\u0357\u0358\7V\2\2\u0358\u0359\7W\2\2\u0359\u035a\7T\2\2"+
+ "\u035a\u0363\7P\2\2\u035b\u035c\7U\2\2\u035c\u035d\7W\2\2\u035d\u035e"+
+ "\7K\2\2\u035e\u035f\7E\2\2\u035f\u0360\7K\2\2\u0360\u0361\7F\2\2\u0361"+
+ "\u0363\7G\2\2\u0362\u0188\3\2\2\2\u0362\u018c\3\2\2\2\u0362\u018f\3\2"+
+ "\2\2\u0362\u0192\3\2\2\2\u0362\u0195\3\2\2\2\u0362\u0198\3\2\2\2\u0362"+
+ "\u019c\3\2\2\2\u0362\u019f\3\2\2\2\u0362\u01a3\3\2\2\2\u0362\u01a6\3\2"+
+ "\2\2\u0362\u01a9\3\2\2\2\u0362\u01ab\3\2\2\2\u0362\u01ad\3\2\2\2\u0362"+
+ "\u01b0\3\2\2\2\u0362\u01b3\3\2\2\2\u0362\u01b5\3\2\2\2\u0362\u01b8\3\2"+
+ "\2\2\u0362\u01bb\3\2\2\2\u0362\u01bd\3\2\2\2\u0362\u01c0\3\2\2\2\u0362"+
+ "\u01c4\3\2\2\2\u0362\u01c8\3\2\2\2\u0362\u01cf\3\2\2\2\u0362\u01d6\3\2"+
+ "\2\2\u0362\u01dc\3\2\2\2\u0362\u01e2\3\2\2\2\u0362\u01eb\3\2\2\2\u0362"+
+ "\u01f7\3\2\2\2\u0362\u0203\3\2\2\2\u0362\u020f\3\2\2\2\u0362\u0217\3\2"+
+ "\2\2\u0362\u021f\3\2\2\2\u0362\u0227\3\2\2\2\u0362\u022f\3\2\2\2\u0362"+
+ "\u0237\3\2\2\2\u0362\u0240\3\2\2\2\u0362\u0246\3\2\2\2\u0362\u0250\3\2"+
+ "\2\2\u0362\u0258\3\2\2\2\u0362\u025b\3\2\2\2\u0362\u025e\3\2\2\2\u0362"+
+ "\u0262\3\2\2\2\u0362\u0267\3\2\2\2\u0362\u026d\3\2\2\2\u0362\u0274\3\2"+
+ "\2\2\u0362\u0279\3\2\2\2\u0362\u027f\3\2\2\2\u0362\u0283\3\2\2\2\u0362"+
+ "\u0288\3\2\2\2\u0362\u028a\3\2\2\2\u0362\u0291\3\2\2\2\u0362\u0294\3\2"+
+ "\2\2\u0362\u0299\3\2\2\2\u0362\u029e\3\2\2\2\u0362\u02a3\3\2\2\2\u0362"+
+ "\u02a8\3\2\2\2\u0362\u02ad\3\2\2\2\u0362\u02b2\3\2\2\2\u0362\u02b7\3\2"+
+ "\2\2\u0362\u02bc\3\2\2\2\u0362\u02c1\3\2\2\2\u0362\u02c7\3\2\2\2\u0362"+
+ "\u02cd\3\2\2\2\u0362\u02d3\3\2\2\2\u0362\u02d9\3\2\2\2\u0362\u02df\3\2"+
+ "\2\2\u0362\u02e5\3\2\2\2\u0362\u02eb\3\2\2\2\u0362\u02f1\3\2\2\2\u0362"+
+ "\u02f7\3\2\2\2\u0362\u02fd\3\2\2\2\u0362\u0303\3\2\2\2\u0362\u0309\3\2"+
+ "\2\2\u0362\u030f\3\2\2\2\u0362\u0315\3\2\2\2\u0362\u031b\3\2\2\2\u0362"+
+ "\u0321\3\2\2\2\u0362\u0327\3\2\2\2\u0362\u032d\3\2\2\2\u0362\u0333\3\2"+
+ "\2\2\u0362\u0339\3\2\2\2\u0362\u033f\3\2\2\2\u0362\u0345\3\2\2\2\u0362"+
+ "\u034b\3\2\2\2\u0362\u0351\3\2\2\2\u0362\u0355\3\2\2\2\u0362\u035b\3\2"+
+ "\2\2\u0363J\3\2\2\2\u0364\u0365\7z\2\2\u0365\u0366\7q\2\2\u0366\u0367"+
+ "\7t\2\2\u0367L\3\2\2\2\u0368\u0369\7(\2\2\u0369\u036e\7(\2\2\u036a\u036b"+
+ "\7c\2\2\u036b\u036c\7p\2\2\u036c\u036e\7f\2\2\u036d\u0368\3\2\2\2\u036d"+
+ "\u036a\3\2\2\2\u036eN\3\2\2\2\u036f\u0370\7~\2\2\u0370\u0374\7~\2\2\u0371"+
+ "\u0372\7q\2\2\u0372\u0374\7t\2\2\u0373\u036f\3\2\2\2\u0373\u0371\3\2\2"+
+ "\2\u0374P\3\2\2\2\u0375\u037a\7#\2\2\u0376\u0377\7p\2\2\u0377\u0378\7"+
+ "q\2\2\u0378\u037a\7v\2\2\u0379\u0375\3\2\2\2\u0379\u0376\3\2\2\2\u037a"+
+ "R\3\2\2\2\u037b\u037c\7?\2\2\u037cT\3\2\2\2\u037d\u037f\7\17\2\2\u037e"+
+ "\u037d\3\2\2\2\u037e\u037f\3\2\2\2\u037f\u0380\3\2\2\2\u0380\u0384\7\f"+
+ "\2\2\u0381\u0383\7\"\2\2\u0382\u0381\3\2\2\2\u0383\u0386\3\2\2\2\u0384"+
+ "\u0382\3\2\2\2\u0384\u0385\3\2\2\2\u0385V\3\2\2\2\u0386\u0384\3\2\2\2"+
+ "\u0387\u0389\t\3\2\2\u0388\u0387\3\2\2\2\u0389\u038a\3\2\2\2\u038a\u0388"+
+ "\3\2\2\2\u038a\u038b\3\2\2\2\u038b\u038c\3\2\2\2\u038c\u038d\b,\2\2\u038d"+
+ "X\3\2\2\2\u038e\u0392\7%\2\2\u038f\u0391\n\4\2\2\u0390\u038f\3\2\2\2\u0391"+
+ "\u0394\3\2\2\2\u0392\u0390\3\2\2\2\u0392\u0393\3\2\2\2\u0393\u0395\3\2"+
+ "\2\2\u0394\u0392\3\2\2\2\u0395\u0396\b-\3\2\u0396Z\3\2\2\2\u0397\u039b"+
+ "\t\5\2\2\u0398\u039a\t\6\2\2\u0399\u0398\3\2\2\2\u039a\u039d\3\2\2\2\u039b"+
+ "\u0399\3\2\2\2\u039b\u039c\3\2\2\2\u039c\\\3\2\2\2\u039d\u039b\3\2\2\2"+
+ "\u039e\u039f\t\7\2\2\u039f^\3\2\2\2\u03a0\u03a1\t\b\2\2\u03a1`\3\2\2\2"+
+ "\u03a2\u03a8\t\t\2\2\u03a3\u03a4\7>\2\2\u03a4\u03a8\7?\2\2\u03a5\u03a6"+
+ "\7@\2\2\u03a6\u03a8\7?\2\2\u03a7\u03a2\3\2\2\2\u03a7\u03a3\3\2\2\2\u03a7"+
+ "\u03a5\3\2\2\2\u03a8b\3\2\2\2\u03a9\u03aa\7?\2\2\u03aa\u03ae\7?\2\2\u03ab"+
+ "\u03ac\7#\2\2\u03ac\u03ae\7?\2\2\u03ad\u03a9\3\2\2\2\u03ad\u03ab\3\2\2"+
+ "\2\u03aed\3\2\2\2\u03af\u03b0\7(\2\2\u03b0f\3\2\2\2\u03b1\u03b2\7~\2\2"+
+ "\u03b2h\3\2\2\2\u03b3\u03b4\t\n\2\2\u03b4j\3\2\2\2\u03b5\u03b6\7\62\2"+
+ "\2\u03b6\u03ba\7z\2\2\u03b7\u03b8\7\62\2\2\u03b8\u03ba\7Z\2\2\u03b9\u03b5"+
+ "\3\2\2\2\u03b9\u03b7\3\2\2\2\u03ba\u03bc\3\2\2\2\u03bb\u03bd\5i\65\2\u03bc"+
+ "\u03bb\3\2\2\2\u03bd\u03be\3\2\2\2\u03be\u03bc\3\2\2\2\u03be\u03bf\3\2"+
+ "\2\2\u03bfl\3\2\2\2\21\2\u0186\u0362\u036d\u0373\u0379\u037e\u0384\u038a"+
+ "\u0392\u039b\u03a7\u03ad\u03b9\u03be";
public static final ATN _ATN =
ATNSimulator.deserialize(_serializedATN.toCharArray());
static {
diff --git a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentListener.java b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentListener.java
index 41b80e61..3928fd0d 100644
--- a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentListener.java
+++ b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentListener.java
@@ -173,6 +173,28 @@ public interface SerpentListener extends ParseTreeListener {
*/
void exitBlock_difficulty(@NotNull SerpentParser.Block_difficultyContext ctx);
+ /**
+ * Enter a parse tree produced by {@link SerpentParser#array_assign}.
+ * @param ctx the parse tree
+ */
+ void enterArray_assign(@NotNull SerpentParser.Array_assignContext ctx);
+ /**
+ * Exit a parse tree produced by {@link SerpentParser#array_assign}.
+ * @param ctx the parse tree
+ */
+ void exitArray_assign(@NotNull SerpentParser.Array_assignContext ctx);
+
+ /**
+ * Enter a parse tree produced by {@link SerpentParser#array_retreive}.
+ * @param ctx the parse tree
+ */
+ void enterArray_retreive(@NotNull SerpentParser.Array_retreiveContext ctx);
+ /**
+ * Exit a parse tree produced by {@link SerpentParser#array_retreive}.
+ * @param ctx the parse tree
+ */
+ void exitArray_retreive(@NotNull SerpentParser.Array_retreiveContext ctx);
+
/**
* Enter a parse tree produced by {@link SerpentParser#parse_init_code_block}.
* @param ctx the parse tree
@@ -360,6 +382,17 @@ public interface SerpentListener extends ParseTreeListener {
*/
void exitSend_func(@NotNull SerpentParser.Send_funcContext ctx);
+ /**
+ * Enter a parse tree produced by {@link SerpentParser#arr_def}.
+ * @param ctx the parse tree
+ */
+ void enterArr_def(@NotNull SerpentParser.Arr_defContext ctx);
+ /**
+ * Exit a parse tree produced by {@link SerpentParser#arr_def}.
+ * @param ctx the parse tree
+ */
+ void exitArr_def(@NotNull SerpentParser.Arr_defContext ctx);
+
/**
* Enter a parse tree produced by {@link SerpentParser#while_stmt}.
* @param ctx the parse tree
diff --git a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentParser.java b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentParser.java
index 751b8242..8215a173 100644
--- a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentParser.java
+++ b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentParser.java
@@ -41,23 +41,23 @@ public class SerpentParser extends Parser {
RULE_tx_gasprice = 11, RULE_tx_origin = 12, RULE_tx_gas = 13, RULE_contract_balance = 14,
RULE_block_prevhash = 15, RULE_block_coinbase = 16, RULE_block_timestamp = 17,
RULE_block_number = 18, RULE_block_difficulty = 19, RULE_block_gaslimit = 20,
- RULE_msg_func = 21, RULE_send_func = 22, RULE_msg_data = 23, RULE_assign = 24,
- RULE_contract_storage_assign = 25, RULE_contract_storage_load = 26, RULE_mul_expr = 27,
- RULE_add_expr = 28, RULE_rel_exp = 29, RULE_eq_exp = 30, RULE_and_exp = 31,
- RULE_ex_or_exp = 32, RULE_in_or_exp = 33, RULE_log_and_exp = 34, RULE_log_or_exp = 35,
- RULE_expression = 36, RULE_condition = 37, RULE_int_val = 38, RULE_hex_num = 39,
- RULE_ret_func_1 = 40, RULE_ret_func_2 = 41, RULE_suicide_func = 42, RULE_stop_func = 43,
- RULE_get_var = 44;
+ RULE_msg_func = 21, RULE_send_func = 22, RULE_msg_data = 23, RULE_array_assign = 24,
+ RULE_array_retreive = 25, RULE_assign = 26, RULE_arr_def = 27, RULE_contract_storage_assign = 28,
+ RULE_contract_storage_load = 29, RULE_mul_expr = 30, RULE_add_expr = 31,
+ RULE_rel_exp = 32, RULE_eq_exp = 33, RULE_and_exp = 34, RULE_ex_or_exp = 35,
+ RULE_in_or_exp = 36, RULE_log_and_exp = 37, RULE_log_or_exp = 38, RULE_expression = 39,
+ RULE_condition = 40, RULE_int_val = 41, RULE_hex_num = 42, RULE_ret_func_1 = 43,
+ RULE_ret_func_2 = 44, RULE_suicide_func = 45, RULE_stop_func = 46, RULE_get_var = 47;
public static final String[] ruleNames = {
"parse", "parse_init_code_block", "block", "asm", "asm_symbol", "if_elif_else_stmt",
"while_stmt", "special_func", "msg_datasize", "msg_sender", "msg_value",
"tx_gasprice", "tx_origin", "tx_gas", "contract_balance", "block_prevhash",
"block_coinbase", "block_timestamp", "block_number", "block_difficulty",
- "block_gaslimit", "msg_func", "send_func", "msg_data", "assign", "contract_storage_assign",
- "contract_storage_load", "mul_expr", "add_expr", "rel_exp", "eq_exp",
- "and_exp", "ex_or_exp", "in_or_exp", "log_and_exp", "log_or_exp", "expression",
- "condition", "int_val", "hex_num", "ret_func_1", "ret_func_2", "suicide_func",
- "stop_func", "get_var"
+ "block_gaslimit", "msg_func", "send_func", "msg_data", "array_assign",
+ "array_retreive", "assign", "arr_def", "contract_storage_assign", "contract_storage_load",
+ "mul_expr", "add_expr", "rel_exp", "eq_exp", "and_exp", "ex_or_exp", "in_or_exp",
+ "log_and_exp", "log_or_exp", "expression", "condition", "int_val", "hex_num",
+ "ret_func_1", "ret_func_2", "suicide_func", "stop_func", "get_var"
};
@Override
@@ -106,8 +106,8 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(90); block();
- setState(91); match(EOF);
+ setState(96); block();
+ setState(97); match(EOF);
}
}
catch (RecognitionException re) {
@@ -161,16 +161,16 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(93); match(16);
- setState(94); match(10);
- setState(95); match(INDENT);
- setState(96); block();
- setState(97); match(DEDENT);
- setState(98); match(34);
- setState(99); match(10);
- setState(100); match(INDENT);
- setState(101); block();
- setState(102); match(DEDENT);
+ setState(99); match(16);
+ setState(100); match(10);
+ setState(101); match(INDENT);
+ setState(102); block();
+ setState(103); match(DEDENT);
+ setState(104); match(34);
+ setState(105); match(10);
+ setState(106); match(INDENT);
+ setState(107); block();
+ setState(108); match(DEDENT);
}
}
catch (RecognitionException re) {
@@ -185,6 +185,9 @@ public class SerpentParser extends Parser {
}
public static class BlockContext extends ParserRuleContext {
+ public Array_assignContext array_assign(int i) {
+ return getRuleContext(Array_assignContext.class,i);
+ }
public Stop_funcContext stop_func(int i) {
return getRuleContext(Stop_funcContext.class,i);
}
@@ -203,15 +206,18 @@ public class SerpentParser extends Parser {
public List suicide_func() {
return getRuleContexts(Suicide_funcContext.class);
}
+ public List array_assign() {
+ return getRuleContexts(Array_assignContext.class);
+ }
public List stop_func() {
return getRuleContexts(Stop_funcContext.class);
}
- public Contract_storage_assignContext contract_storage_assign(int i) {
- return getRuleContext(Contract_storage_assignContext.class,i);
- }
public List while_stmt() {
return getRuleContexts(While_stmtContext.class);
}
+ public Contract_storage_assignContext contract_storage_assign(int i) {
+ return getRuleContext(Contract_storage_assignContext.class,i);
+ }
public List special_func() {
return getRuleContexts(Special_funcContext.class);
}
@@ -221,12 +227,12 @@ public class SerpentParser extends Parser {
public Special_funcContext special_func(int i) {
return getRuleContext(Special_funcContext.class,i);
}
- public List contract_storage_assign() {
- return getRuleContexts(Contract_storage_assignContext.class);
- }
public While_stmtContext while_stmt(int i) {
return getRuleContext(While_stmtContext.class,i);
}
+ public List contract_storage_assign() {
+ return getRuleContexts(Contract_storage_assignContext.class);
+ }
public Ret_func_2Context ret_func_2(int i) {
return getRuleContext(Ret_func_2Context.class,i);
}
@@ -271,75 +277,81 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(116);
+ setState(123);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 2) | (1L << 3) | (1L << 6) | (1L << 7) | (1L << 11) | (1L << 13) | (1L << 14) | (1L << 15) | (1L << 17) | (1L << 18) | (1L << 19) | (1L << 20) | (1L << 21) | (1L << 23) | (1L << 25) | (1L << 28) | (1L << 29) | (1L << 30) | (1L << 32) | (1L << 33) | (1L << VAR))) != 0)) {
{
- setState(114);
+ setState(121);
switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) {
case 1:
{
- setState(104); asm();
+ setState(110); asm();
}
break;
case 2:
{
- setState(105); assign();
+ setState(111); array_assign();
}
break;
case 3:
{
- setState(106); contract_storage_assign();
+ setState(112); assign();
}
break;
case 4:
{
- setState(107); special_func();
+ setState(113); contract_storage_assign();
}
break;
case 5:
{
- setState(108); if_elif_else_stmt();
+ setState(114); special_func();
}
break;
case 6:
{
- setState(109); while_stmt();
+ setState(115); if_elif_else_stmt();
}
break;
case 7:
{
- setState(110); ret_func_1();
+ setState(116); while_stmt();
}
break;
case 8:
{
- setState(111); ret_func_2();
+ setState(117); ret_func_1();
}
break;
case 9:
{
- setState(112); suicide_func();
+ setState(118); ret_func_2();
}
break;
case 10:
{
- setState(113); stop_func();
+ setState(119); suicide_func();
+ }
+ break;
+
+ case 11:
+ {
+ setState(120); stop_func();
}
break;
}
}
- setState(118);
+ setState(125);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -386,10 +398,10 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(119); match(14);
- setState(120); asm_symbol();
- setState(121); match(31);
- setState(122); match(NL);
+ setState(126); match(14);
+ setState(127); asm_symbol();
+ setState(128); match(31);
+ setState(129); match(NL);
}
}
catch (RecognitionException re) {
@@ -442,13 +454,13 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(127);
+ setState(134);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << INT) | (1L << ASM_SYMBOLS) | (1L << HEX_NUMBER))) != 0)) {
{
{
- setState(124);
+ setState(131);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << INT) | (1L << ASM_SYMBOLS) | (1L << HEX_NUMBER))) != 0)) ) {
_errHandler.recoverInline(this);
@@ -456,7 +468,7 @@ public class SerpentParser extends Parser {
consume();
}
}
- setState(129);
+ setState(136);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -520,38 +532,38 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(130); match(11);
- setState(131); condition();
- setState(132); match(10);
- setState(133); match(INDENT);
- setState(134); block();
- setState(135); match(DEDENT);
- setState(145);
+ setState(137); match(11);
+ setState(138); condition();
+ setState(139); match(10);
+ setState(140); match(INDENT);
+ setState(141); block();
+ setState(142); match(DEDENT);
+ setState(152);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==27) {
{
{
- setState(136); match(27);
- setState(137); condition();
- setState(138); match(10);
- setState(139); match(INDENT);
- setState(140); block();
- setState(141); match(DEDENT);
+ setState(143); match(27);
+ setState(144); condition();
+ setState(145); match(10);
+ setState(146); match(INDENT);
+ setState(147); block();
+ setState(148); match(DEDENT);
}
}
- setState(147);
+ setState(154);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(153);
+ setState(160);
_la = _input.LA(1);
if (_la==24) {
{
- setState(148); match(24);
- setState(149); match(INDENT);
- setState(150); block();
- setState(151); match(DEDENT);
+ setState(155); match(24);
+ setState(156); match(INDENT);
+ setState(157); block();
+ setState(158); match(DEDENT);
}
}
@@ -602,12 +614,12 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(155); match(7);
- setState(156); condition();
- setState(157); match(10);
- setState(158); match(INDENT);
- setState(159); block();
- setState(160); match(DEDENT);
+ setState(162); match(7);
+ setState(163); condition();
+ setState(164); match(10);
+ setState(165); match(INDENT);
+ setState(166); block();
+ setState(167); match(DEDENT);
}
}
catch (RecognitionException re) {
@@ -684,84 +696,84 @@ public class SerpentParser extends Parser {
Special_funcContext _localctx = new Special_funcContext(_ctx, getState());
enterRule(_localctx, 14, RULE_special_func);
try {
- setState(175);
+ setState(182);
switch (_input.LA(1)) {
case 21:
enterOuterAlt(_localctx, 1);
{
- setState(162); msg_datasize();
+ setState(169); msg_datasize();
}
break;
case 29:
enterOuterAlt(_localctx, 2);
{
- setState(163); msg_sender();
+ setState(170); msg_sender();
}
break;
case 15:
enterOuterAlt(_localctx, 3);
{
- setState(164); msg_value();
+ setState(171); msg_value();
}
break;
case 23:
enterOuterAlt(_localctx, 4);
{
- setState(165); tx_gasprice();
+ setState(172); tx_gasprice();
}
break;
case 25:
enterOuterAlt(_localctx, 5);
{
- setState(166); tx_origin();
+ setState(173); tx_origin();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(167); tx_gas();
+ setState(174); tx_gas();
}
break;
case 30:
enterOuterAlt(_localctx, 7);
{
- setState(168); contract_balance();
+ setState(175); contract_balance();
}
break;
case 17:
enterOuterAlt(_localctx, 8);
{
- setState(169); block_prevhash();
+ setState(176); block_prevhash();
}
break;
case 3:
enterOuterAlt(_localctx, 9);
{
- setState(170); block_coinbase();
+ setState(177); block_coinbase();
}
break;
case 13:
enterOuterAlt(_localctx, 10);
{
- setState(171); block_timestamp();
+ setState(178); block_timestamp();
}
break;
case 33:
enterOuterAlt(_localctx, 11);
{
- setState(172); block_number();
+ setState(179); block_number();
}
break;
case 20:
enterOuterAlt(_localctx, 12);
{
- setState(173); block_difficulty();
+ setState(180); block_difficulty();
}
break;
case 32:
enterOuterAlt(_localctx, 13);
{
- setState(174); block_gaslimit();
+ setState(181); block_gaslimit();
}
break;
default:
@@ -805,7 +817,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(177); match(21);
+ setState(184); match(21);
}
}
catch (RecognitionException re) {
@@ -845,7 +857,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(179); match(29);
+ setState(186); match(29);
}
}
catch (RecognitionException re) {
@@ -885,7 +897,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(181); match(15);
+ setState(188); match(15);
}
}
catch (RecognitionException re) {
@@ -925,7 +937,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(183); match(23);
+ setState(190); match(23);
}
}
catch (RecognitionException re) {
@@ -965,7 +977,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(185); match(25);
+ setState(192); match(25);
}
}
catch (RecognitionException re) {
@@ -1005,7 +1017,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(187); match(6);
+ setState(194); match(6);
}
}
catch (RecognitionException re) {
@@ -1045,7 +1057,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(189); match(30);
+ setState(196); match(30);
}
}
catch (RecognitionException re) {
@@ -1085,7 +1097,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(191); match(17);
+ setState(198); match(17);
}
}
catch (RecognitionException re) {
@@ -1125,7 +1137,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(193); match(3);
+ setState(200); match(3);
}
}
catch (RecognitionException re) {
@@ -1165,7 +1177,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(195); match(13);
+ setState(202); match(13);
}
}
catch (RecognitionException re) {
@@ -1205,7 +1217,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(197); match(33);
+ setState(204); match(33);
}
}
catch (RecognitionException re) {
@@ -1245,7 +1257,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(199); match(20);
+ setState(206); match(20);
}
}
catch (RecognitionException re) {
@@ -1285,7 +1297,7 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(201); match(32);
+ setState(208); match(32);
}
}
catch (RecognitionException re) {
@@ -1331,18 +1343,18 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(203); match(5);
- setState(204); match(9);
- setState(205); int_val();
- setState(206); match(4);
- setState(207); int_val();
- setState(208); match(4);
- setState(209); int_val();
- setState(210); match(4);
- setState(211); int_val();
- setState(212); match(4);
- setState(213); int_val();
- setState(214); match(22);
+ setState(210); match(5);
+ setState(211); match(9);
+ setState(212); int_val();
+ setState(213); match(4);
+ setState(214); int_val();
+ setState(215); match(4);
+ setState(216); int_val();
+ setState(217); match(4);
+ setState(218); int_val();
+ setState(219); match(4);
+ setState(220); int_val();
+ setState(221); match(22);
}
}
catch (RecognitionException re) {
@@ -1388,14 +1400,14 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(216); match(12);
- setState(217); match(9);
- setState(218); int_val();
- setState(219); match(4);
- setState(220); int_val();
- setState(221); match(4);
- setState(222); int_val();
- setState(223); match(22);
+ setState(223); match(12);
+ setState(224); match(9);
+ setState(225); int_val();
+ setState(226); match(4);
+ setState(227); int_val();
+ setState(228); match(4);
+ setState(229); int_val();
+ setState(230); match(22);
}
}
catch (RecognitionException re) {
@@ -1438,10 +1450,112 @@ public class SerpentParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(225); match(26);
- setState(226); match(8);
- setState(227); expression();
- setState(228); match(1);
+ setState(232); match(26);
+ setState(233); match(8);
+ setState(234); expression();
+ setState(235); match(1);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Array_assignContext extends ParserRuleContext {
+ public TerminalNode NL() { return getToken(SerpentParser.NL, 0); }
+ public TerminalNode VAR() { return getToken(SerpentParser.VAR, 0); }
+ public TerminalNode EQ_OP() { return getToken(SerpentParser.EQ_OP, 0); }
+ public Int_valContext int_val() {
+ return getRuleContext(Int_valContext.class,0);
+ }
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public Array_assignContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_array_assign; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof SerpentListener ) ((SerpentListener)listener).enterArray_assign(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof SerpentListener ) ((SerpentListener)listener).exitArray_assign(this);
+ }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof SerpentVisitor ) return ((SerpentVisitor extends T>)visitor).visitArray_assign(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final Array_assignContext array_assign() throws RecognitionException {
+ Array_assignContext _localctx = new Array_assignContext(_ctx, getState());
+ enterRule(_localctx, 48, RULE_array_assign);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(237); match(VAR);
+ setState(238); match(8);
+ setState(239); int_val();
+ setState(240); match(1);
+ setState(241); match(EQ_OP);
+ setState(242); expression();
+ setState(243); match(NL);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Array_retreiveContext extends ParserRuleContext {
+ public TerminalNode VAR() { return getToken(SerpentParser.VAR, 0); }
+ public Int_valContext int_val() {
+ return getRuleContext(Int_valContext.class,0);
+ }
+ public Array_retreiveContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_array_retreive; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof SerpentListener ) ((SerpentListener)listener).enterArray_retreive(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof SerpentListener ) ((SerpentListener)listener).exitArray_retreive(this);
+ }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof SerpentVisitor ) return ((SerpentVisitor extends T>)visitor).visitArray_retreive(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final Array_retreiveContext array_retreive() throws RecognitionException {
+ Array_retreiveContext _localctx = new Array_retreiveContext(_ctx, getState());
+ enterRule(_localctx, 50, RULE_array_retreive);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(245); match(VAR);
+ setState(246); match(8);
+ setState(247); int_val();
+ setState(248); match(1);
}
}
catch (RecognitionException re) {
@@ -1462,6 +1576,9 @@ public class SerpentParser extends Parser {
public ExpressionContext expression() {
return getRuleContext(ExpressionContext.class,0);
}
+ public Arr_defContext arr_def() {
+ return getRuleContext(Arr_defContext.class,0);
+ }
public AssignContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -1483,14 +1600,118 @@ public class SerpentParser extends Parser {
public final AssignContext assign() throws RecognitionException {
AssignContext _localctx = new AssignContext(_ctx, getState());
- enterRule(_localctx, 48, RULE_assign);
+ enterRule(_localctx, 52, RULE_assign);
try {
enterOuterAlt(_localctx, 1);
{
- setState(230); match(VAR);
- setState(231); match(EQ_OP);
- setState(232); expression();
- setState(233); match(NL);
+ setState(250); match(VAR);
+ setState(251); match(EQ_OP);
+ setState(254);
+ switch (_input.LA(1)) {
+ case 3:
+ case 5:
+ case 6:
+ case 9:
+ case 12:
+ case 13:
+ case 15:
+ case 17:
+ case 18:
+ case 20:
+ case 21:
+ case 23:
+ case 25:
+ case 26:
+ case 29:
+ case 30:
+ case 32:
+ case 33:
+ case INT:
+ case OP_NOT:
+ case VAR:
+ case HEX_NUMBER:
+ {
+ setState(252); expression();
+ }
+ break;
+ case 8:
+ {
+ setState(253); arr_def();
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ setState(256); match(NL);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Arr_defContext extends ParserRuleContext {
+ public Int_valContext int_val(int i) {
+ return getRuleContext(Int_valContext.class,i);
+ }
+ public List int_val() {
+ return getRuleContexts(Int_valContext.class);
+ }
+ public Arr_defContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_arr_def; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof SerpentListener ) ((SerpentListener)listener).enterArr_def(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof SerpentListener ) ((SerpentListener)listener).exitArr_def(this);
+ }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof SerpentVisitor ) return ((SerpentVisitor extends T>)visitor).visitArr_def(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final Arr_defContext arr_def() throws RecognitionException {
+ Arr_defContext _localctx = new Arr_defContext(_ctx, getState());
+ enterRule(_localctx, 54, RULE_arr_def);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(258); match(8);
+ setState(265);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 3) | (1L << 5) | (1L << 6) | (1L << 9) | (1L << 12) | (1L << 13) | (1L << 15) | (1L << 17) | (1L << 18) | (1L << 20) | (1L << 21) | (1L << 23) | (1L << 25) | (1L << 26) | (1L << 29) | (1L << 30) | (1L << 32) | (1L << 33) | (1L << INT) | (1L << OP_NOT) | (1L << VAR) | (1L << HEX_NUMBER))) != 0)) {
+ {
+ {
+ setState(259); int_val();
+ setState(261);
+ _la = _input.LA(1);
+ if (_la==4) {
+ {
+ setState(260); match(4);
+ }
+ }
+
+ }
+ }
+ setState(267);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(268); match(1);
}
}
catch (RecognitionException re) {
@@ -1534,17 +1755,17 @@ public class SerpentParser extends Parser {
public final Contract_storage_assignContext contract_storage_assign() throws RecognitionException {
Contract_storage_assignContext _localctx = new Contract_storage_assignContext(_ctx, getState());
- enterRule(_localctx, 50, RULE_contract_storage_assign);
+ enterRule(_localctx, 56, RULE_contract_storage_assign);
try {
enterOuterAlt(_localctx, 1);
{
- setState(235); match(18);
- setState(236); match(8);
- setState(237); expression();
- setState(238); match(1);
- setState(239); match(EQ_OP);
- setState(240); expression();
- setState(241); match(NL);
+ setState(270); match(18);
+ setState(271); match(8);
+ setState(272); expression();
+ setState(273); match(1);
+ setState(274); match(EQ_OP);
+ setState(275); expression();
+ setState(276); match(NL);
}
}
catch (RecognitionException re) {
@@ -1583,14 +1804,14 @@ public class SerpentParser extends Parser {
public final Contract_storage_loadContext contract_storage_load() throws RecognitionException {
Contract_storage_loadContext _localctx = new Contract_storage_loadContext(_ctx, getState());
- enterRule(_localctx, 52, RULE_contract_storage_load);
+ enterRule(_localctx, 58, RULE_contract_storage_load);
try {
enterOuterAlt(_localctx, 1);
{
- setState(243); match(18);
- setState(244); match(8);
- setState(245); expression();
- setState(246); match(1);
+ setState(278); match(18);
+ setState(279); match(8);
+ setState(280); expression();
+ setState(281); match(1);
}
}
catch (RecognitionException re) {
@@ -1639,19 +1860,19 @@ public class SerpentParser extends Parser {
int _parentState = getState();
Mul_exprContext _localctx = new Mul_exprContext(_ctx, _parentState, _p);
Mul_exprContext _prevctx = _localctx;
- int _startState = 54;
+ int _startState = 60;
enterRecursionRule(_localctx, RULE_mul_expr);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
{
- setState(249); int_val();
+ setState(284); int_val();
}
_ctx.stop = _input.LT(-1);
- setState(256);
+ setState(291);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,9,_ctx);
while ( _alt!=2 && _alt!=-1 ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -1660,16 +1881,16 @@ public class SerpentParser extends Parser {
{
_localctx = new Mul_exprContext(_parentctx, _parentState, _p);
pushNewRecursionContext(_localctx, _startState, RULE_mul_expr);
- setState(251);
+ setState(286);
if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
- setState(252); match(OP_MUL);
- setState(253); int_val();
+ setState(287); match(OP_MUL);
+ setState(288); int_val();
}
}
}
- setState(258);
+ setState(293);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,9,_ctx);
}
}
}
@@ -1719,19 +1940,19 @@ public class SerpentParser extends Parser {
int _parentState = getState();
Add_exprContext _localctx = new Add_exprContext(_ctx, _parentState, _p);
Add_exprContext _prevctx = _localctx;
- int _startState = 56;
+ int _startState = 62;
enterRecursionRule(_localctx, RULE_add_expr);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
{
- setState(260); mul_expr(0);
+ setState(295); mul_expr(0);
}
_ctx.stop = _input.LT(-1);
- setState(267);
+ setState(302);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,10,_ctx);
while ( _alt!=2 && _alt!=-1 ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -1740,16 +1961,16 @@ public class SerpentParser extends Parser {
{
_localctx = new Add_exprContext(_parentctx, _parentState, _p);
pushNewRecursionContext(_localctx, _startState, RULE_add_expr);
- setState(262);
+ setState(297);
if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
- setState(263); match(OP_ADD);
- setState(264); mul_expr(0);
+ setState(298); match(OP_ADD);
+ setState(299); mul_expr(0);
}
}
}
- setState(269);
+ setState(304);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,10,_ctx);
}
}
}
@@ -1799,19 +2020,19 @@ public class SerpentParser extends Parser {
int _parentState = getState();
Rel_expContext _localctx = new Rel_expContext(_ctx, _parentState, _p);
Rel_expContext _prevctx = _localctx;
- int _startState = 58;
+ int _startState = 64;
enterRecursionRule(_localctx, RULE_rel_exp);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
{
- setState(271); add_expr(0);
+ setState(306); add_expr(0);
}
_ctx.stop = _input.LT(-1);
- setState(278);
+ setState(313);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,8,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,11,_ctx);
while ( _alt!=2 && _alt!=-1 ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -1820,16 +2041,16 @@ public class SerpentParser extends Parser {
{
_localctx = new Rel_expContext(_parentctx, _parentState, _p);
pushNewRecursionContext(_localctx, _startState, RULE_rel_exp);
- setState(273);
+ setState(308);
if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
- setState(274); match(OP_REL);
- setState(275); add_expr(0);
+ setState(309); match(OP_REL);
+ setState(310); add_expr(0);
}
}
}
- setState(280);
+ setState(315);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,8,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,11,_ctx);
}
}
}
@@ -1879,19 +2100,19 @@ public class SerpentParser extends Parser {
int _parentState = getState();
Eq_expContext _localctx = new Eq_expContext(_ctx, _parentState, _p);
Eq_expContext _prevctx = _localctx;
- int _startState = 60;
+ int _startState = 66;
enterRecursionRule(_localctx, RULE_eq_exp);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
{
- setState(282); rel_exp(0);
+ setState(317); rel_exp(0);
}
_ctx.stop = _input.LT(-1);
- setState(289);
+ setState(324);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,9,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,12,_ctx);
while ( _alt!=2 && _alt!=-1 ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -1900,16 +2121,16 @@ public class SerpentParser extends Parser {
{
_localctx = new Eq_expContext(_parentctx, _parentState, _p);
pushNewRecursionContext(_localctx, _startState, RULE_eq_exp);
- setState(284);
+ setState(319);
if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
- setState(285); match(OP_EQ);
- setState(286); rel_exp(0);
+ setState(320); match(OP_EQ);
+ setState(321); rel_exp(0);
}
}
}
- setState(291);
+ setState(326);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,9,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,12,_ctx);
}
}
}
@@ -1959,19 +2180,19 @@ public class SerpentParser extends Parser {
int _parentState = getState();
And_expContext _localctx = new And_expContext(_ctx, _parentState, _p);
And_expContext _prevctx = _localctx;
- int _startState = 62;
+ int _startState = 68;
enterRecursionRule(_localctx, RULE_and_exp);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
{
- setState(293); eq_exp(0);
+ setState(328); eq_exp(0);
}
_ctx.stop = _input.LT(-1);
- setState(300);
+ setState(335);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,10,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,13,_ctx);
while ( _alt!=2 && _alt!=-1 ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -1980,16 +2201,16 @@ public class SerpentParser extends Parser {
{
_localctx = new And_expContext(_parentctx, _parentState, _p);
pushNewRecursionContext(_localctx, _startState, RULE_and_exp);
- setState(295);
+ setState(330);
if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
- setState(296); match(OP_AND);
- setState(297); eq_exp(0);
+ setState(331); match(OP_AND);
+ setState(332); eq_exp(0);
}
}
}
- setState(302);
+ setState(337);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,10,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,13,_ctx);
}
}
}
@@ -2039,19 +2260,19 @@ public class SerpentParser extends Parser {
int _parentState = getState();
Ex_or_expContext _localctx = new Ex_or_expContext(_ctx, _parentState, _p);
Ex_or_expContext _prevctx = _localctx;
- int _startState = 64;
+ int _startState = 70;
enterRecursionRule(_localctx, RULE_ex_or_exp);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
{
- setState(304); and_exp(0);
+ setState(339); and_exp(0);
}
_ctx.stop = _input.LT(-1);
- setState(311);
+ setState(346);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,11,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,14,_ctx);
while ( _alt!=2 && _alt!=-1 ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -2060,16 +2281,16 @@ public class SerpentParser extends Parser {
{
_localctx = new Ex_or_expContext(_parentctx, _parentState, _p);
pushNewRecursionContext(_localctx, _startState, RULE_ex_or_exp);
- setState(306);
+ setState(341);
if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
- setState(307); match(OP_EX_OR);
- setState(308); and_exp(0);
+ setState(342); match(OP_EX_OR);
+ setState(343); and_exp(0);
}
}
}
- setState(313);
+ setState(348);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,11,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,14,_ctx);
}
}
}
@@ -2119,19 +2340,19 @@ public class SerpentParser extends Parser {
int _parentState = getState();
In_or_expContext _localctx = new In_or_expContext(_ctx, _parentState, _p);
In_or_expContext _prevctx = _localctx;
- int _startState = 66;
+ int _startState = 72;
enterRecursionRule(_localctx, RULE_in_or_exp);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
{
- setState(315); ex_or_exp(0);
+ setState(350); ex_or_exp(0);
}
_ctx.stop = _input.LT(-1);
- setState(322);
+ setState(357);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,15,_ctx);
while ( _alt!=2 && _alt!=-1 ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -2140,16 +2361,16 @@ public class SerpentParser extends Parser {
{
_localctx = new In_or_expContext(_parentctx, _parentState, _p);
pushNewRecursionContext(_localctx, _startState, RULE_in_or_exp);
- setState(317);
+ setState(352);
if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
- setState(318); match(OP_IN_OR);
- setState(319); ex_or_exp(0);
+ setState(353); match(OP_IN_OR);
+ setState(354); ex_or_exp(0);
}
}
}
- setState(324);
+ setState(359);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,15,_ctx);
}
}
}
@@ -2199,19 +2420,19 @@ public class SerpentParser extends Parser {
int _parentState = getState();
Log_and_expContext _localctx = new Log_and_expContext(_ctx, _parentState, _p);
Log_and_expContext _prevctx = _localctx;
- int _startState = 68;
+ int _startState = 74;
enterRecursionRule(_localctx, RULE_log_and_exp);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
{
- setState(326); in_or_exp(0);
+ setState(361); in_or_exp(0);
}
_ctx.stop = _input.LT(-1);
- setState(333);
+ setState(368);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,13,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,16,_ctx);
while ( _alt!=2 && _alt!=-1 ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -2220,16 +2441,16 @@ public class SerpentParser extends Parser {
{
_localctx = new Log_and_expContext(_parentctx, _parentState, _p);
pushNewRecursionContext(_localctx, _startState, RULE_log_and_exp);
- setState(328);
+ setState(363);
if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
- setState(329); match(OP_LOG_AND);
- setState(330); in_or_exp(0);
+ setState(364); match(OP_LOG_AND);
+ setState(365); in_or_exp(0);
}
}
}
- setState(335);
+ setState(370);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,13,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,16,_ctx);
}
}
}
@@ -2279,19 +2500,19 @@ public class SerpentParser extends Parser {
int _parentState = getState();
Log_or_expContext _localctx = new Log_or_expContext(_ctx, _parentState, _p);
Log_or_expContext _prevctx = _localctx;
- int _startState = 70;
+ int _startState = 76;
enterRecursionRule(_localctx, RULE_log_or_exp);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
{
- setState(337); log_and_exp(0);
+ setState(372); log_and_exp(0);
}
_ctx.stop = _input.LT(-1);
- setState(344);
+ setState(379);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,14,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,17,_ctx);
while ( _alt!=2 && _alt!=-1 ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -2300,16 +2521,16 @@ public class SerpentParser extends Parser {
{
_localctx = new Log_or_expContext(_parentctx, _parentState, _p);
pushNewRecursionContext(_localctx, _startState, RULE_log_or_exp);
- setState(339);
+ setState(374);
if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
- setState(340); match(OP_LOG_OR);
- setState(341); log_and_exp(0);
+ setState(375); match(OP_LOG_OR);
+ setState(376); log_and_exp(0);
}
}
}
- setState(346);
+ setState(381);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,14,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,17,_ctx);
}
}
}
@@ -2349,11 +2570,11 @@ public class SerpentParser extends Parser {
public final ExpressionContext expression() throws RecognitionException {
ExpressionContext _localctx = new ExpressionContext(_ctx, getState());
- enterRule(_localctx, 72, RULE_expression);
+ enterRule(_localctx, 78, RULE_expression);
try {
enterOuterAlt(_localctx, 1);
{
- setState(347); log_or_exp(0);
+ setState(382); log_or_exp(0);
}
}
catch (RecognitionException re) {
@@ -2392,11 +2613,11 @@ public class SerpentParser extends Parser {
public final ConditionContext condition() throws RecognitionException {
ConditionContext _localctx = new ConditionContext(_ctx, getState());
- enterRule(_localctx, 74, RULE_condition);
+ enterRule(_localctx, 80, RULE_condition);
try {
enterOuterAlt(_localctx, 1);
{
- setState(349); expression();
+ setState(384); expression();
}
}
catch (RecognitionException re) {
@@ -2434,6 +2655,9 @@ public class SerpentParser extends Parser {
public Msg_dataContext msg_data() {
return getRuleContext(Msg_dataContext.class,0);
}
+ public Array_retreiveContext array_retreive() {
+ return getRuleContext(Array_retreiveContext.class,0);
+ }
public Contract_storage_loadContext contract_storage_load() {
return getRuleContext(Contract_storage_loadContext.class,0);
}
@@ -2458,89 +2682,91 @@ public class SerpentParser extends Parser {
public final Int_valContext int_val() throws RecognitionException {
Int_valContext _localctx = new Int_valContext(_ctx, getState());
- enterRule(_localctx, 76, RULE_int_val);
+ enterRule(_localctx, 82, RULE_int_val);
try {
- setState(368);
- switch (_input.LA(1)) {
- case INT:
+ setState(404);
+ switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) {
+ case 1:
enterOuterAlt(_localctx, 1);
{
- setState(351); match(INT);
+ setState(386); match(INT);
}
break;
- case HEX_NUMBER:
+
+ case 2:
enterOuterAlt(_localctx, 2);
{
- setState(352); hex_num();
+ setState(387); hex_num();
}
break;
- case VAR:
+
+ case 3:
enterOuterAlt(_localctx, 3);
{
- setState(353); get_var();
+ setState(388); get_var();
}
break;
- case 3:
- case 6:
- case 13:
- case 15:
- case 17:
- case 20:
- case 21:
- case 23:
- case 25:
- case 29:
- case 30:
- case 32:
- case 33:
+
+ case 4:
enterOuterAlt(_localctx, 4);
{
- setState(354); special_func();
+ setState(389); special_func();
}
break;
- case 9:
+
+ case 5:
enterOuterAlt(_localctx, 5);
{
- setState(355); match(9);
- setState(356); expression();
- setState(357); match(22);
+ setState(390); match(9);
+ setState(391); expression();
+ setState(392); match(22);
}
break;
- case OP_NOT:
+
+ case 6:
enterOuterAlt(_localctx, 6);
{
- setState(359); match(OP_NOT);
- setState(360); match(9);
- setState(361); expression();
- setState(362); match(22);
+ setState(394); match(OP_NOT);
+ setState(395); match(9);
+ setState(396); expression();
+ setState(397); match(22);
}
break;
- case 5:
+
+ case 7:
enterOuterAlt(_localctx, 7);
{
- setState(364); msg_func();
+ setState(399); msg_func();
}
break;
- case 26:
+
+ case 8:
enterOuterAlt(_localctx, 8);
{
- setState(365); msg_data();
+ setState(400); msg_data();
}
break;
- case 12:
+
+ case 9:
enterOuterAlt(_localctx, 9);
{
- setState(366); send_func();
+ setState(401); send_func();
}
break;
- case 18:
+
+ case 10:
enterOuterAlt(_localctx, 10);
{
- setState(367); contract_storage_load();
+ setState(402); contract_storage_load();
+ }
+ break;
+
+ case 11:
+ enterOuterAlt(_localctx, 11);
+ {
+ setState(403); array_retreive();
}
break;
- default:
- throw new NoViableAltException(this);
}
}
catch (RecognitionException re) {
@@ -2577,11 +2803,11 @@ public class SerpentParser extends Parser {
public final Hex_numContext hex_num() throws RecognitionException {
Hex_numContext _localctx = new Hex_numContext(_ctx, getState());
- enterRule(_localctx, 78, RULE_hex_num);
+ enterRule(_localctx, 84, RULE_hex_num);
try {
enterOuterAlt(_localctx, 1);
{
- setState(370); match(HEX_NUMBER);
+ setState(406); match(HEX_NUMBER);
}
}
catch (RecognitionException re) {
@@ -2621,15 +2847,15 @@ public class SerpentParser extends Parser {
public final Ret_func_1Context ret_func_1() throws RecognitionException {
Ret_func_1Context _localctx = new Ret_func_1Context(_ctx, getState());
- enterRule(_localctx, 80, RULE_ret_func_1);
+ enterRule(_localctx, 86, RULE_ret_func_1);
try {
enterOuterAlt(_localctx, 1);
{
- setState(372); match(28);
- setState(373); match(9);
- setState(374); expression();
- setState(375); match(22);
- setState(376); match(NL);
+ setState(408); match(28);
+ setState(409); match(9);
+ setState(410); expression();
+ setState(411); match(22);
+ setState(412); match(NL);
}
}
catch (RecognitionException re) {
@@ -2672,17 +2898,17 @@ public class SerpentParser extends Parser {
public final Ret_func_2Context ret_func_2() throws RecognitionException {
Ret_func_2Context _localctx = new Ret_func_2Context(_ctx, getState());
- enterRule(_localctx, 82, RULE_ret_func_2);
+ enterRule(_localctx, 88, RULE_ret_func_2);
try {
enterOuterAlt(_localctx, 1);
{
- setState(378); match(28);
- setState(379); match(9);
- setState(380); expression();
- setState(381); match(4);
- setState(382); expression();
- setState(383); match(22);
- setState(384); match(NL);
+ setState(414); match(28);
+ setState(415); match(9);
+ setState(416); expression();
+ setState(417); match(4);
+ setState(418); expression();
+ setState(419); match(22);
+ setState(420); match(NL);
}
}
catch (RecognitionException re) {
@@ -2722,15 +2948,15 @@ public class SerpentParser extends Parser {
public final Suicide_funcContext suicide_func() throws RecognitionException {
Suicide_funcContext _localctx = new Suicide_funcContext(_ctx, getState());
- enterRule(_localctx, 84, RULE_suicide_func);
+ enterRule(_localctx, 90, RULE_suicide_func);
try {
enterOuterAlt(_localctx, 1);
{
- setState(386); match(19);
- setState(387); match(9);
- setState(388); expression();
- setState(389); match(22);
- setState(390); match(NL);
+ setState(422); match(19);
+ setState(423); match(9);
+ setState(424); expression();
+ setState(425); match(22);
+ setState(426); match(NL);
}
}
catch (RecognitionException re) {
@@ -2767,12 +2993,12 @@ public class SerpentParser extends Parser {
public final Stop_funcContext stop_func() throws RecognitionException {
Stop_funcContext _localctx = new Stop_funcContext(_ctx, getState());
- enterRule(_localctx, 86, RULE_stop_func);
+ enterRule(_localctx, 92, RULE_stop_func);
try {
enterOuterAlt(_localctx, 1);
{
- setState(392); match(2);
- setState(393); match(NL);
+ setState(428); match(2);
+ setState(429); match(NL);
}
}
catch (RecognitionException re) {
@@ -2809,11 +3035,11 @@ public class SerpentParser extends Parser {
public final Get_varContext get_var() throws RecognitionException {
Get_varContext _localctx = new Get_varContext(_ctx, getState());
- enterRule(_localctx, 88, RULE_get_var);
+ enterRule(_localctx, 94, RULE_get_var);
try {
enterOuterAlt(_localctx, 1);
{
- setState(395); match(VAR);
+ setState(431); match(VAR);
}
}
catch (RecognitionException re) {
@@ -2829,23 +3055,23 @@ public class SerpentParser extends Parser {
public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
switch (ruleIndex) {
- case 27: return mul_expr_sempred((Mul_exprContext)_localctx, predIndex);
+ case 30: return mul_expr_sempred((Mul_exprContext)_localctx, predIndex);
- case 28: return add_expr_sempred((Add_exprContext)_localctx, predIndex);
+ case 31: return add_expr_sempred((Add_exprContext)_localctx, predIndex);
- case 29: return rel_exp_sempred((Rel_expContext)_localctx, predIndex);
+ case 32: return rel_exp_sempred((Rel_expContext)_localctx, predIndex);
- case 30: return eq_exp_sempred((Eq_expContext)_localctx, predIndex);
+ case 33: return eq_exp_sempred((Eq_expContext)_localctx, predIndex);
- case 31: return and_exp_sempred((And_expContext)_localctx, predIndex);
+ case 34: return and_exp_sempred((And_expContext)_localctx, predIndex);
- case 32: return ex_or_exp_sempred((Ex_or_expContext)_localctx, predIndex);
+ case 35: return ex_or_exp_sempred((Ex_or_expContext)_localctx, predIndex);
- case 33: return in_or_exp_sempred((In_or_expContext)_localctx, predIndex);
+ case 36: return in_or_exp_sempred((In_or_expContext)_localctx, predIndex);
- case 34: return log_and_exp_sempred((Log_and_expContext)_localctx, predIndex);
+ case 37: return log_and_exp_sempred((Log_and_expContext)_localctx, predIndex);
- case 35: return log_or_exp_sempred((Log_or_expContext)_localctx, predIndex);
+ case 38: return log_or_exp_sempred((Log_or_expContext)_localctx, predIndex);
}
return true;
}
@@ -2905,135 +3131,148 @@ public class SerpentParser extends Parser {
}
public static final String _serializedATN =
- "\3\uacf5\uee8c\u4f5d\u8b0d\u4a45\u78bd\u1b2f\u3378\39\u0190\4\2\t\2\4"+
+ "\3\uacf5\uee8c\u4f5d\u8b0d\u4a45\u78bd\u1b2f\u3378\39\u01b4\4\2\t\2\4"+
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
- ",\t,\4-\t-\4.\t.\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"+
- "\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4u\n\4\f\4\16\4x\13\4\3\5"+
- "\3\5\3\5\3\5\3\5\3\6\7\6\u0080\n\6\f\6\16\6\u0083\13\6\3\7\3\7\3\7\3\7"+
- "\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\7\7\u0092\n\7\f\7\16\7\u0095\13\7"+
- "\3\7\3\7\3\7\3\7\3\7\5\7\u009c\n\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t"+
- "\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u00b2\n\t\3\n\3\n\3\13"+
- "\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\22\3\22"+
- "\3\23\3\23\3\24\3\24\3\25\3\25\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27"+
- "\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
- "\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33"+
- "\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35"+
- "\3\35\3\35\3\35\7\35\u0101\n\35\f\35\16\35\u0104\13\35\3\36\3\36\3\36"+
- "\3\36\3\36\3\36\7\36\u010c\n\36\f\36\16\36\u010f\13\36\3\37\3\37\3\37"+
- "\3\37\3\37\3\37\7\37\u0117\n\37\f\37\16\37\u011a\13\37\3 \3 \3 \3 \3 "+
- "\3 \7 \u0122\n \f \16 \u0125\13 \3!\3!\3!\3!\3!\3!\7!\u012d\n!\f!\16!"+
- "\u0130\13!\3\"\3\"\3\"\3\"\3\"\3\"\7\"\u0138\n\"\f\"\16\"\u013b\13\"\3"+
- "#\3#\3#\3#\3#\3#\7#\u0143\n#\f#\16#\u0146\13#\3$\3$\3$\3$\3$\3$\7$\u014e"+
- "\n$\f$\16$\u0151\13$\3%\3%\3%\3%\3%\3%\7%\u0159\n%\f%\16%\u015c\13%\3"+
- "&\3&\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\5(\u0173"+
- "\n(\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,"+
- "\3-\3-\3-\3.\3.\3.\2/\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,."+
- "\60\62\64\668:<>@BDFHJLNPRTVXZ\2\3\4\2%&\67\67\u018d\2\\\3\2\2\2\4_\3"+
- "\2\2\2\6v\3\2\2\2\by\3\2\2\2\n\u0081\3\2\2\2\f\u0084\3\2\2\2\16\u009d"+
- "\3\2\2\2\20\u00b1\3\2\2\2\22\u00b3\3\2\2\2\24\u00b5\3\2\2\2\26\u00b7\3"+
- "\2\2\2\30\u00b9\3\2\2\2\32\u00bb\3\2\2\2\34\u00bd\3\2\2\2\36\u00bf\3\2"+
- "\2\2 \u00c1\3\2\2\2\"\u00c3\3\2\2\2$\u00c5\3\2\2\2&\u00c7\3\2\2\2(\u00c9"+
- "\3\2\2\2*\u00cb\3\2\2\2,\u00cd\3\2\2\2.\u00da\3\2\2\2\60\u00e3\3\2\2\2"+
- "\62\u00e8\3\2\2\2\64\u00ed\3\2\2\2\66\u00f5\3\2\2\28\u00fa\3\2\2\2:\u0105"+
- "\3\2\2\2<\u0110\3\2\2\2>\u011b\3\2\2\2@\u0126\3\2\2\2B\u0131\3\2\2\2D"+
- "\u013c\3\2\2\2F\u0147\3\2\2\2H\u0152\3\2\2\2J\u015d\3\2\2\2L\u015f\3\2"+
- "\2\2N\u0172\3\2\2\2P\u0174\3\2\2\2R\u0176\3\2\2\2T\u017c\3\2\2\2V\u0184"+
- "\3\2\2\2X\u018a\3\2\2\2Z\u018d\3\2\2\2\\]\5\6\4\2]^\7\2\2\3^\3\3\2\2\2"+
- "_`\7\22\2\2`a\7\f\2\2ab\78\2\2bc\5\6\4\2cd\79\2\2de\7$\2\2ef\7\f\2\2f"+
- "g\78\2\2gh\5\6\4\2hi\79\2\2i\5\3\2\2\2ju\5\b\5\2ku\5\62\32\2lu\5\64\33"+
- "\2mu\5\20\t\2nu\5\f\7\2ou\5\16\b\2pu\5R*\2qu\5T+\2ru\5V,\2su\5X-\2tj\3"+
- "\2\2\2tk\3\2\2\2tl\3\2\2\2tm\3\2\2\2tn\3\2\2\2to\3\2\2\2tp\3\2\2\2tq\3"+
- "\2\2\2tr\3\2\2\2ts\3\2\2\2ux\3\2\2\2vt\3\2\2\2vw\3\2\2\2w\7\3\2\2\2xv"+
- "\3\2\2\2yz\7\20\2\2z{\5\n\6\2{|\7!\2\2|}\7,\2\2}\t\3\2\2\2~\u0080\t\2"+
- "\2\2\177~\3\2\2\2\u0080\u0083\3\2\2\2\u0081\177\3\2\2\2\u0081\u0082\3"+
- "\2\2\2\u0082\13\3\2\2\2\u0083\u0081\3\2\2\2\u0084\u0085\7\r\2\2\u0085"+
- "\u0086\5L\'\2\u0086\u0087\7\f\2\2\u0087\u0088\78\2\2\u0088\u0089\5\6\4"+
- "\2\u0089\u0093\79\2\2\u008a\u008b\7\35\2\2\u008b\u008c\5L\'\2\u008c\u008d"+
- "\7\f\2\2\u008d\u008e\78\2\2\u008e\u008f\5\6\4\2\u008f\u0090\79\2\2\u0090"+
- "\u0092\3\2\2\2\u0091\u008a\3\2\2\2\u0092\u0095\3\2\2\2\u0093\u0091\3\2"+
- "\2\2\u0093\u0094\3\2\2\2\u0094\u009b\3\2\2\2\u0095\u0093\3\2\2\2\u0096"+
- "\u0097\7\32\2\2\u0097\u0098\78\2\2\u0098\u0099\5\6\4\2\u0099\u009a\79"+
- "\2\2\u009a\u009c\3\2\2\2\u009b\u0096\3\2\2\2\u009b\u009c\3\2\2\2\u009c"+
- "\r\3\2\2\2\u009d\u009e\7\t\2\2\u009e\u009f\5L\'\2\u009f\u00a0\7\f\2\2"+
- "\u00a0\u00a1\78\2\2\u00a1\u00a2\5\6\4\2\u00a2\u00a3\79\2\2\u00a3\17\3"+
- "\2\2\2\u00a4\u00b2\5\22\n\2\u00a5\u00b2\5\24\13\2\u00a6\u00b2\5\26\f\2"+
- "\u00a7\u00b2\5\30\r\2\u00a8\u00b2\5\32\16\2\u00a9\u00b2\5\34\17\2\u00aa"+
- "\u00b2\5\36\20\2\u00ab\u00b2\5 \21\2\u00ac\u00b2\5\"\22\2\u00ad\u00b2"+
- "\5$\23\2\u00ae\u00b2\5&\24\2\u00af\u00b2\5(\25\2\u00b0\u00b2\5*\26\2\u00b1"+
- "\u00a4\3\2\2\2\u00b1\u00a5\3\2\2\2\u00b1\u00a6\3\2\2\2\u00b1\u00a7\3\2"+
- "\2\2\u00b1\u00a8\3\2\2\2\u00b1\u00a9\3\2\2\2\u00b1\u00aa\3\2\2\2\u00b1"+
- "\u00ab\3\2\2\2\u00b1\u00ac\3\2\2\2\u00b1\u00ad\3\2\2\2\u00b1\u00ae\3\2"+
- "\2\2\u00b1\u00af\3\2\2\2\u00b1\u00b0\3\2\2\2\u00b2\21\3\2\2\2\u00b3\u00b4"+
- "\7\27\2\2\u00b4\23\3\2\2\2\u00b5\u00b6\7\37\2\2\u00b6\25\3\2\2\2\u00b7"+
- "\u00b8\7\21\2\2\u00b8\27\3\2\2\2\u00b9\u00ba\7\31\2\2\u00ba\31\3\2\2\2"+
- "\u00bb\u00bc\7\33\2\2\u00bc\33\3\2\2\2\u00bd\u00be\7\b\2\2\u00be\35\3"+
- "\2\2\2\u00bf\u00c0\7 \2\2\u00c0\37\3\2\2\2\u00c1\u00c2\7\23\2\2\u00c2"+
- "!\3\2\2\2\u00c3\u00c4\7\5\2\2\u00c4#\3\2\2\2\u00c5\u00c6\7\17\2\2\u00c6"+
- "%\3\2\2\2\u00c7\u00c8\7#\2\2\u00c8\'\3\2\2\2\u00c9\u00ca\7\26\2\2\u00ca"+
- ")\3\2\2\2\u00cb\u00cc\7\"\2\2\u00cc+\3\2\2\2\u00cd\u00ce\7\7\2\2\u00ce"+
- "\u00cf\7\13\2\2\u00cf\u00d0\5N(\2\u00d0\u00d1\7\6\2\2\u00d1\u00d2\5N("+
- "\2\u00d2\u00d3\7\6\2\2\u00d3\u00d4\5N(\2\u00d4\u00d5\7\6\2\2\u00d5\u00d6"+
- "\5N(\2\u00d6\u00d7\7\6\2\2\u00d7\u00d8\5N(\2\u00d8\u00d9\7\30\2\2\u00d9"+
- "-\3\2\2\2\u00da\u00db\7\16\2\2\u00db\u00dc\7\13\2\2\u00dc\u00dd\5N(\2"+
- "\u00dd\u00de\7\6\2\2\u00de\u00df\5N(\2\u00df\u00e0\7\6\2\2\u00e0\u00e1"+
- "\5N(\2\u00e1\u00e2\7\30\2\2\u00e2/\3\2\2\2\u00e3\u00e4\7\34\2\2\u00e4"+
- "\u00e5\7\n\2\2\u00e5\u00e6\5J&\2\u00e6\u00e7\7\3\2\2\u00e7\61\3\2\2\2"+
- "\u00e8\u00e9\7/\2\2\u00e9\u00ea\7+\2\2\u00ea\u00eb\5J&\2\u00eb\u00ec\7"+
- ",\2\2\u00ec\63\3\2\2\2\u00ed\u00ee\7\24\2\2\u00ee\u00ef\7\n\2\2\u00ef"+
- "\u00f0\5J&\2\u00f0\u00f1\7\3\2\2\u00f1\u00f2\7+\2\2\u00f2\u00f3\5J&\2"+
- "\u00f3\u00f4\7,\2\2\u00f4\65\3\2\2\2\u00f5\u00f6\7\24\2\2\u00f6\u00f7"+
- "\7\n\2\2\u00f7\u00f8\5J&\2\u00f8\u00f9\7\3\2\2\u00f9\67\3\2\2\2\u00fa"+
- "\u00fb\b\35\1\2\u00fb\u00fc\5N(\2\u00fc\u0102\3\2\2\2\u00fd\u00fe\6\35"+
- "\2\3\u00fe\u00ff\7\61\2\2\u00ff\u0101\5N(\2\u0100\u00fd\3\2\2\2\u0101"+
- "\u0104\3\2\2\2\u0102\u0100\3\2\2\2\u0102\u0103\3\2\2\2\u01039\3\2\2\2"+
- "\u0104\u0102\3\2\2\2\u0105\u0106\b\36\1\2\u0106\u0107\58\35\2\u0107\u010d"+
- "\3\2\2\2\u0108\u0109\6\36\3\3\u0109\u010a\7\60\2\2\u010a\u010c\58\35\2"+
- "\u010b\u0108\3\2\2\2\u010c\u010f\3\2\2\2\u010d\u010b\3\2\2\2\u010d\u010e"+
- "\3\2\2\2\u010e;\3\2\2\2\u010f\u010d\3\2\2\2\u0110\u0111\b\37\1\2\u0111"+
- "\u0112\5:\36\2\u0112\u0118\3\2\2\2\u0113\u0114\6\37\4\3\u0114\u0115\7"+
- "\62\2\2\u0115\u0117\5:\36\2\u0116\u0113\3\2\2\2\u0117\u011a\3\2\2\2\u0118"+
- "\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119=\3\2\2\2\u011a\u0118\3\2\2\2"+
- "\u011b\u011c\b \1\2\u011c\u011d\5<\37\2\u011d\u0123\3\2\2\2\u011e\u011f"+
- "\6 \5\3\u011f\u0120\7\63\2\2\u0120\u0122\5<\37\2\u0121\u011e\3\2\2\2\u0122"+
- "\u0125\3\2\2\2\u0123\u0121\3\2\2\2\u0123\u0124\3\2\2\2\u0124?\3\2\2\2"+
- "\u0125\u0123\3\2\2\2\u0126\u0127\b!\1\2\u0127\u0128\5> \2\u0128\u012e"+
- "\3\2\2\2\u0129\u012a\6!\6\3\u012a\u012b\7\64\2\2\u012b\u012d\5> \2\u012c"+
- "\u0129\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012c\3\2\2\2\u012e\u012f\3\2"+
- "\2\2\u012fA\3\2\2\2\u0130\u012e\3\2\2\2\u0131\u0132\b\"\1\2\u0132\u0133"+
- "\5@!\2\u0133\u0139\3\2\2\2\u0134\u0135\6\"\7\3\u0135\u0136\7\'\2\2\u0136"+
- "\u0138\5@!\2\u0137\u0134\3\2\2\2\u0138\u013b\3\2\2\2\u0139\u0137\3\2\2"+
- "\2\u0139\u013a\3\2\2\2\u013aC\3\2\2\2\u013b\u0139\3\2\2\2\u013c\u013d"+
- "\b#\1\2\u013d\u013e\5B\"\2\u013e\u0144\3\2\2\2\u013f\u0140\6#\b\3\u0140"+
- "\u0141\7\65\2\2\u0141\u0143\5B\"\2\u0142\u013f\3\2\2\2\u0143\u0146\3\2"+
- "\2\2\u0144\u0142\3\2\2\2\u0144\u0145\3\2\2\2\u0145E\3\2\2\2\u0146\u0144"+
- "\3\2\2\2\u0147\u0148\b$\1\2\u0148\u0149\5D#\2\u0149\u014f\3\2\2\2\u014a"+
- "\u014b\6$\t\3\u014b\u014c\7(\2\2\u014c\u014e\5D#\2\u014d\u014a\3\2\2\2"+
- "\u014e\u0151\3\2\2\2\u014f\u014d\3\2\2\2\u014f\u0150\3\2\2\2\u0150G\3"+
- "\2\2\2\u0151\u014f\3\2\2\2\u0152\u0153\b%\1\2\u0153\u0154\5F$\2\u0154"+
- "\u015a\3\2\2\2\u0155\u0156\6%\n\3\u0156\u0157\7)\2\2\u0157\u0159\5F$\2"+
- "\u0158\u0155\3\2\2\2\u0159\u015c\3\2\2\2\u015a\u0158\3\2\2\2\u015a\u015b"+
- "\3\2\2\2\u015bI\3\2\2\2\u015c\u015a\3\2\2\2\u015d\u015e\5H%\2\u015eK\3"+
- "\2\2\2\u015f\u0160\5J&\2\u0160M\3\2\2\2\u0161\u0173\7%\2\2\u0162\u0173"+
- "\5P)\2\u0163\u0173\5Z.\2\u0164\u0173\5\20\t\2\u0165\u0166\7\13\2\2\u0166"+
- "\u0167\5J&\2\u0167\u0168\7\30\2\2\u0168\u0173\3\2\2\2\u0169\u016a\7*\2"+
- "\2\u016a\u016b\7\13\2\2\u016b\u016c\5J&\2\u016c\u016d\7\30\2\2\u016d\u0173"+
- "\3\2\2\2\u016e\u0173\5,\27\2\u016f\u0173\5\60\31\2\u0170\u0173\5.\30\2"+
- "\u0171\u0173\5\66\34\2\u0172\u0161\3\2\2\2\u0172\u0162\3\2\2\2\u0172\u0163"+
- "\3\2\2\2\u0172\u0164\3\2\2\2\u0172\u0165\3\2\2\2\u0172\u0169\3\2\2\2\u0172"+
- "\u016e\3\2\2\2\u0172\u016f\3\2\2\2\u0172\u0170\3\2\2\2\u0172\u0171\3\2"+
- "\2\2\u0173O\3\2\2\2\u0174\u0175\7\67\2\2\u0175Q\3\2\2\2\u0176\u0177\7"+
- "\36\2\2\u0177\u0178\7\13\2\2\u0178\u0179\5J&\2\u0179\u017a\7\30\2\2\u017a"+
- "\u017b\7,\2\2\u017bS\3\2\2\2\u017c\u017d\7\36\2\2\u017d\u017e\7\13\2\2"+
- "\u017e\u017f\5J&\2\u017f\u0180\7\6\2\2\u0180\u0181\5J&\2\u0181\u0182\7"+
- "\30\2\2\u0182\u0183\7,\2\2\u0183U\3\2\2\2\u0184\u0185\7\25\2\2\u0185\u0186"+
- "\7\13\2\2\u0186\u0187\5J&\2\u0187\u0188\7\30\2\2\u0188\u0189\7,\2\2\u0189"+
- "W\3\2\2\2\u018a\u018b\7\4\2\2\u018b\u018c\7,\2\2\u018cY\3\2\2\2\u018d"+
- "\u018e\7/\2\2\u018e[\3\2\2\2\22tv\u0081\u0093\u009b\u00b1\u0102\u010d"+
- "\u0118\u0123\u012e\u0139\u0144\u014f\u015a\u0172";
+ ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\3\2\3\2\3\2\3\3\3\3\3\3\3\3"+
+ "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3"+
+ "\4\7\4|\n\4\f\4\16\4\177\13\4\3\5\3\5\3\5\3\5\3\5\3\6\7\6\u0087\n\6\f"+
+ "\6\16\6\u008a\13\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+
+ "\7\7\u0099\n\7\f\7\16\7\u009c\13\7\3\7\3\7\3\7\3\7\3\7\5\7\u00a3\n\7\3"+
+ "\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t"+
+ "\3\t\3\t\5\t\u00b9\n\t\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17"+
+ "\3\17\3\20\3\20\3\21\3\21\3\22\3\22\3\23\3\23\3\24\3\24\3\25\3\25\3\26"+
+ "\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27"+
+ "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+
+ "\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34"+
+ "\3\34\3\34\3\34\5\34\u0101\n\34\3\34\3\34\3\35\3\35\3\35\5\35\u0108\n"+
+ "\35\7\35\u010a\n\35\f\35\16\35\u010d\13\35\3\35\3\35\3\36\3\36\3\36\3"+
+ "\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \7 "+
+ "\u0124\n \f \16 \u0127\13 \3!\3!\3!\3!\3!\3!\7!\u012f\n!\f!\16!\u0132"+
+ "\13!\3\"\3\"\3\"\3\"\3\"\3\"\7\"\u013a\n\"\f\"\16\"\u013d\13\"\3#\3#\3"+
+ "#\3#\3#\3#\7#\u0145\n#\f#\16#\u0148\13#\3$\3$\3$\3$\3$\3$\7$\u0150\n$"+
+ "\f$\16$\u0153\13$\3%\3%\3%\3%\3%\3%\7%\u015b\n%\f%\16%\u015e\13%\3&\3"+
+ "&\3&\3&\3&\3&\7&\u0166\n&\f&\16&\u0169\13&\3\'\3\'\3\'\3\'\3\'\3\'\7\'"+
+ "\u0171\n\'\f\'\16\'\u0174\13\'\3(\3(\3(\3(\3(\3(\7(\u017c\n(\f(\16(\u017f"+
+ "\13(\3)\3)\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3"+
+ "+\5+\u0197\n+\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3.\3/\3/\3"+
+ "/\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\2\62\2\4\6\b\n\f\16\20\22\24"+
+ "\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`\2\3\4\2%&\67"+
+ "\67\u01b3\2b\3\2\2\2\4e\3\2\2\2\6}\3\2\2\2\b\u0080\3\2\2\2\n\u0088\3\2"+
+ "\2\2\f\u008b\3\2\2\2\16\u00a4\3\2\2\2\20\u00b8\3\2\2\2\22\u00ba\3\2\2"+
+ "\2\24\u00bc\3\2\2\2\26\u00be\3\2\2\2\30\u00c0\3\2\2\2\32\u00c2\3\2\2\2"+
+ "\34\u00c4\3\2\2\2\36\u00c6\3\2\2\2 \u00c8\3\2\2\2\"\u00ca\3\2\2\2$\u00cc"+
+ "\3\2\2\2&\u00ce\3\2\2\2(\u00d0\3\2\2\2*\u00d2\3\2\2\2,\u00d4\3\2\2\2."+
+ "\u00e1\3\2\2\2\60\u00ea\3\2\2\2\62\u00ef\3\2\2\2\64\u00f7\3\2\2\2\66\u00fc"+
+ "\3\2\2\28\u0104\3\2\2\2:\u0110\3\2\2\2<\u0118\3\2\2\2>\u011d\3\2\2\2@"+
+ "\u0128\3\2\2\2B\u0133\3\2\2\2D\u013e\3\2\2\2F\u0149\3\2\2\2H\u0154\3\2"+
+ "\2\2J\u015f\3\2\2\2L\u016a\3\2\2\2N\u0175\3\2\2\2P\u0180\3\2\2\2R\u0182"+
+ "\3\2\2\2T\u0196\3\2\2\2V\u0198\3\2\2\2X\u019a\3\2\2\2Z\u01a0\3\2\2\2\\"+
+ "\u01a8\3\2\2\2^\u01ae\3\2\2\2`\u01b1\3\2\2\2bc\5\6\4\2cd\7\2\2\3d\3\3"+
+ "\2\2\2ef\7\22\2\2fg\7\f\2\2gh\78\2\2hi\5\6\4\2ij\79\2\2jk\7$\2\2kl\7\f"+
+ "\2\2lm\78\2\2mn\5\6\4\2no\79\2\2o\5\3\2\2\2p|\5\b\5\2q|\5\62\32\2r|\5"+
+ "\66\34\2s|\5:\36\2t|\5\20\t\2u|\5\f\7\2v|\5\16\b\2w|\5X-\2x|\5Z.\2y|\5"+
+ "\\/\2z|\5^\60\2{p\3\2\2\2{q\3\2\2\2{r\3\2\2\2{s\3\2\2\2{t\3\2\2\2{u\3"+
+ "\2\2\2{v\3\2\2\2{w\3\2\2\2{x\3\2\2\2{y\3\2\2\2{z\3\2\2\2|\177\3\2\2\2"+
+ "}{\3\2\2\2}~\3\2\2\2~\7\3\2\2\2\177}\3\2\2\2\u0080\u0081\7\20\2\2\u0081"+
+ "\u0082\5\n\6\2\u0082\u0083\7!\2\2\u0083\u0084\7,\2\2\u0084\t\3\2\2\2\u0085"+
+ "\u0087\t\2\2\2\u0086\u0085\3\2\2\2\u0087\u008a\3\2\2\2\u0088\u0086\3\2"+
+ "\2\2\u0088\u0089\3\2\2\2\u0089\13\3\2\2\2\u008a\u0088\3\2\2\2\u008b\u008c"+
+ "\7\r\2\2\u008c\u008d\5R*\2\u008d\u008e\7\f\2\2\u008e\u008f\78\2\2\u008f"+
+ "\u0090\5\6\4\2\u0090\u009a\79\2\2\u0091\u0092\7\35\2\2\u0092\u0093\5R"+
+ "*\2\u0093\u0094\7\f\2\2\u0094\u0095\78\2\2\u0095\u0096\5\6\4\2\u0096\u0097"+
+ "\79\2\2\u0097\u0099\3\2\2\2\u0098\u0091\3\2\2\2\u0099\u009c\3\2\2\2\u009a"+
+ "\u0098\3\2\2\2\u009a\u009b\3\2\2\2\u009b\u00a2\3\2\2\2\u009c\u009a\3\2"+
+ "\2\2\u009d\u009e\7\32\2\2\u009e\u009f\78\2\2\u009f\u00a0\5\6\4\2\u00a0"+
+ "\u00a1\79\2\2\u00a1\u00a3\3\2\2\2\u00a2\u009d\3\2\2\2\u00a2\u00a3\3\2"+
+ "\2\2\u00a3\r\3\2\2\2\u00a4\u00a5\7\t\2\2\u00a5\u00a6\5R*\2\u00a6\u00a7"+
+ "\7\f\2\2\u00a7\u00a8\78\2\2\u00a8\u00a9\5\6\4\2\u00a9\u00aa\79\2\2\u00aa"+
+ "\17\3\2\2\2\u00ab\u00b9\5\22\n\2\u00ac\u00b9\5\24\13\2\u00ad\u00b9\5\26"+
+ "\f\2\u00ae\u00b9\5\30\r\2\u00af\u00b9\5\32\16\2\u00b0\u00b9\5\34\17\2"+
+ "\u00b1\u00b9\5\36\20\2\u00b2\u00b9\5 \21\2\u00b3\u00b9\5\"\22\2\u00b4"+
+ "\u00b9\5$\23\2\u00b5\u00b9\5&\24\2\u00b6\u00b9\5(\25\2\u00b7\u00b9\5*"+
+ "\26\2\u00b8\u00ab\3\2\2\2\u00b8\u00ac\3\2\2\2\u00b8\u00ad\3\2\2\2\u00b8"+
+ "\u00ae\3\2\2\2\u00b8\u00af\3\2\2\2\u00b8\u00b0\3\2\2\2\u00b8\u00b1\3\2"+
+ "\2\2\u00b8\u00b2\3\2\2\2\u00b8\u00b3\3\2\2\2\u00b8\u00b4\3\2\2\2\u00b8"+
+ "\u00b5\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b8\u00b7\3\2\2\2\u00b9\21\3\2\2"+
+ "\2\u00ba\u00bb\7\27\2\2\u00bb\23\3\2\2\2\u00bc\u00bd\7\37\2\2\u00bd\25"+
+ "\3\2\2\2\u00be\u00bf\7\21\2\2\u00bf\27\3\2\2\2\u00c0\u00c1\7\31\2\2\u00c1"+
+ "\31\3\2\2\2\u00c2\u00c3\7\33\2\2\u00c3\33\3\2\2\2\u00c4\u00c5\7\b\2\2"+
+ "\u00c5\35\3\2\2\2\u00c6\u00c7\7 \2\2\u00c7\37\3\2\2\2\u00c8\u00c9\7\23"+
+ "\2\2\u00c9!\3\2\2\2\u00ca\u00cb\7\5\2\2\u00cb#\3\2\2\2\u00cc\u00cd\7\17"+
+ "\2\2\u00cd%\3\2\2\2\u00ce\u00cf\7#\2\2\u00cf\'\3\2\2\2\u00d0\u00d1\7\26"+
+ "\2\2\u00d1)\3\2\2\2\u00d2\u00d3\7\"\2\2\u00d3+\3\2\2\2\u00d4\u00d5\7\7"+
+ "\2\2\u00d5\u00d6\7\13\2\2\u00d6\u00d7\5T+\2\u00d7\u00d8\7\6\2\2\u00d8"+
+ "\u00d9\5T+\2\u00d9\u00da\7\6\2\2\u00da\u00db\5T+\2\u00db\u00dc\7\6\2\2"+
+ "\u00dc\u00dd\5T+\2\u00dd\u00de\7\6\2\2\u00de\u00df\5T+\2\u00df\u00e0\7"+
+ "\30\2\2\u00e0-\3\2\2\2\u00e1\u00e2\7\16\2\2\u00e2\u00e3\7\13\2\2\u00e3"+
+ "\u00e4\5T+\2\u00e4\u00e5\7\6\2\2\u00e5\u00e6\5T+\2\u00e6\u00e7\7\6\2\2"+
+ "\u00e7\u00e8\5T+\2\u00e8\u00e9\7\30\2\2\u00e9/\3\2\2\2\u00ea\u00eb\7\34"+
+ "\2\2\u00eb\u00ec\7\n\2\2\u00ec\u00ed\5P)\2\u00ed\u00ee\7\3\2\2\u00ee\61"+
+ "\3\2\2\2\u00ef\u00f0\7/\2\2\u00f0\u00f1\7\n\2\2\u00f1\u00f2\5T+\2\u00f2"+
+ "\u00f3\7\3\2\2\u00f3\u00f4\7+\2\2\u00f4\u00f5\5P)\2\u00f5\u00f6\7,\2\2"+
+ "\u00f6\63\3\2\2\2\u00f7\u00f8\7/\2\2\u00f8\u00f9\7\n\2\2\u00f9\u00fa\5"+
+ "T+\2\u00fa\u00fb\7\3\2\2\u00fb\65\3\2\2\2\u00fc\u00fd\7/\2\2\u00fd\u0100"+
+ "\7+\2\2\u00fe\u0101\5P)\2\u00ff\u0101\58\35\2\u0100\u00fe\3\2\2\2\u0100"+
+ "\u00ff\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0103\7,\2\2\u0103\67\3\2\2\2"+
+ "\u0104\u010b\7\n\2\2\u0105\u0107\5T+\2\u0106\u0108\7\6\2\2\u0107\u0106"+
+ "\3\2\2\2\u0107\u0108\3\2\2\2\u0108\u010a\3\2\2\2\u0109\u0105\3\2\2\2\u010a"+
+ "\u010d\3\2\2\2\u010b\u0109\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010e\3\2"+
+ "\2\2\u010d\u010b\3\2\2\2\u010e\u010f\7\3\2\2\u010f9\3\2\2\2\u0110\u0111"+
+ "\7\24\2\2\u0111\u0112\7\n\2\2\u0112\u0113\5P)\2\u0113\u0114\7\3\2\2\u0114"+
+ "\u0115\7+\2\2\u0115\u0116\5P)\2\u0116\u0117\7,\2\2\u0117;\3\2\2\2\u0118"+
+ "\u0119\7\24\2\2\u0119\u011a\7\n\2\2\u011a\u011b\5P)\2\u011b\u011c\7\3"+
+ "\2\2\u011c=\3\2\2\2\u011d\u011e\b \1\2\u011e\u011f\5T+\2\u011f\u0125\3"+
+ "\2\2\2\u0120\u0121\6 \2\3\u0121\u0122\7\61\2\2\u0122\u0124\5T+\2\u0123"+
+ "\u0120\3\2\2\2\u0124\u0127\3\2\2\2\u0125\u0123\3\2\2\2\u0125\u0126\3\2"+
+ "\2\2\u0126?\3\2\2\2\u0127\u0125\3\2\2\2\u0128\u0129\b!\1\2\u0129\u012a"+
+ "\5> \2\u012a\u0130\3\2\2\2\u012b\u012c\6!\3\3\u012c\u012d\7\60\2\2\u012d"+
+ "\u012f\5> \2\u012e\u012b\3\2\2\2\u012f\u0132\3\2\2\2\u0130\u012e\3\2\2"+
+ "\2\u0130\u0131\3\2\2\2\u0131A\3\2\2\2\u0132\u0130\3\2\2\2\u0133\u0134"+
+ "\b\"\1\2\u0134\u0135\5@!\2\u0135\u013b\3\2\2\2\u0136\u0137\6\"\4\3\u0137"+
+ "\u0138\7\62\2\2\u0138\u013a\5@!\2\u0139\u0136\3\2\2\2\u013a\u013d\3\2"+
+ "\2\2\u013b\u0139\3\2\2\2\u013b\u013c\3\2\2\2\u013cC\3\2\2\2\u013d\u013b"+
+ "\3\2\2\2\u013e\u013f\b#\1\2\u013f\u0140\5B\"\2\u0140\u0146\3\2\2\2\u0141"+
+ "\u0142\6#\5\3\u0142\u0143\7\63\2\2\u0143\u0145\5B\"\2\u0144\u0141\3\2"+
+ "\2\2\u0145\u0148\3\2\2\2\u0146\u0144\3\2\2\2\u0146\u0147\3\2\2\2\u0147"+
+ "E\3\2\2\2\u0148\u0146\3\2\2\2\u0149\u014a\b$\1\2\u014a\u014b\5D#\2\u014b"+
+ "\u0151\3\2\2\2\u014c\u014d\6$\6\3\u014d\u014e\7\64\2\2\u014e\u0150\5D"+
+ "#\2\u014f\u014c\3\2\2\2\u0150\u0153\3\2\2\2\u0151\u014f\3\2\2\2\u0151"+
+ "\u0152\3\2\2\2\u0152G\3\2\2\2\u0153\u0151\3\2\2\2\u0154\u0155\b%\1\2\u0155"+
+ "\u0156\5F$\2\u0156\u015c\3\2\2\2\u0157\u0158\6%\7\3\u0158\u0159\7\'\2"+
+ "\2\u0159\u015b\5F$\2\u015a\u0157\3\2\2\2\u015b\u015e\3\2\2\2\u015c\u015a"+
+ "\3\2\2\2\u015c\u015d\3\2\2\2\u015dI\3\2\2\2\u015e\u015c\3\2\2\2\u015f"+
+ "\u0160\b&\1\2\u0160\u0161\5H%\2\u0161\u0167\3\2\2\2\u0162\u0163\6&\b\3"+
+ "\u0163\u0164\7\65\2\2\u0164\u0166\5H%\2\u0165\u0162\3\2\2\2\u0166\u0169"+
+ "\3\2\2\2\u0167\u0165\3\2\2\2\u0167\u0168\3\2\2\2\u0168K\3\2\2\2\u0169"+
+ "\u0167\3\2\2\2\u016a\u016b\b\'\1\2\u016b\u016c\5J&\2\u016c\u0172\3\2\2"+
+ "\2\u016d\u016e\6\'\t\3\u016e\u016f\7(\2\2\u016f\u0171\5J&\2\u0170\u016d"+
+ "\3\2\2\2\u0171\u0174\3\2\2\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173"+
+ "M\3\2\2\2\u0174\u0172\3\2\2\2\u0175\u0176\b(\1\2\u0176\u0177\5L\'\2\u0177"+
+ "\u017d\3\2\2\2\u0178\u0179\6(\n\3\u0179\u017a\7)\2\2\u017a\u017c\5L\'"+
+ "\2\u017b\u0178\3\2\2\2\u017c\u017f\3\2\2\2\u017d\u017b\3\2\2\2\u017d\u017e"+
+ "\3\2\2\2\u017eO\3\2\2\2\u017f\u017d\3\2\2\2\u0180\u0181\5N(\2\u0181Q\3"+
+ "\2\2\2\u0182\u0183\5P)\2\u0183S\3\2\2\2\u0184\u0197\7%\2\2\u0185\u0197"+
+ "\5V,\2\u0186\u0197\5`\61\2\u0187\u0197\5\20\t\2\u0188\u0189\7\13\2\2\u0189"+
+ "\u018a\5P)\2\u018a\u018b\7\30\2\2\u018b\u0197\3\2\2\2\u018c\u018d\7*\2"+
+ "\2\u018d\u018e\7\13\2\2\u018e\u018f\5P)\2\u018f\u0190\7\30\2\2\u0190\u0197"+
+ "\3\2\2\2\u0191\u0197\5,\27\2\u0192\u0197\5\60\31\2\u0193\u0197\5.\30\2"+
+ "\u0194\u0197\5<\37\2\u0195\u0197\5\64\33\2\u0196\u0184\3\2\2\2\u0196\u0185"+
+ "\3\2\2\2\u0196\u0186\3\2\2\2\u0196\u0187\3\2\2\2\u0196\u0188\3\2\2\2\u0196"+
+ "\u018c\3\2\2\2\u0196\u0191\3\2\2\2\u0196\u0192\3\2\2\2\u0196\u0193\3\2"+
+ "\2\2\u0196\u0194\3\2\2\2\u0196\u0195\3\2\2\2\u0197U\3\2\2\2\u0198\u0199"+
+ "\7\67\2\2\u0199W\3\2\2\2\u019a\u019b\7\36\2\2\u019b\u019c\7\13\2\2\u019c"+
+ "\u019d\5P)\2\u019d\u019e\7\30\2\2\u019e\u019f\7,\2\2\u019fY\3\2\2\2\u01a0"+
+ "\u01a1\7\36\2\2\u01a1\u01a2\7\13\2\2\u01a2\u01a3\5P)\2\u01a3\u01a4\7\6"+
+ "\2\2\u01a4\u01a5\5P)\2\u01a5\u01a6\7\30\2\2\u01a6\u01a7\7,\2\2\u01a7["+
+ "\3\2\2\2\u01a8\u01a9\7\25\2\2\u01a9\u01aa\7\13\2\2\u01aa\u01ab\5P)\2\u01ab"+
+ "\u01ac\7\30\2\2\u01ac\u01ad\7,\2\2\u01ad]\3\2\2\2\u01ae\u01af\7\4\2\2"+
+ "\u01af\u01b0\7,\2\2\u01b0_\3\2\2\2\u01b1\u01b2\7/\2\2\u01b2a\3\2\2\2\25"+
+ "{}\u0088\u009a\u00a2\u00b8\u0100\u0107\u010b\u0125\u0130\u013b\u0146\u0151"+
+ "\u015c\u0167\u0172\u017d\u0196";
public static final ATN _ATN =
ATNSimulator.deserialize(_serializedATN.toCharArray());
static {
diff --git a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentToAssemblyCompiler.java b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentToAssemblyCompiler.java
index 23d49d86..7aa66be8 100644
--- a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentToAssemblyCompiler.java
+++ b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentToAssemblyCompiler.java
@@ -5,6 +5,9 @@ import org.spongycastle.util.encoders.Hex;
import java.math.BigInteger;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
@@ -15,35 +18,68 @@ import java.util.regex.Pattern;
public class SerpentToAssemblyCompiler extends SerpentBaseVisitor {
int labelIndex = 0;
- private ArrayList vars = new ArrayList();
+ private ArrayList vars = new ArrayList();
+
+ private HashMap arraysSize = new HashMap();
+ private List arraysIndex = new ArrayList();
@Override
public String visitParse(@NotNull SerpentParser.ParseContext ctx) {
- StringBuffer result = new StringBuffer();
+ String codeBlock = visit(ctx.block());
+ int memSize = vars.size() * 32 - ( vars.size() > 0 ? 1 : 0);
- result.append( super.visitParse(ctx) );
+ String initMemCodeBlock = "";
+ if ( ! arraysSize.isEmpty() && vars.size() > 0)
+ initMemCodeBlock = String.format(" 0 %d MSTORE8 ", memSize);
- // todo: calc the wrapping with memory usage data
+ if (memSize == 0)
+ codeBlock= codeBlock.replace("@vars_table@", "0");
+ else
+ codeBlock= codeBlock.replace("@vars_table@", memSize + 1 + "");
- return result.toString();
+ return initMemCodeBlock + codeBlock;
}
@Override
public String visitParse_init_code_block(@NotNull SerpentParser.Parse_init_code_blockContext ctx) {
String initBlock = visit(ctx.block(0));
- String codeBlock = visit(ctx.block(1));
+ int memSize = vars.size() * 32 - ( vars.size() > 0 ? 1 : 0);
- return String.format(" [init %s init] [code %s code] ", initBlock, codeBlock);
+ String initMemInitBlock = "";
+ if ( ! arraysSize.isEmpty() && vars.size() > 0)
+ initMemInitBlock = String.format(" 0 %d MSTORE8 ", memSize);
+
+ if (memSize == 0)
+ initBlock= initBlock.replace("@vars_table@", "0");
+ else
+ initBlock= initBlock.replace("@vars_table@", memSize + 1 + "");
+
+
+ vars.clear();
+ String codeBlock = visit(ctx.block(1));
+ memSize = vars.size() * 32 - ( vars.size() > 0 ? 1 : 0);
+
+ if (memSize == 0)
+ codeBlock= codeBlock.replace("@vars_table@", "0");
+ else
+ codeBlock= codeBlock.replace("@vars_table@", memSize + 1 + "");
+
+
+ String initMemCodeBlock = "";
+ if ( ! arraysSize.isEmpty() && vars.size() > 0)
+ initMemCodeBlock = String.format(" 0 %d MSTORE8 ", memSize);
+
+ return String.format(" [init %s %s init] [code %s %s code] ", initMemInitBlock, initBlock,
+ initMemCodeBlock, codeBlock);
}
@Override
public String visitIf_elif_else_stmt(@NotNull SerpentParser.If_elif_else_stmtContext ctx) {
- //todo: when you find some error throw expectation exception
StringBuffer retCode = new StringBuffer();
int endOfStmtLabel = labelIndex++ ;
@@ -164,15 +200,29 @@ public class SerpentToAssemblyCompiler extends SerpentBaseVisitor {
String varName = ctx.VAR().toString();
int addr = 0;
- addr = vars.indexOf(varName);
- if (addr == -1){
- addr = vars.size();
- vars.add(varName);
+ if (ctx.arr_def() != null){
+ // if it's an array the all management is different
+ String arrayCode = visitArr_def(ctx.arr_def());
+
+ // calc the pointer addr
+ int pos = getArraySize(arrayCode);
+ arraysSize.put(varName, pos);
+ arraysIndex.add(varName);
+
+ return arrayCode;
+ } else{
+
+ // if it's an array the all management is different
+ String expression = visitExpression(ctx.expression());
+ addr = vars.indexOf(varName);
+ if (addr == -1){
+ addr = vars.size();
+ vars.add(varName);
+ }
+
+ return String.format(" %s %d MSTORE ", expression, addr * 32);
}
- String expression = visitExpression(ctx.expression());
-
- return String.format(" %s %d MSTORE ", expression, addr * 32);
}
@Override
@@ -223,9 +273,69 @@ public class SerpentToAssemblyCompiler extends SerpentBaseVisitor {
if (ctx.send_func() != null)
return visitSend_func(ctx.send_func());
+ if (ctx.array_retreive() != null)
+ return visitArray_retreive(ctx.array_retreive());
+
return ctx.INT().toString();
}
+ @Override
+ public String visitArr_def(@NotNull SerpentParser.Arr_defContext ctx) {
+
+ List numElements = ctx.int_val();
+ int arraySize = numElements.size() * 32 + 32;
+
+ StringBuffer arrayInit = new StringBuffer();
+ int i = 32;
+ for (SerpentParser.Int_valContext int_val : ctx.int_val()){
+
+ arrayInit.append(String.format(" DUP %d ADD %s SWAP MSTORE ", i, visit(int_val)));
+ i += 32;
+ }
+
+ return String.format(" MEMSIZE %s %d SWAP MSTORE ", arrayInit, arraySize);
+ }
+
+ @Override
+ public String visitArray_assign(@NotNull SerpentParser.Array_assignContext ctx) {
+
+ int order = this.arraysIndex.indexOf( ctx.VAR().toString());
+ if (order == -1){
+ throw new Error("array with that name was not defined");
+ }
+
+ //calcAllocatedBefore();
+ int allocSize = 0;
+ for (int i = 0; i < order; ++i ){
+ String var = arraysIndex.get(i);
+ allocSize += arraysSize.get(var);
+ }
+
+ String index = visit(ctx.int_val());
+ String assignValue = visit(ctx.expression());
+
+ return String.format(" %s 32 %s MUL 32 ADD %d ADD @vars_table@ ADD MSTORE ", assignValue, index, allocSize);
+ }
+
+
+ @Override
+ public String visitArray_retreive(@NotNull SerpentParser.Array_retreiveContext ctx) {
+
+ int order = this.arraysIndex.indexOf( ctx.VAR().toString());
+ if (order == -1){
+ throw new Error("array with that name was not defined");
+ }
+
+ int allocSize = 0;
+ for (int i = 0; i < order; ++i ){
+ String var = arraysIndex.get(i);
+ allocSize += arraysSize.get(var);
+ }
+
+ String index = visit(ctx.int_val());
+
+ return String.format(" 32 %s MUL %d ADD @vars_table@ ADD MLOAD ", index, allocSize );
+ }
@Override
public String visitMul_expr(@NotNull SerpentParser.Mul_exprContext ctx) {
@@ -264,8 +374,8 @@ public class SerpentToAssemblyCompiler extends SerpentBaseVisitor {
if (ctx.rel_exp() == null) return visit(ctx.add_expr());
- String operand0 = visit(ctx.add_expr());
- String operand1 = visit(ctx.rel_exp());
+ String operand0 = visit(ctx.rel_exp());
+ String operand1 = visit(ctx.add_expr());
switch (ctx.OP_REL().getText().toLowerCase()) {
case "<": return operand1 + " " + operand0 + " LT";
@@ -490,7 +600,7 @@ public class SerpentToAssemblyCompiler extends SerpentBaseVisitor {
String operand2 = visit(ctx.int_val(2));
// OUTDATASIZE OUTDATASTART INDATASIZE INDATASTART VALUE TO GAS CALL
- return String.format("0 0 0 0 %s %s %s CALL ", operand1, operand0, operand2);
+ return String.format("0 0 0 0 %s %s %s CALL ", operand1, operand0, operand2);
}
@Override
@@ -564,4 +674,19 @@ public class SerpentToAssemblyCompiler extends SerpentBaseVisitor {
}
}
+
+ private Integer getArraySize(String code){
+
+ String result = "0";
+ Pattern pattern = Pattern.compile(" [0-9]* SWAP MSTORE$");
+ Matcher matcher = pattern.matcher(code.trim());
+ if (matcher.find()) {
+
+ String group = matcher.group(0);
+ result = group.replace("SWAP MSTORE", "").trim();
+ }
+
+ return Integer.parseInt(result);
+ }
+
}
diff --git a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentVisitor.java b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentVisitor.java
index 990612c4..cd1ed97d 100644
--- a/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentVisitor.java
+++ b/ethereumj-core/src/main/java/org/ethereum/serpent/SerpentVisitor.java
@@ -116,6 +116,20 @@ public interface SerpentVisitor extends ParseTreeVisitor {
*/
T visitBlock_difficulty(@NotNull SerpentParser.Block_difficultyContext ctx);
+ /**
+ * Visit a parse tree produced by {@link SerpentParser#array_assign}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitArray_assign(@NotNull SerpentParser.Array_assignContext ctx);
+
+ /**
+ * Visit a parse tree produced by {@link SerpentParser#array_retreive}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitArray_retreive(@NotNull SerpentParser.Array_retreiveContext ctx);
+
/**
* Visit a parse tree produced by {@link SerpentParser#parse_init_code_block}.
* @param ctx the parse tree
@@ -235,6 +249,13 @@ public interface SerpentVisitor extends ParseTreeVisitor {
*/
T visitSend_func(@NotNull SerpentParser.Send_funcContext ctx);
+ /**
+ * Visit a parse tree produced by {@link SerpentParser#arr_def}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitArr_def(@NotNull SerpentParser.Arr_defContext ctx);
+
/**
* Visit a parse tree produced by {@link SerpentParser#while_stmt}.
* @param ctx the parse tree
diff --git a/ethereumj-core/src/test/java/org/ethereum/serpent/SerpentCompileTest.java b/ethereumj-core/src/test/java/org/ethereum/serpent/SerpentCompileTest.java
index 58c5b06e..7b435a93 100644
--- a/ethereumj-core/src/test/java/org/ethereum/serpent/SerpentCompileTest.java
+++ b/ethereumj-core/src/test/java/org/ethereum/serpent/SerpentCompileTest.java
@@ -262,7 +262,7 @@ public class SerpentCompileTest {
public void test14(){
String code = "a = 1 > 2 > 3 > 4";
- String expected = "1 2 GT 3 GT 4 GT 0 MSTORE";
+ String expected = "4 3 2 1 GT GT GT 0 MSTORE";
SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class,
code);
@@ -297,13 +297,14 @@ public class SerpentCompileTest {
String code = "if 1>2: \n" +
" a=2";
- String expected = "1 2 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 LABEL_0";
+ String expected = "2 1 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 LABEL_0";
/**
- 1 2 GT NOT REF_1 JUMPI
+ 2 1 GT NOT REF_1 JUMPI
2 0 MSTORE
- REF_0 JUMP LABEL_1 LABEL_0
+ REF_0 JUMP
+ LABEL_1 LABEL_0
*/
SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class,
@@ -322,13 +323,14 @@ public class SerpentCompileTest {
String code = "if 10 > 2 + 5: \n" +
" a=2";
- String expected = "10 5 2 ADD GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 LABEL_0";
+ String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 LABEL_0";
/**
- 10 5 2 ADD GT NOT REF_1 JUMPI
- 2 0 MSTORE
- REF_0 JUMP LABEL_1 LABEL_0
+ 5 2 ADD 10 GT NOT REF_1 JUMPI
+ 2 0 MSTORE
+ REF_0 JUMP
+ LABEL_1 LABEL_0
*/
@@ -350,14 +352,15 @@ public class SerpentCompileTest {
" a=2\n" +
"else: \n" +
" c=3\n";
- String expected = "10 5 2 ADD GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 3 32 MSTORE LABEL_0";
+ String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 3 32 MSTORE LABEL_0";
/**
- 10 5 2 ADD GT NOT REF_1 JUMPI
- 2 0 MSTORE
- REF_0 JUMP LABEL_1
- 3 32 MSTORE
- LABEL_0
+ 5 2 ADD 10 GT NOT REF_1 JUMPI
+ 2 0 MSTORE
+ REF_0 JUMP
+ LABEL_1
+ 3 32 MSTORE
+ LABEL_0
*/
SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class,
@@ -379,15 +382,16 @@ public class SerpentCompileTest {
"else: \n" +
" c=123\n" +
" d=0xFFAA";
- String expected = "10 5 2 ADD GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 123 32 MSTORE 65450 64 MSTORE LABEL_0";
+ String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 123 32 MSTORE 65450 64 MSTORE LABEL_0";
/**
- 10 5 2 ADD GT NOT REF_1 JUMPI
- 2 0 MSTORE REF_0
- JUMP LABEL_1
- 123 32 MSTORE
- 65450 64 MSTORE
- LABEL_0
+ 5 2 ADD 10 GT NOT REF_1 JUMPI
+ 2 0 MSTORE
+ REF_0 JUMP
+ LABEL_1
+ 123 32 MSTORE
+ 65450 64 MSTORE
+ LABEL_0
*/
SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class,
@@ -411,20 +415,20 @@ public class SerpentCompileTest {
"else: \n" +
" c=123\n" +
" d=0xFFAA";
- String expected = "10 5 2 ADD GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE REF_0 JUMP LABEL_2 123 32 MSTORE 65450 64 MSTORE LABEL_0";
+ String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE REF_0 JUMP LABEL_2 123 32 MSTORE 65450 64 MSTORE LABEL_0";
/**
-
- 10 5 2 ADD GT NOT REF_1 JUMPI
- 2 0 MSTORE REF_0
- JUMP LABEL_1
- 4 2 2 MUL EQ NOT REF_2 JUMPI
- 3 0 MSTORE
- REF_0 JUMP LABEL_2
- 123 32 MSTORE
- 65450 64 MSTORE
- LABEL_0
-
+ 5 2 ADD 10 GT NOT REF_1 JUMPI
+ 2 0 MSTORE
+ REF_0 JUMP
+ LABEL_1
+ 4 2 2 MUL EQ NOT REF_2 JUMPI
+ 3 0 MSTORE
+ REF_0 JUMP
+ LABEL_2
+ 123 32 MSTORE
+ 65450 64 MSTORE
+ LABEL_0
*/
SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class,
@@ -452,27 +456,27 @@ public class SerpentCompileTest {
"else: \n" +
" c=123\n" +
" d=0xFFAA";
- String expected = "10 5 2 ADD LT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE REF_0 JUMP LABEL_2 40 10 2 2 MUL ADD EQ NOT REF_3 JUMPI 3 0 MSTORE 9 0 MSTORE 21 0 MSTORE REF_0 JUMP LABEL_3 123 32 MSTORE 65450 64 MSTORE LABEL_0";
+ String expected = "5 2 ADD 10 LT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE REF_0 JUMP LABEL_2 40 10 2 2 MUL ADD EQ NOT REF_3 JUMPI 3 0 MSTORE 9 0 MSTORE 21 0 MSTORE REF_0 JUMP LABEL_3 123 32 MSTORE 65450 64 MSTORE LABEL_0";
/**
- 10 5 2 ADD LT NOT REF_1 JUMPI
- 2 0 MSTORE
- REF_0 JUMP
- LABEL_1
- 4 2 2 MUL EQ NOT REF_2 JUMPI
- 3 0 MSTORE
- REF_0 JUMP
- LABEL_2
- 40 10 2 2 MUL ADD EQ NOT REF_3 JUMPI
- 3 0 MSTORE
- 9 0 MSTORE
- 21 0 MSTORE
- REF_0 JUMP
- LABEL_3
- 123 32 MSTORE
- 65450 64 MSTORE LABEL_0
-
+ 5 2 ADD 10 LT NOT REF_1 JUMPI
+ 2 0 MSTORE
+ REF_0 JUMP
+ LABEL_1
+ 4 2 2 MUL EQ NOT REF_2 JUMPI
+ 3 0 MSTORE
+ REF_0 JUMP
+ LABEL_2
+ 40 10 2 2 MUL ADD EQ NOT REF_3 JUMPI
+ 3 0 MSTORE
+ 9 0 MSTORE
+ 21 0 MSTORE
+ REF_0 JUMP
+ LABEL_3
+ 123 32 MSTORE
+ 65450 64 MSTORE
+ LABEL_0
*/
@@ -504,31 +508,31 @@ public class SerpentCompileTest {
"else: \n" +
" c=123\n" +
" d=0xFFAA";
- String expected = "10 5 2 ADD GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE 3 0 MLOAD EQ NOT REF_4 JUMPI 123 32 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_0 JUMP LABEL_2 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI 3 0 MSTORE 9 0 MSTORE 21 0 MSTORE REF_0 JUMP LABEL_5 123 64 MSTORE 65450 96 MSTORE LABEL_0";
+ String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE 3 0 MLOAD EQ NOT REF_4 JUMPI 123 32 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_0 JUMP LABEL_2 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI 3 0 MSTORE 9 0 MSTORE 21 0 MSTORE REF_0 JUMP LABEL_5 123 64 MSTORE 65450 96 MSTORE LABEL_0";
/**
- 10 5 2 ADD GT NOT REF_1 JUMPI
- 2 0 MSTORE
- REF_0 JUMP
- LABEL_1
+ 5 2 ADD 10 GT NOT REF_1 JUMPI
+ 2 0 MSTORE
+ REF_0 JUMP
+ LABEL_1
4 2 2 MUL EQ NOT REF_2 JUMPI
- 3 0 MSTORE
- 3 0 MLOAD
- EQ NOT REF_4 JUMPI
- 123 32 MSTORE
- REF_3 JUMP
- LABEL_4
- LABEL_3
- REF_0 JUMP LABEL_2
- 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI
- 3 0 MSTORE
- 9 0 MSTORE
- 21 0 MSTORE
- REF_0 JUMP
- LABEL_5
- 123 64 MSTORE
- 65450 96 MSTORE
- LABEL_0
+ 3 0 MSTORE
+ 3 0 MLOAD EQ NOT REF_4 JUMPI
+ 123 32 MSTORE
+ REF_3 JUMP
+ LABEL_4
+ LABEL_3
+ REF_0
+ JUMP LABEL_2
+ 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI
+ 3 0 MSTORE
+ 9 0 MSTORE
+ 21 0 MSTORE
+ REF_0 JUMP
+ LABEL_5
+ 123 64 MSTORE
+ 65450 96 MSTORE
+ LABEL_0
*/
SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class,
@@ -558,30 +562,31 @@ public class SerpentCompileTest {
"else: \n" +
" c=123\n" +
" d=0xFFAA";
- String expected = "7 2 MUL 96 GT 10 5 2 ADD LT NOT NOT NOT MUL NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE 3 0 MLOAD EQ NOT REF_4 JUMPI 123 32 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_0 JUMP LABEL_2 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI 3 0 MSTORE 9 0 MSTORE 21 0 MSTORE REF_0 JUMP LABEL_5 123 64 MSTORE 65450 96 MSTORE LABEL_0";
+ String expected = "96 7 2 MUL GT 5 2 ADD 10 LT NOT NOT NOT MUL NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE 3 0 MLOAD EQ NOT REF_4 JUMPI 123 32 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_0 JUMP LABEL_2 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI 3 0 MSTORE 9 0 MSTORE 21 0 MSTORE REF_0 JUMP LABEL_5 123 64 MSTORE 65450 96 MSTORE LABEL_0";
/**
- 7 2 MUL 96 GT 10 5 2 ADD LT NOT NOT NOT MUL NOT REF_1 JUMPI
- 2 0 MSTORE
- REF_0 JUMP
- LABEL_1
- 4 2 2 MUL EQ NOT REF_2 JUMPI
- 3 0 MSTORE
- 3 0 MLOAD EQ NOT REF_4 JUMPI
- 123 32 MSTORE REF_3 JUMP
+ 96 7 2 MUL GT 5 2 ADD 10 LT NOT NOT NOT MUL NOT REF_1 JUMPI
+ 2 0 MSTORE
+ REF_0 JUMP
+ LABEL_1
+ 4 2 2 MUL EQ NOT REF_2 JUMPI
+ 3 0 MSTORE
+ 3 0 MLOAD EQ NOT REF_4 JUMPI
+ 123 32 MSTORE
+ REF_3 JUMP
LABEL_4
LABEL_3
- REF_0 JUMP
- LABEL_2
- 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI
- 3 0 MSTORE
- 9 0 MSTORE
- 21 0 MSTORE
- REF_0 JUMP
- LABEL_5
- 123 64 MSTORE
- 65450 96 MSTORE
- LABEL_0
+ REF_0 JUMP
+ LABEL_2
+ 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI
+ 3 0 MSTORE
+ 9 0 MSTORE
+ 21 0 MSTORE
+ REF_0 JUMP
+ LABEL_5
+ 123 64 MSTORE
+ 65450 96 MSTORE
+ LABEL_0
*/
SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class,
@@ -680,17 +685,18 @@ public class SerpentCompileTest {
" if 4>3:\n" +
" if 5>4:\n" +
" a = 10\n";
- String expected = "2 1 GT NOT REF_7 JUMPI 3 2 GT NOT REF_6 JUMPI 4 3 GT NOT REF_5 JUMPI 5 4 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0";
+ String expected = "1 2 GT NOT REF_7 JUMPI 2 3 GT NOT REF_6 JUMPI 3 4 GT NOT REF_5 JUMPI 4 5 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0";
/**
- 2 1 GT NOT REF_7 JUMPI
- 3 2 GT NOT REF_6 JUMPI
- 4 3 GT NOT REF_5 JUMPI
- 5 4 GT NOT REF_4 JUMPI
- 10 0 MSTORE
- REF_3 JUMP
- LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0
+ 1 2 GT NOT REF_7 JUMPI
+ 2 3 GT NOT REF_6 JUMPI
+ 3 4 GT NOT REF_5 JUMPI
+ 4 5 GT NOT REF_4 JUMPI
+ 10 0 MSTORE
+ REF_3 JUMP
+ LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0
+
*/
SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class,
@@ -712,16 +718,17 @@ public class SerpentCompileTest {
" if 4>3:\n" +
" if 5>4:\n" +
" a = 10\n";
- String expected = "2 1 GT NOT REF_7 JUMPI 3 2 GT NOT REF_6 JUMPI 4 3 GT NOT REF_5 JUMPI 5 4 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0";
+ String expected = "1 2 GT NOT REF_7 JUMPI 2 3 GT NOT REF_6 JUMPI 3 4 GT NOT REF_5 JUMPI 4 5 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0";
/**
- 2 1 GT NOT REF_7 JUMPI
- 3 2 GT NOT REF_6 JUMPI
- 4 3 GT NOT REF_5 JUMPI
- 5 4 GT NOT REF_4 JUMPI
- 10 0 MSTORE
- REF_3 JUMP LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0
+ 1 2 GT NOT REF_7 JUMPI
+ 2 3 GT NOT REF_6 JUMPI
+ 3 4 GT NOT REF_5 JUMPI
+ 4 5 GT NOT REF_4 JUMPI
+ 10 0 MSTORE
+ REF_3 JUMP
+ LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0
*/
SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class,
@@ -745,19 +752,19 @@ public class SerpentCompileTest {
" a = 10\n" +
" else:\n" +
" b = 20\n";
- String expected = "2 1 GT NOT REF_7 JUMPI 3 2 GT NOT REF_6 JUMPI 4 3 GT NOT REF_5 JUMPI 5 4 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 20 32 MSTORE LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0";
+ String expected = "1 2 GT NOT REF_7 JUMPI 2 3 GT NOT REF_6 JUMPI 3 4 GT NOT REF_5 JUMPI 4 5 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 20 32 MSTORE LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0";
/**
- 2 1 GT NOT REF_7 JUMPI
- 3 2 GT NOT REF_6 JUMPI
- 4 3 GT NOT REF_5 JUMPI
- 5 4 GT NOT REF_4 JUMPI
- 10 0 MSTORE
- REF_3 JUMP
- LABEL_4
- 20 32 MSTORE
- LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0
+ 1 2 GT NOT REF_7 JUMPI
+ 2 3 GT NOT REF_6 JUMPI
+ 3 4 GT NOT REF_5 JUMPI
+ 4 5 GT NOT REF_4 JUMPI
+ 10 0 MSTORE
+ REF_3 JUMP
+ LABEL_4
+ 20 32 MSTORE
+ LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0
*/
@@ -921,15 +928,23 @@ public class SerpentCompileTest {
" b = 20\n" +
" elif 2*2 != 4: \n" +
" a = 15\n";
- String expected = "2 1 GT NOT REF_8 JUMPI 3 2 GT NOT REF_7 JUMPI 4 3 GT NOT REF_5 JUMPI 5 4 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 20 32 MSTORE LABEL_3 REF_2 JUMP LABEL_5 4 2 2 MUL EQ NOT NOT REF_6 JUMPI 15 0 MSTORE REF_2 JUMP LABEL_6 LABEL_2 REF_1 JUMP LABEL_7 LABEL_1 REF_0 JUMP LABEL_8 LABEL_0";
+ String expected = "1 2 GT NOT REF_8 JUMPI 2 3 GT NOT REF_7 JUMPI 3 4 GT NOT REF_5 JUMPI 4 5 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 20 32 MSTORE LABEL_3 REF_2 JUMP LABEL_5 4 2 2 MUL EQ NOT NOT REF_6 JUMPI 15 0 MSTORE REF_2 JUMP LABEL_6 LABEL_2 REF_1 JUMP LABEL_7 LABEL_1 REF_0 JUMP LABEL_8 LABEL_0";
/**
- 2 1 GT NOT REF_8 JUMPI
- 3 2 GT NOT REF_7 JUMPI
- 4 3 GT NOT REF_5 JUMPI
- 5 4 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 20 32 MSTORE LABEL_3 REF_2 JUMP LABEL_5 4 2 2 MUL EQ NOT NOT REF_6 JUMPI 15 0 MSTORE REF_2 JUMP LABEL_6 LABEL_2 REF_1 JUMP LABEL_7 LABEL_1 REF_0 JUMP LABEL_8 LABEL_0
-
+ 1 2 GT NOT REF_8 JUMPI
+ 2 3 GT NOT REF_7 JUMPI
+ 3 4 GT NOT REF_5 JUMPI
+ 4 5 GT NOT REF_4 JUMPI
+ 10 0 MSTORE
+ REF_3 JUMP
+ LABEL_4
+ 20 32 MSTORE
+ LABEL_3 REF_2 JUMP
+ LABEL_5
+ 4 2 2 MUL EQ NOT NOT REF_6 JUMPI
+ 15 0 MSTORE
+ REF_2 JUMP LABEL_6 LABEL_2 REF_1 JUMP LABEL_7 LABEL_1 REF_0 JUMP LABEL_8 LABEL_0
*/
@@ -956,24 +971,24 @@ public class SerpentCompileTest {
"else: \n" +
" a=50 \n" ;
- String expected = "2 1 GT NOT REF_1 JUMPI 20 0 MSTORE REF_0 JUMP LABEL_1 5 1 LT NOT REF_2 JUMPI 30 0 MSTORE REF_0 JUMP LABEL_2 6 6 GT NOT REF_3 JUMPI 40 0 MSTORE REF_0 JUMP LABEL_3 50 0 MSTORE LABEL_0";
+ String expected = "1 2 GT NOT REF_1 JUMPI 20 0 MSTORE REF_0 JUMP LABEL_1 1 5 LT NOT REF_2 JUMPI 30 0 MSTORE REF_0 JUMP LABEL_2 6 6 GT NOT REF_3 JUMPI 40 0 MSTORE REF_0 JUMP LABEL_3 50 0 MSTORE LABEL_0";
/**
- 2 1 GT NOT REF_1 JUMPI
- 20 0 MSTORE
- REF_0 JUMP
- LABEL_1
- 5 1 LT NOT REF_2 JUMPI
- 30 0 MSTORE
- REF_0 JUMP
- LABEL_2
- 6 6 GT NOT REF_3 JUMPI
- 40 0 MSTORE
- REF_0 JUMP
- LABEL_3
- 50 0 MSTORE
- LABEL_0
+ 1 2 GT NOT REF_1 JUMPI
+ 20 0 MSTORE
+ REF_0 JUMP
+ LABEL_1
+ 1 5 LT NOT REF_2 JUMPI
+ 30 0 MSTORE
+ REF_0 JUMP
+ LABEL_2
+ 6 6 GT NOT REF_3 JUMPI
+ 40 0 MSTORE
+ REF_0 JUMP
+ LABEL_3
+ 50 0 MSTORE
+ LABEL_0
*/
@@ -995,14 +1010,16 @@ public class SerpentCompileTest {
"while a>0: \n" +
" a = a - 1 \n" ;
- String expected = "20 0 MSTORE LABEL_0 0 MLOAD 0 GT NOT REF_1 JUMPI 1 0 MLOAD SUB 0 MSTORE REF_0 JUMP LABEL_1";
+ String expected = "20 0 MSTORE LABEL_0 0 0 MLOAD GT NOT REF_1 JUMPI 1 0 MLOAD SUB 0 MSTORE REF_0 JUMP LABEL_1";
/**
- 20 0 MSTORE
- LABEL_0 0 MLOAD 0 GT NOT REF_1 JUMPI
- 1 0 MLOAD SUB 0 MSTORE
- REF_0 JUMP LABEL_1
+ 20 0 MSTORE
+ LABEL_0
+ 0 0 MLOAD GT EQ NOT REF_1 JUMPI
+ 1 0 MLOAD SUB 0 MSTORE
+ REF_0 JUMP
+ LABEL_1
*/
@@ -1027,18 +1044,22 @@ public class SerpentCompileTest {
" else: \n " +
" x = 3 * x + 1 \n" ;
- String expected = "248 0 MSTORE LABEL_0 0 MLOAD 1 GT NOT REF_1 JUMPI 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI 2 0 MLOAD DIV 0 MSTORE REF_2 JUMP LABEL_3 1 0 MLOAD 3 MUL ADD 0 MSTORE LABEL_2 REF_0 JUMP LABEL_1";
+ String expected = "248 0 MSTORE LABEL_0 1 0 MLOAD GT NOT REF_1 JUMPI 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI 2 0 MLOAD DIV 0 MSTORE REF_2 JUMP LABEL_3 1 0 MLOAD 3 MUL ADD 0 MSTORE LABEL_2 REF_0 JUMP LABEL_1";
/**
- 248 0 MSTORE
- LABEL_0 0 MLOAD 1 GT NOT REF_1 JUMPI
- 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI
- 2 0 MLOAD DIV 0 MSTORE
- REF_2 JUMP LABEL_3
- 1 0 MLOAD 3 MUL ADD 0 MSTORE
- LABEL_2 REF_0 JUMP
- LABEL_1
+ 248 0 MSTORE
+ LABEL_0
+ 1 0 MLOAD GT NOT REF_1 JUMPI
+ 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI
+ 2 0 MLOAD DIV 0 MSTORE
+ REF_2 JUMP
+ LABEL_3
+ 1 0 MLOAD 3 MUL ADD 0 MSTORE
+ LABEL_2
+
+ REF_0 JUMP
+ LABEL_1
*/
@@ -1063,19 +1084,20 @@ public class SerpentCompileTest {
"x = x +2 \n" +
"x = 3 * x + 1 \n" ;
- String expected = "255 0 MSTORE LABEL_0 0 MLOAD 1 GT NOT REF_1 JUMPI 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI 2 0 MLOAD DIV 0 MSTORE REF_2 JUMP LABEL_3 LABEL_2 REF_0 JUMP LABEL_1 2 0 MLOAD ADD 0 MSTORE 1 0 MLOAD 3 MUL ADD 0 MSTORE";
+ String expected = "255 0 MSTORE LABEL_0 1 0 MLOAD GT NOT REF_1 JUMPI 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI 2 0 MLOAD DIV 0 MSTORE REF_2 JUMP LABEL_3 LABEL_2 REF_0 JUMP LABEL_1 2 0 MLOAD ADD 0 MSTORE 1 0 MLOAD 3 MUL ADD 0 MSTORE";
/**
- 255 0 MSTORE
- LABEL_0 0 MLOAD 1 GT NOT REF_1 JUMPI
+ 255 0 MSTORE
+ LABEL_0
+ 1 0 MLOAD GT EQ NOT REF_1 JUMPI
0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI
- 2 0 MLOAD DIV 0 MSTORE
- REF_2 JUMP LABEL_3 LABEL_2
- REF_0 JUMP LABEL_1
- 2 0 MLOAD ADD 0 MSTORE
- 1 0 MLOAD 3 MUL ADD 0 MSTORE
-
+ 2 0 MLOAD DIV 0 MSTORE REF_2 JUMP
+ LABEL_3 LABEL_2
+ REF_0 JUMP
+ LABEL_1
+ 2 0 MLOAD ADD 0 MSTORE
+ 1 0 MLOAD 3 MUL ADD 0 MSTORE
*/
@@ -1123,14 +1145,15 @@ public class SerpentCompileTest {
"while (x > 1) && (x > 2) && (x > 3) && (2 <9):\n" +
" x = x -2\n" ;
- String expected = "255 0 MSTORE LABEL_0 2 9 LT 0 MLOAD 3 GT 0 MLOAD 2 GT 0 MLOAD 1 GT NOT NOT MUL NOT NOT MUL NOT NOT MUL NOT REF_1 JUMPI 2 0 MLOAD SUB 0 MSTORE REF_0 JUMP LABEL_1";
+ String expected = "255 0 MSTORE LABEL_0 9 2 LT 3 0 MLOAD GT 2 0 MLOAD GT 1 0 MLOAD GT NOT NOT MUL NOT NOT MUL NOT NOT MUL NOT REF_1 JUMPI 2 0 MLOAD SUB 0 MSTORE REF_0 JUMP LABEL_1";
/**
- 255 0 MSTORE LABEL_0
- 2 9 LT 0 MLOAD 3 GT 0 MLOAD 2 GT 0 MLOAD 1 GT NOT NOT MUL NOT NOT MUL NOT NOT MUL NOT REF_1 JUMPI
- 2 0 MLOAD SUB 0 MSTORE
- REF_0 JUMP
+ 255 0 MSTORE
+ LABEL_0
+ 9 2 LT 3 0 MLOAD GT 2 0 MLOAD GT 1 0 MLOAD GT NOT NOT MUL NOT NOT MUL NOT NOT MUL EQ NOT REF_1 JUMPI
+ 2 0 MLOAD SUB 0 MSTORE
+ REF_0 JUMP
LABEL_1
*/
@@ -1225,24 +1248,77 @@ public class SerpentCompileTest {
" b=msg.data[1]\n" +
" stop\n" ;
- String expected = "[init 2 0 MSTORE init] [code 1 32 MUL CALLDATALOAD 32 MSTORE STOP code]";
+ String expected = "[init 2 0 MSTORE init] [code 1 32 MUL CALLDATALOAD 0 MSTORE STOP code]";
String asmResult = SerpentCompiler.compileFullNotion(code);
Assert.assertEquals(expected, asmResult);
+ }
+ @Test // test arrays 1 simple create
+ public void test45(){
+ String code = "c = 2\n" +
+ "d = 3\n" +
+ "a = [11, 22, 33]" ;
+ String expected = "0 63 MSTORE8 2 0 MSTORE 3 32 MSTORE MEMSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE";
+ String asmResult = SerpentCompiler.compile(code);
+ Assert.assertEquals(expected, asmResult);
}
- @Test // todo delete this one
- public void testFoo(){
-
- System.out.println(ByteUtil.numBytes("65536"));
+ @Test // test arrays 2 simple set
+ public void test46(){
+ String code = "a = [11, 22, 33]\n" +
+ "a[ 2 ] = 3" ;
+ String expected = "MEMSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE 3 32 2 MUL 32 ADD 0 ADD 0 ADD MSTORE";
+ String asmResult = SerpentCompiler.compile(code);
+ Assert.assertEquals(expected, asmResult);
}
+
+ @Test // test arrays 3 complicated set after 2 arrays
+ public void test47(){
+ String code = "a = [2, 4, 6]\n" +
+ "b = [12, 14]\n" +
+ "c = [22, 24, 25]\n" +
+ "c[ 0 ] = 3" ;
+ String expected = "MEMSIZE DUP 32 ADD 2 SWAP MSTORE DUP 64 ADD 4 SWAP MSTORE DUP 96 ADD 6 SWAP MSTORE 128 SWAP MSTORE MEMSIZE DUP 32 ADD 12 SWAP MSTORE DUP 64 ADD 14 SWAP MSTORE 96 SWAP MSTORE MEMSIZE DUP 32 ADD 22 SWAP MSTORE DUP 64 ADD 24 SWAP MSTORE DUP 96 ADD 25 SWAP MSTORE 128 SWAP MSTORE 3 32 0 MUL 32 ADD 224 ADD 0 ADD MSTORE";
+ String asmResult = SerpentCompiler.compile(code);
+ Assert.assertEquals(expected, asmResult);
+ }
+
+ @Test // test arrays 4 simple set
+ public void test48(){
+ String code = "b = 1\n" +
+ "c = 2\n" +
+ "a = [11, 22, 33]\n" +
+ "a[ 2 ] = 3" ;
+ String expected = "0 63 MSTORE8 1 0 MSTORE 2 32 MSTORE MEMSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE 3 32 2 MUL 32 ADD 0 ADD 64 ADD MSTORE";
+
+ String asmResult = SerpentCompiler.compile(code);
+ Assert.assertEquals(expected, asmResult);
+ }
+
+
+
+ @Test // test arrays 5 simple retrieve value
+ public void test49(){
+ String code = "c = [5]\n" +
+ "a = [11, 22, 33]\n" +
+ "b = a [0]" ;
+ String expected = "0 31 MSTORE8 MEMSIZE DUP 32 ADD 5 SWAP MSTORE 64 SWAP MSTORE MEMSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE 32 0 MUL 64 ADD 32 ADD MLOAD 0 MSTORE";
+
+ String asmResult = SerpentCompiler.compile(code);
+ Assert.assertEquals(expected, asmResult);
+ }
+
+
+
/*
todo: more to implement
+
+# *) a = msg.data
# 0) sha();
# 2) create(1, 2, 3, 4)
# 3) x = sha3(v)
diff --git a/samples/my-currency.se b/samples/my-currency.se
index 9a9f5b2e..36441e8f 100644
--- a/samples/my-currency.se
+++ b/samples/my-currency.se
@@ -31,4 +31,4 @@ code:
contract.storage[to] = contract.storage[to] + value
return(1)
else:
- return(0)
+ return(0)
\ No newline at end of file