From cccca31d4bd1d3387c42c735088f659afdcefab2 Mon Sep 17 00:00:00 2001 From: Cody <6558800+Bl3nd@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:24:18 -0600 Subject: [PATCH] Bytecode token highlighter. --- .../bytecode/JavaBytecodeTokenMaker.flex | 439 ++++ .../bytecode/JavaBytecodeTokenMaker.java | 2005 +++++++++++++++++ .../gui/util/BytecodeViewPanelUpdater.java | 34 +- 3 files changed, 2465 insertions(+), 13 deletions(-) create mode 100644 src/main/java/the/bytecode/club/bytecodeviewer/decompilers/bytecode/JavaBytecodeTokenMaker.flex create mode 100644 src/main/java/the/bytecode/club/bytecodeviewer/decompilers/bytecode/JavaBytecodeTokenMaker.java diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/decompilers/bytecode/JavaBytecodeTokenMaker.flex b/src/main/java/the/bytecode/club/bytecodeviewer/decompilers/bytecode/JavaBytecodeTokenMaker.flex new file mode 100644 index 00000000..e8275086 --- /dev/null +++ b/src/main/java/the/bytecode/club/bytecodeviewer/decompilers/bytecode/JavaBytecodeTokenMaker.flex @@ -0,0 +1,439 @@ +package the.bytecode.club.bytecodeviewer.decompilers.bytecode; + +import java.io.*; +import javax.swing.text.Segment; + +import org.fife.ui.rsyntaxtextarea.*; + +/** + * This is generated code, please do not make any changes to this file. To add more tokens, adjust the + * .flex file and then regenerate this file using JFlex. + *

+ * Please see {@link org.fife.ui.rsyntaxtextarea.modes.JavaTokenMaker} as this implementation was based on it. + *

+ * NOTE: + *

+ */ +%% + +%public +%class JavaBytecodeTokenMaker +%extends AbstractJFlexCTokenMaker +%unicode +%type org.fife.ui.rsyntaxtextarea.Token + +%{ + public JavaBytecodeTokenMaker() { + + } + + private void addHyperlinkToken(int start, int end, int tokenType) { + int so = start + offsetShift; + addToken(zzBuffer, start, end, tokenType, so, true); + } + + private void addToken(int tokenType){ + addToken(zzStartRead, zzMarkedPos - 1, tokenType); + } + + private void addToken(int start, int end, int tokenType){ + int so = start + offsetShift; + addToken(zzBuffer, start, end, tokenType, so, false); + } + + @Override + public void addToken(char[] array, int start, int end, int tokenType, int startOffset, boolean hyperlink) { + super.addToken(array, start, end, tokenType, startOffset, hyperlink); + zzStartRead = zzMarkedPos; + } + + @Override + public String[] getLineCommentStartAndEnd(int languageIndex) { + return new String[] { "//", null }; + } + + public Token getTokenList(Segment text, int initialTokenType, int startOffset) { + resetTokenList(); + this.offsetShift = -text.offset + startOffset; + + // Start off in the proper state. + int state; + switch (initialTokenType) { + case TokenTypes.COMMENT_MULTILINE: + state = MLC; + start = text.offset; + break; + case TokenTypes.COMMENT_DOCUMENTATION: + state = DOCCOMMENT; + start = text.offset; + break; + case TokenTypes.LITERAL_STRING_DOUBLE_QUOTE: + state = TEXT_BLOCK; + start = text.offset; + break; + default: + state = YYINITIAL; + } + + s = text; + try { + yyreset(zzReader); + yybegin(state); + return yylex(); + } catch (IOException ioe) { + ioe.printStackTrace(); + return new TokenImpl(); + } + + } + + /** + * Refills the input buffer. + * + * @return true if EOF was reached, otherwise + * false. + */ + private boolean zzRefill() { + return zzCurrentPos>=s.offset+s.count; + } + + + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + * + * All internal variables are reset, the old input stream + * cannot be reused (internal buffer is discarded and lost). + * Lexical state is set to YY_INITIAL. + * + * @param reader the new input stream + */ + public final void yyreset(Reader reader) { + // 's' has been updated. + zzBuffer = s.array; + /* + * We replaced the line below with the two below it because zzRefill + * no longer "refills" the buffer (since the way we do it, it's always + * "full" the first time through, since it points to the segment's + * array). So, we assign zzEndRead here. + */ + //zzStartRead = zzEndRead = s.offset; + zzStartRead = s.offset; + zzEndRead = zzStartRead + s.count - 1; + zzCurrentPos = zzMarkedPos = s.offset; + zzLexicalState = YYINITIAL; + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + } + +%} + +Letter = ([A-Za-z]) +LetterOrUnderscore = ({Letter}|"_") +NonzeroDigit = ([1-9]) +BinaryDigit = ([0-1]) +Digit = ("0"|{NonzeroDigit}) +HexDigit = ({Digit}|[A-Fa-f]) +OctalDigit = ([0-7]) +AnyCharacterButApostropheOrBackSlash = ([^\\']) +AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n]) +EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit}) +Escape = ("\\"(([bstnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter})) +NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\") +IdentifierStart = ([:jletter:]) +IdentifierPart = ([:jletterdigit:]|("\\"{EscapedSourceCharacter})) + +LineTerminator = \r|\n|\r\n +WhiteSpace = ([ \t\f]) + +CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\']) +UnclosedCharLiteral = ([\'][^\'\n]*) +ErrorCharLiteral = ({UnclosedCharLiteral}[\']) +StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"]) +UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?) +ErrorStringLiteral = ({UnclosedStringLiteral}[\"]) + +MLCBegin = "/*" +MLCEnd = "*/" +DocCommentBegin = "/**" +LineCommentBegin = "//" + +DigitOrUnderscore = ({Digit}|[_]) +DigitsAndUnderscoresEnd = ({DigitOrUnderscore}*{Digit}) +IntegerHelper = (({NonzeroDigit}{DigitsAndUnderscoresEnd}?)|"0") +IntegerLiteral = ({IntegerHelper}[lL]?) + +BinaryDigitOrUnderscore = ({BinaryDigit}|[_]) +BinaryDigitsAndUnderscores = ({BinaryDigit}({BinaryDigitOrUnderscore}*{BinaryDigit})?) +BinaryLiteral = ("0"[bB]{BinaryDigitsAndUnderscores}) + +HexDigitOrUnderscore = ({HexDigit}|[_]) +HexDigitsAndUnderscores = ({HexDigit}({HexDigitOrUnderscore}*{HexDigit})?) +OctalDigitOrUnderscore = ({OctalDigit}|[_]) +OctalDigitsAndUnderscoresEnd= ({OctalDigitOrUnderscore}*{OctalDigit}) +HexHelper = ("0"(([xX]{HexDigitsAndUnderscores})|({OctalDigitsAndUnderscoresEnd}))) +HexLiteral = ({HexHelper}[lL]?) + +FloatHelper1 = ([fFdD]?) +FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1}) +FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2}))) +FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2})) +FloatLiteral3 = ({Digit}+{FloatHelper2}) +FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD])) + +ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+) +BooleanLiteral = ("true"|"false") + +Separator = ([\(\)\{\}\[\]]) +Separator2 = ([\;,.]) + +NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>") +AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=") +Operator = ({NonAssignmentOperator}|{AssignmentOperator}) + +CurrentBlockTag = ("author"|"deprecated"|"exception"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version") +ProposedBlockTag = ("category"|"example"|"tutorial"|"index"|"exclude"|"todo"|"internal"|"obsolete"|"threadsafety") +BlockTag = ({CurrentBlockTag}|{ProposedBlockTag}) +InlineTag = ("code"|"docRoot"|"inheritDoc"|"link"|"linkplain"|"literal"|"value") + +Identifier = ({IdentifierStart}{IdentifierPart}*) +ErrorIdentifier = ({NonSeparator}+) + +Annotation = ("@"{Identifier}?) + +URLGenDelim = ([:\/\?#\[\]@]) +URLSubDelim = ([\!\$&'\(\)\*\+,;=]) +URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~]) +URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%]) +URLCharacters = ({URLCharacter}*) +URLEndCharacter = ([\/\$]|{Letter}|{Digit}) +URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?) + +%state MLC +%state DOCCOMMENT +%state EOL_COMMENT +%state TEXT_BLOCK + +%% + + { +/* Keywords */ + "_" | + "abstract"| + "assert" | + "break" | + "case" | + "catch" | + "class" | + "const" | + "continue" | + "default" | + "do" | + "else" | + "enum" | + "exports" | + "extends" | + "final" | + "finally" | + "for" | + "goto" | + "if" | + "implements" | + "import" | + "instanceof" | + "interface" | + "module" | + "native" | + "new" | + "non-sealed" | + "null" | + "open" | + "opens" | + "package" | + "permits" | + "private" | + "protected" | + "provides" | + "public" | + "record" | + "requires" | + "sealed" | + "static" | + "strictfp" | + "super" | + "switch" | + "synchronized" | + "this" | + "throw" | + "throws" | + "to" | + "transient" | + "transitive" | + "try" | + "uses" | + "void" | + "volatile" | + "while" | + /* Bytecode instructions */ + "ifeq" | + "ifne" | + "iflt" | + "ifle" | + "ifgt" | + "ifge" | + "ifnonnull" | + "ifnull" | + "if_icmplt" | + "if_icmple" | + "if_icmpne" | + "if_icmpge" | + "if_icmpgt" | + "if_icmpeq" | + "return" | + "areturn" | + "athrow" | + "with" { addToken(TokenTypes.RESERVED_WORD); } + + /* Data types. */ + "boolean" | + "byte" | + "char" | + "double" | + "float" | + "int" | + "long" | + "short" | + "var" { addToken(TokenTypes.DATA_TYPE); } + + /* Booleans. */ + {BooleanLiteral} { addToken(TokenTypes.LITERAL_BOOLEAN); } + + {LineTerminator} { addNullToken(); return firstToken; } + + {Identifier} { addToken(TokenTypes.IDENTIFIER); } + + {WhiteSpace}+ { addToken(TokenTypes.WHITESPACE); } + + /* String/Character literals. */ + \"\"\" { start = zzMarkedPos-3; yybegin(TEXT_BLOCK); } + {CharLiteral} { addToken(TokenTypes.LITERAL_CHAR); } + {UnclosedCharLiteral} { addToken(TokenTypes.ERROR_CHAR); addNullToken(); return firstToken; } + {ErrorCharLiteral} { addToken(TokenTypes.ERROR_CHAR); } + {StringLiteral} { addToken(TokenTypes.LITERAL_STRING_DOUBLE_QUOTE); } + {UnclosedStringLiteral} { addToken(TokenTypes.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; } + {ErrorStringLiteral} { addToken(TokenTypes.ERROR_STRING_DOUBLE); } + + /* Comment literals. */ + "/**/" { addToken(TokenTypes.COMMENT_MULTILINE); } + {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); } + {DocCommentBegin} { start = zzMarkedPos-3; yybegin(DOCCOMMENT); } + {LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); } + + /* Annotations. */ + {Annotation} { addToken(TokenTypes.ANNOTATION); } + + /* Separators. */ + {Separator} { addToken(TokenTypes.SEPARATOR); } + {Separator2} { addToken(TokenTypes.IDENTIFIER); } + + /* Operators. */ + {Operator} { addToken(TokenTypes.OPERATOR); } + + /* Numbers */ + {IntegerLiteral} { addToken(TokenTypes.LITERAL_NUMBER_DECIMAL_INT); } + {BinaryLiteral} { addToken(TokenTypes.LITERAL_NUMBER_DECIMAL_INT); } + {HexLiteral} { addToken(TokenTypes.LITERAL_NUMBER_HEXADECIMAL); } + {FloatLiteral} { addToken(TokenTypes.LITERAL_NUMBER_FLOAT); } + {ErrorNumberFormat} { addToken(TokenTypes.ERROR_NUMBER_FORMAT); } + + {ErrorIdentifier} { addToken(TokenTypes.ERROR_IDENTIFIER); } + + /* Ended with a line not in a string or comment. */ + <> { addNullToken(); return firstToken; } + + /* Catch any other (unhandled) characters and flag them as identifiers. */ + . { addToken(TokenTypes.ERROR_IDENTIFIER); } +} + + { + + [^hwf\n\*]+ {} + {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, TokenTypes.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, TokenTypes.COMMENT_MULTILINE); start = zzMarkedPos; } + [hwf] {} + + {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, TokenTypes.COMMENT_MULTILINE); } + \* {} + \n | + <> { addToken(start,zzStartRead-1, TokenTypes.COMMENT_MULTILINE); return firstToken; } + +} + + + { + + [^hwf\@\{\n\<\*]+ {} + {URL} { + int temp = zzStartRead; + if (start <= zzStartRead - 1) { + addToken(start,zzStartRead-1, TokenTypes.COMMENT_DOCUMENTATION); + } + addHyperlinkToken(temp,zzMarkedPos-1, TokenTypes.COMMENT_DOCUMENTATION); + start = zzMarkedPos; + } + [hwf] {} + + "@"{BlockTag} { + int temp = zzStartRead; + if (start <= zzStartRead - 1) { + addToken(start,zzStartRead-1, TokenTypes.COMMENT_DOCUMENTATION); + } + addToken(temp,zzMarkedPos-1, TokenTypes.COMMENT_KEYWORD); + start = zzMarkedPos; + } + "@" {} + "{@"{InlineTag}[^\}]*"}" { + int temp = zzStartRead; + if (start <= zzStartRead - 1) { + addToken(start,zzStartRead-1, TokenTypes.COMMENT_DOCUMENTATION); + } + addToken(temp,zzMarkedPos-1, TokenTypes.COMMENT_KEYWORD); + start = zzMarkedPos; + } + "{" {} + \n { addToken(start,zzStartRead-1, TokenTypes.COMMENT_DOCUMENTATION); return firstToken; } + "<"[/]?({Letter}[^\>]*)?">" { int temp=zzStartRead; addToken(start,zzStartRead-1, TokenTypes.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, TokenTypes.COMMENT_MARKUP); start = zzMarkedPos; } + \< {} + {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, TokenTypes.COMMENT_DOCUMENTATION); } + \* {} + <> { yybegin(YYINITIAL); addToken(start,zzEndRead, TokenTypes.COMMENT_DOCUMENTATION); return firstToken; } + +} + + + { + [^hwf\n]+ {} + {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, TokenTypes.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, TokenTypes.COMMENT_EOL); start = zzMarkedPos; } + [hwf] {} + \n | + <> { addToken(start,zzStartRead-1, TokenTypes.COMMENT_EOL); addNullToken(); return firstToken; } + +} + + { + [^\"\\\n]* {} + \\.? { /* Skip escaped chars, handles case: '\"""'. */ } + \"\"\" { yybegin(YYINITIAL); addToken(start,zzStartRead+2, TokenTypes.LITERAL_STRING_DOUBLE_QUOTE); } + \" {} + \n | + <> { addToken(start,zzStartRead-1, TokenTypes.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; } +} \ No newline at end of file diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/decompilers/bytecode/JavaBytecodeTokenMaker.java b/src/main/java/the/bytecode/club/bytecodeviewer/decompilers/bytecode/JavaBytecodeTokenMaker.java new file mode 100644 index 00000000..933b6c0d --- /dev/null +++ b/src/main/java/the/bytecode/club/bytecodeviewer/decompilers/bytecode/JavaBytecodeTokenMaker.java @@ -0,0 +1,2005 @@ +// Generated by JFlex 1.9.1 http://jflex.de/ (tweaked for IntelliJ platform) +// source: JavaBytecodeTokenMaker.flex + +package the.bytecode.club.bytecodeviewer.decompilers.bytecode; + +import java.io.*; +import javax.swing.text.Segment; + +import org.fife.ui.rsyntaxtextarea.*; + +/** + * This is generated code, please do not make any changes to this file. To add more tokens, adjust the + * .flex file and then regenerate this file using JFlex. + *

+ * Please see {@link org.fife.ui.rsyntaxtextarea.modes.JavaTokenMaker} as this implementation was based on it. + *

+ * NOTE: + *

    + *
  • + * When regenerating, the {@code zzBuffer} will turn into a {@code CharSequence}, set it to a {@code char[]}. + * This will also create errors throughout where {@code zzBuffer} is used, so you will need to make small changes + * to those methods. + *
  • + *
  • + * There will be a second {@code yyRefill} method with a default {@code return true;}, remove it. + *
  • + *
+ */ +public class JavaBytecodeTokenMaker extends AbstractJFlexCTokenMaker { + + /** + * This character denotes the end of file + */ + public static final int YYEOF = -1; + + /** + * initial size of the lookahead buffer + */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** + * lexical states + */ + public static final int YYINITIAL = 0; + public static final int MLC = 2; + public static final int DOCCOMMENT = 4; + public static final int EOL_COMMENT = 6; + public static final int TEXT_BLOCK = 8; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0, 1, 1, 2, 2, 3, 3, 4, 4 + }; + + /** + * Top-level table for translating characters to character classes + */ + private static final int[] ZZ_CMAP_TOP = zzUnpackcmap_top(); + + private static final String ZZ_CMAP_TOP_PACKED_0 = + "\1\0\1\u0100\1\u0200\1\u0300\1\u0400\1\u0500\1\u0600\1\u0700" + + "\1\u0800\1\u0900\1\u0a00\1\u0b00\1\u0c00\1\u0d00\1\u0e00\1\u0f00" + + "\1\u1000\1\u0100\1\u1100\1\u1200\1\u1300\1\u0100\1\u1400\1\u1500" + + "\1\u1600\1\u1700\1\u1800\1\u1900\1\u1a00\1\u1b00\1\u0100\1\u1c00" + + "\1\u1d00\1\u1e00\12\u1f00\1\u2000\1\u2100\1\u2200\1\u1f00\1\u2300" + + "\1\u2400\2\u1f00\31\u0100\1\u2500\126\u0100\1\u2600\1\u0100\1\u2700" + + "\1\u2800\1\u2900\1\u2a00\1\u2b00\1\u2c00\53\u0100\1\u2d00\10\u2e00" + + "\31\u1f00\1\u0100\1\u2f00\1\u3000\1\u0100\1\u3100\1\u3200\1\u3300" + + "\1\u3400\1\u3500\1\u3600\1\u3700\1\u3800\1\u3900\1\u0100\1\u3a00" + + "\1\u3b00\1\u3c00\1\u3d00\1\u3e00\1\u3f00\1\u4000\1\u4100\1\u4200" + + "\1\u4300\1\u4400\1\u4500\1\u4600\1\u4700\1\u4800\1\u4900\1\u4a00" + + "\1\u4b00\1\u4c00\1\u4d00\1\u1f00\1\u4e00\1\u4f00\1\u5000\1\u5100" + + "\3\u0100\1\u5200\1\u5300\1\u5400\11\u1f00\1\u5500\4\u0100\1\u5600" + + "\17\u1f00\2\u0100\1\u5700\41\u1f00\2\u0100\1\u5800\1\u5900\2\u1f00" + + "\1\u5a00\1\u5b00\27\u0100\1\u5c00\4\u0100\1\u5d00\1\u5e00\41\u1f00" + + "\1\u5f00\1\u0100\1\u6000\1\u6100\11\u1f00\1\u6200\22\u1f00\1\u6300" + + "\1\u1f00\1\u6400\1\u6500\1\u1f00\1\u6600\1\u6700\1\u6800\1\u6900" + + "\2\u1f00\1\u6a00\4\u1f00\1\u6b00\1\u6c00\1\u6d00\1\u6e00\1\u1f00" + + "\1\u6f00\2\u1f00\1\u7000\1\u7100\1\u7200\2\u1f00\1\u7300\1\u1f00" + + "\1\u7400\14\u1f00\1\u7500\4\u1f00\246\u0100\1\u7600\20\u0100\1\u7700" + + "\1\u7800\25\u0100\1\u7900\34\u0100\1\u7a00\14\u1f00\2\u0100\1\u7b00" + + "\5\u1f00\23\u0100\1\u7c00\17\u0100\1\u7d00\u0adc\u1f00\1\u7e00\1\u7f00" + + "\u02fe\u1f00"; + + private static int[] zzUnpackcmap_top() { + int[] result = new int[4352]; + int offset = 0; + offset = zzUnpackcmap_top(ZZ_CMAP_TOP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackcmap_top(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Second-level tables for translating characters to character classes + */ + private static final int[] ZZ_CMAP_BLOCKS = zzUnpackcmap_blocks(); + + private static final String ZZ_CMAP_BLOCKS_PACKED_0 = + "\11\0\1\1\1\2\1\3\1\4\1\5\16\0\4\6" + + "\1\1\1\7\1\10\1\11\1\12\1\7\1\13\1\14" + + "\2\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24" + + "\1\25\2\26\4\27\2\30\1\31\1\20\1\32\1\33" + + "\1\34\1\35\1\36\1\37\1\40\1\37\1\41\1\42" + + "\1\43\5\44\1\45\5\44\1\46\5\44\1\47\2\44" + + "\1\15\1\50\1\15\1\51\1\52\1\6\1\53\1\54" + + "\1\55\1\56\1\57\1\60\1\61\1\62\1\63\1\44" + + "\1\64\1\65\1\66\1\67\1\70\1\71\1\72\1\73" + + "\1\74\1\75\1\76\1\77\1\100\1\101\1\102\1\103" + + "\1\104\1\51\1\105\1\35\6\0\1\106\32\0\2\6" + + "\4\107\4\6\1\107\2\6\1\0\7\6\1\107\4\6" + + "\1\107\5\6\27\107\1\6\37\107\1\6\u01ca\107\4\6" + + "\14\107\16\6\5\107\7\6\1\107\1\6\1\107\21\6" + + "\160\0\5\107\1\6\2\107\2\6\4\107\1\6\1\107" + + "\6\6\1\107\1\6\3\107\1\6\1\107\1\6\24\107" + + "\1\6\123\107\1\6\213\107\1\6\5\0\2\6\246\107" + + "\1\6\46\107\2\6\1\107\6\6\51\107\6\6\1\107" + + "\1\6\55\0\1\6\1\0\1\6\2\0\1\6\2\0" + + "\1\6\1\0\10\6\33\107\4\6\4\107\15\6\6\0" + + "\5\6\1\107\4\6\13\0\1\6\1\0\3\6\53\107" + + "\37\0\4\6\2\107\1\0\143\107\1\6\1\107\10\0" + + "\1\6\6\0\2\107\2\0\1\6\4\0\2\107\12\0" + + "\3\107\2\6\1\107\17\6\1\0\1\107\1\0\36\107" + + "\33\0\2\6\131\107\13\0\1\107\16\6\12\0\41\107" + + "\11\0\2\107\4\6\1\107\2\6\1\0\30\107\4\0" + + "\1\107\11\0\1\107\3\0\1\107\5\0\22\6\31\107" + + "\3\0\4\6\13\107\5\6\30\107\1\6\6\107\1\6" + + "\2\0\6\6\10\0\52\107\72\0\66\107\3\0\1\107" + + "\22\0\1\107\7\0\12\107\2\0\2\6\12\0\1\6" + + "\20\107\3\0\1\6\10\107\2\6\2\107\2\6\26\107" + + "\1\6\7\107\1\6\1\107\3\6\4\107\2\6\1\0" + + "\1\107\7\0\2\6\2\0\2\6\3\0\1\107\10\6" + + "\1\0\4\6\2\107\1\6\3\107\2\0\2\6\12\0" + + "\4\107\7\6\2\107\1\6\1\0\2\6\3\0\1\6" + + "\6\107\4\6\2\107\2\6\26\107\1\6\7\107\1\6" + + "\2\107\1\6\2\107\1\6\2\107\2\6\1\0\1\6" + + "\5\0\4\6\2\0\2\6\3\0\3\6\1\0\7\6" + + "\4\107\1\6\1\107\7\6\14\0\3\107\1\0\13\6" + + "\3\0\1\6\11\107\1\6\3\107\1\6\26\107\1\6" + + "\7\107\1\6\2\107\1\6\5\107\2\6\1\0\1\107" + + "\10\0\1\6\3\0\1\6\3\0\2\6\1\107\17\6" + + "\2\107\2\0\2\6\12\0\1\6\1\107\7\6\1\107" + + "\6\0\1\6\3\0\1\6\10\107\2\6\2\107\2\6" + + "\26\107\1\6\7\107\1\6\2\107\1\6\5\107\2\6" + + "\1\0\1\107\7\0\2\6\2\0\2\6\3\0\7\6" + + "\3\0\4\6\2\107\1\6\3\107\2\0\2\6\12\0" + + "\1\6\1\107\20\6\1\0\1\107\1\6\6\107\3\6" + + "\3\107\1\6\4\107\3\6\2\107\1\6\1\107\1\6" + + "\2\107\3\6\2\107\3\6\3\107\3\6\14\107\4\6" + + "\5\0\3\6\3\0\1\6\4\0\2\6\1\107\6\6" + + "\1\0\16\6\12\0\11\6\1\107\6\6\5\0\10\107" + + "\1\6\3\107\1\6\27\107\1\6\20\107\2\6\1\0" + + "\1\107\7\0\1\6\3\0\1\6\4\0\7\6\2\0" + + "\1\6\3\107\2\6\1\107\2\6\2\107\2\0\2\6" + + "\12\0\20\6\1\107\3\0\1\6\10\107\1\6\3\107" + + "\1\6\27\107\1\6\12\107\1\6\5\107\2\6\1\0" + + "\1\107\7\0\1\6\3\0\1\6\4\0\7\6\2\0" + + "\6\6\2\107\1\6\2\107\2\0\2\6\12\0\1\6" + + "\2\107\1\0\14\6\4\0\11\107\1\6\3\107\1\6" + + "\51\107\2\0\1\107\7\0\1\6\3\0\1\6\4\0" + + "\1\107\5\6\3\107\1\0\7\6\3\107\2\0\2\6" + + "\12\0\12\6\6\107\1\6\3\0\1\6\22\107\3\6" + + "\30\107\1\6\11\107\1\6\1\107\2\6\7\107\3\6" + + "\1\0\4\6\6\0\1\6\1\0\1\6\10\0\6\6" + + "\12\0\2\6\2\0\15\6\60\107\1\0\2\107\7\0" + + "\4\6\10\107\10\0\1\6\12\0\47\6\2\107\1\6" + + "\1\107\1\6\5\107\1\6\30\107\1\6\1\107\1\6" + + "\12\107\1\0\2\107\11\0\1\107\2\6\5\107\1\6" + + "\1\107\1\6\7\0\1\6\12\0\2\6\4\107\40\6" + + "\1\107\27\6\2\0\6\6\12\0\13\6\1\0\1\6" + + "\1\0\1\6\1\0\4\6\2\0\10\107\1\6\44\107" + + "\4\6\24\0\1\6\2\0\5\107\13\0\1\6\44\0" + + "\11\6\1\0\71\6\53\107\24\0\1\107\12\0\6\6" + + "\6\107\4\0\4\107\3\0\1\107\3\0\2\107\7\0" + + "\3\107\4\0\15\107\14\0\1\107\17\0\2\6\46\107" + + "\1\6\1\107\5\6\1\107\2\6\53\107\1\6\115\107" + + "\1\6\4\107\2\6\7\107\1\6\1\107\1\6\4\107" + + "\2\6\51\107\1\6\4\107\2\6\41\107\1\6\4\107" + + "\2\6\7\107\1\6\1\107\1\6\4\107\2\6\17\107" + + "\1\6\71\107\1\6\4\107\2\6\103\107\2\6\3\0" + + "\40\6\20\107\20\6\126\107\2\6\6\107\3\6\u016c\107" + + "\2\6\21\107\1\6\32\107\5\6\113\107\3\6\13\107" + + "\7\6\22\107\4\0\11\6\23\107\3\0\13\6\22\107" + + "\2\0\14\6\15\107\1\6\3\107\1\6\2\0\14\6" + + "\64\107\40\0\3\6\1\107\3\6\2\107\1\0\2\6" + + "\12\0\41\6\17\0\6\6\131\107\7\6\5\107\2\0" + + "\42\107\1\0\1\107\5\6\106\107\12\6\37\107\1\6" + + "\14\0\4\6\14\0\12\6\12\0\36\107\2\6\5\107" + + "\13\6\54\107\4\6\32\107\6\6\12\0\46\6\27\107" + + "\5\0\4\6\65\107\12\0\1\6\35\0\2\6\13\0" + + "\6\6\12\0\15\6\1\107\10\6\16\0\1\6\20\0" + + "\61\6\5\0\57\107\21\0\10\107\3\6\12\0\21\6" + + "\11\0\14\6\3\0\36\107\15\0\2\107\12\0\54\107" + + "\16\0\14\6\44\107\24\0\10\6\12\0\3\6\3\107" + + "\12\0\44\107\2\6\11\107\7\6\53\107\2\6\3\107" + + "\20\6\3\0\1\6\25\0\4\107\1\0\6\107\1\0" + + "\2\107\3\0\1\107\5\6\300\107\100\0\26\107\2\6" + + "\6\107\2\6\46\107\2\6\6\107\2\6\10\107\1\6" + + "\1\107\1\6\1\107\1\6\1\107\1\6\37\107\2\6" + + "\65\107\1\6\7\107\1\6\1\107\3\6\3\107\1\6" + + "\7\107\3\6\4\107\2\6\6\107\4\6\15\107\5\6" + + "\3\107\1\6\7\107\16\6\5\0\30\6\2\3\5\0" + + "\20\6\2\107\23\6\1\107\13\6\5\0\1\6\12\0" + + "\1\6\1\107\15\6\1\107\20\6\15\107\3\6\41\107" + + "\17\6\15\0\4\6\1\0\3\6\14\0\21\6\1\107" + + "\4\6\1\107\2\6\12\107\1\6\1\107\3\6\5\107" + + "\6\6\1\107\1\6\1\107\1\6\1\107\1\6\4\107" + + "\1\6\13\107\2\6\4\107\5\6\5\107\4\6\1\107" + + "\21\6\51\107\u0177\6\345\107\6\6\4\107\3\0\2\107" + + "\14\6\46\107\1\6\1\107\5\6\1\107\2\6\70\107" + + "\7\6\1\107\17\6\1\0\27\107\11\6\7\107\1\6" + + "\7\107\1\6\7\107\1\6\7\107\1\6\7\107\1\6" + + "\7\107\1\6\7\107\1\6\7\107\1\6\40\0\57\6" + + "\1\107\325\6\3\107\31\6\11\107\6\0\1\6\5\107" + + "\2\6\5\107\4\6\126\107\2\6\2\0\2\6\3\107" + + "\1\6\132\107\1\6\4\107\5\6\53\107\1\6\136\107" + + "\21\6\40\107\60\6\320\107\100\6\215\107\103\6\56\107" + + "\2\6\15\107\3\6\20\107\12\0\2\107\24\6\57\107" + + "\1\0\4\6\12\0\1\6\37\107\2\0\120\107\2\0" + + "\45\6\11\107\2\6\147\107\2\6\100\107\5\6\2\107" + + "\1\6\1\107\1\6\5\107\30\6\20\107\1\0\3\107" + + "\1\0\4\107\1\0\27\107\5\0\4\6\1\0\13\6" + + "\1\107\7\6\64\107\14\6\2\0\62\107\22\0\12\6" + + "\12\0\6\6\22\0\6\107\3\6\1\107\1\6\2\107" + + "\13\0\34\107\10\0\2\6\27\107\15\0\14\6\35\107" + + "\3\6\4\0\57\107\16\0\16\6\1\107\12\0\6\6" + + "\5\107\1\0\12\107\12\0\5\107\1\6\51\107\16\0" + + "\11\6\3\107\1\0\10\107\2\0\2\6\12\0\6\6" + + "\27\107\3\6\1\107\3\0\62\107\1\0\1\107\3\0" + + "\2\107\2\0\5\107\2\0\1\107\1\0\1\107\30\6" + + "\3\107\2\6\13\107\5\0\2\6\3\107\2\0\12\6" + + "\6\107\2\6\6\107\2\6\6\107\11\6\7\107\1\6" + + "\7\107\1\6\53\107\1\6\16\107\6\6\163\107\10\0" + + "\1\6\2\0\2\6\12\0\6\6\244\107\14\6\27\107" + + "\4\6\61\107\4\6\u0100\3\156\107\2\6\152\107\46\6" + + "\7\107\14\6\5\107\5\6\1\107\1\0\12\107\1\6" + + "\15\107\1\6\5\107\1\6\1\107\1\6\2\107\1\6" + + "\2\107\1\6\154\107\41\6\153\107\22\6\100\107\2\6" + + "\66\107\50\6\15\107\3\6\20\0\20\6\20\0\3\6" + + "\2\107\30\6\3\107\31\6\1\107\6\6\5\107\1\6" + + "\207\107\2\6\1\0\4\6\1\107\13\6\12\0\7\6" + + "\32\107\4\6\1\107\1\6\32\107\13\6\131\107\3\6" + + "\6\107\2\6\6\107\2\6\6\107\2\6\3\107\3\6" + + "\2\107\3\6\2\107\22\6\3\0\4\6\14\107\1\6" + + "\32\107\1\6\23\107\1\6\2\107\1\6\17\107\2\6" + + "\16\107\42\6\173\107\105\6\65\107\210\6\1\0\202\6" + + "\35\107\3\6\61\107\17\6\1\0\37\6\40\107\15\6" + + "\36\107\5\6\46\107\5\0\5\6\36\107\2\6\44\107" + + "\4\6\10\107\1\6\5\107\52\6\236\107\2\6\12\0" + + "\6\6\44\107\4\6\44\107\4\6\50\107\10\6\64\107" + + "\14\6\13\107\1\6\17\107\1\6\7\107\1\6\2\107" + + "\1\6\13\107\1\6\17\107\1\6\7\107\1\6\2\107" + + "\103\6\67\107\11\6\26\107\12\6\10\107\30\6\6\107" + + "\1\6\52\107\1\6\11\107\105\6\6\107\2\6\1\107" + + "\1\6\54\107\1\6\2\107\3\6\1\107\2\6\27\107" + + "\12\6\27\107\11\6\37\107\101\6\23\107\1\6\2\107" + + "\12\6\26\107\12\6\32\107\106\6\70\107\6\6\2\107" + + "\100\6\1\107\3\0\1\6\2\0\5\6\4\0\4\107" + + "\1\6\3\107\1\6\35\107\2\6\3\0\4\6\1\0" + + "\40\6\35\107\3\6\35\107\43\6\10\107\1\6\34\107" + + "\2\0\31\6\66\107\12\6\26\107\12\6\23\107\15\6" + + "\22\107\156\6\111\107\67\6\63\107\15\6\63\107\15\6" + + "\44\107\4\0\10\6\12\0\u0146\6\52\107\1\6\2\0" + + "\3\6\2\107\113\6\3\0\35\107\12\6\1\107\10\6" + + "\26\107\13\0\37\6\22\107\4\0\52\6\25\107\33\6" + + "\27\107\11\6\3\0\65\107\17\0\37\6\13\0\2\107" + + "\2\0\1\107\11\6\4\0\55\107\13\0\2\6\1\0" + + "\4\6\1\0\12\6\1\0\2\6\31\107\7\6\12\0" + + "\6\6\3\0\44\107\16\0\1\6\12\0\4\6\1\107" + + "\2\0\1\107\10\6\43\107\1\0\2\6\1\107\11\6" + + "\3\0\60\107\16\0\4\107\4\6\4\0\1\6\14\0" + + "\1\107\1\6\1\107\43\6\22\107\1\6\31\107\14\0" + + "\6\6\1\0\2\107\1\0\76\6\7\107\1\6\1\107" + + "\1\6\4\107\1\6\17\107\1\6\12\107\7\6\57\107" + + "\14\0\5\6\12\0\6\6\4\0\1\6\10\107\2\6" + + "\2\107\2\6\26\107\1\6\7\107\1\6\2\107\1\6" + + "\5\107\1\6\2\0\1\107\7\0\2\6\2\0\2\6" + + "\3\0\2\6\1\107\6\6\1\0\5\6\5\107\2\0" + + "\2\6\7\0\3\6\5\0\213\6\65\107\22\0\4\107" + + "\5\6\12\0\4\6\1\0\3\107\36\6\60\107\24\0" + + "\2\107\1\6\1\107\10\6\12\0\246\6\57\107\7\0" + + "\2\6\11\0\27\6\4\107\2\0\42\6\60\107\21\0" + + "\3\6\1\107\13\6\12\0\46\6\53\107\15\0\1\107" + + "\7\6\12\0\66\6\33\107\2\6\17\0\4\6\12\0" + + "\6\6\7\107\271\6\54\107\17\0\145\6\100\107\12\0" + + "\25\6\10\107\2\6\1\107\2\6\10\107\1\6\2\107" + + "\1\6\30\107\6\0\1\6\2\0\2\6\4\0\1\107" + + "\1\0\1\107\2\0\14\6\12\0\106\6\10\107\2\6" + + "\47\107\7\0\2\6\7\0\1\107\1\6\1\107\1\0" + + "\33\6\1\107\12\0\50\107\7\0\1\107\4\0\10\6" + + "\1\0\10\6\1\107\13\0\56\107\20\0\3\6\1\107" + + "\22\6\111\107\7\6\11\107\1\6\45\107\10\0\1\6" + + "\10\0\1\107\17\6\12\0\30\6\36\107\2\6\26\0" + + "\1\6\16\0\111\6\7\107\1\6\2\107\1\6\46\107" + + "\6\0\3\6\1\0\1\6\2\0\1\6\7\0\1\107" + + "\1\0\10\6\12\0\6\6\6\107\1\6\2\107\1\6" + + "\40\107\5\0\1\6\2\0\1\6\5\0\1\107\7\6" + + "\12\0\u0136\6\23\107\4\0\11\6\2\0\1\107\1\0" + + "\15\107\1\6\42\107\7\0\3\6\5\0\15\6\12\0" + + "\126\6\1\107\54\6\4\107\37\6\232\107\146\6\157\107" + + "\21\6\304\107\u014c\6\141\107\17\6\60\107\21\0\6\107" + + "\17\0\252\6\107\107\271\6\71\107\7\6\37\107\1\6" + + "\12\0\6\6\117\107\1\6\12\0\6\6\36\107\2\6" + + "\5\0\13\6\60\107\7\0\11\6\4\107\14\6\12\0" + + "\11\6\25\107\5\6\23\107\260\6\100\107\200\6\113\107" + + "\4\6\1\0\1\107\67\0\7\6\4\0\15\107\100\6" + + "\2\107\1\6\1\107\1\0\13\6\2\0\16\6\370\107" + + "\10\6\326\107\52\6\11\107\u01e7\6\4\107\1\6\7\107" + + "\1\6\2\107\1\6\43\107\17\6\1\107\35\6\3\107" + + "\2\6\1\107\16\6\4\107\10\6\u018c\107\4\6\153\107" + + "\5\6\15\107\3\6\11\107\7\6\12\107\3\6\2\0" + + "\1\6\4\0\134\6\56\0\2\6\27\0\u011e\6\5\0" + + "\3\6\26\0\2\6\7\0\36\6\4\0\224\6\3\0" + + "\273\6\125\107\1\6\107\107\1\6\2\107\2\6\1\107" + + "\2\6\2\107\2\6\4\107\1\6\14\107\1\6\1\107" + + "\1\6\7\107\1\6\101\107\1\6\4\107\2\6\10\107" + + "\1\6\7\107\1\6\34\107\1\6\4\107\1\6\5\107" + + "\1\6\1\107\3\6\7\107\1\6\u0154\107\2\6\31\107" + + "\1\6\31\107\1\6\37\107\1\6\31\107\1\6\37\107" + + "\1\6\31\107\1\6\37\107\1\6\31\107\1\6\37\107" + + "\1\6\31\107\1\6\10\107\2\6\151\0\4\6\62\0" + + "\10\6\1\0\16\6\1\0\26\6\5\0\1\6\17\0" + + "\120\6\37\107\6\6\6\107\325\6\7\0\1\6\21\0" + + "\2\6\7\0\1\6\2\0\1\6\5\0\5\6\76\107" + + "\41\6\1\0\160\6\55\107\3\6\7\0\7\107\2\6" + + "\12\0\4\6\1\107\u0141\6\36\107\1\0\21\6\54\107" + + "\16\0\5\6\1\107\320\6\34\107\16\0\346\6\7\107" + + "\1\6\4\107\1\6\2\107\1\6\17\107\1\6\305\107" + + "\13\6\7\0\51\6\104\107\7\0\1\107\4\6\12\0" + + "\u0156\6\1\107\117\6\4\107\1\6\33\107\1\6\2\107" + + "\1\6\1\107\2\6\1\107\1\6\12\107\1\6\4\107" + + "\1\6\1\107\1\6\1\107\6\6\1\107\4\6\1\107" + + "\1\6\1\107\1\6\1\107\1\6\3\107\1\6\2\107" + + "\1\6\1\107\2\6\1\107\1\6\1\107\1\6\1\107" + + "\1\6\1\107\1\6\1\107\1\6\2\107\1\6\1\107" + + "\2\6\4\107\1\6\7\107\1\6\4\107\1\6\4\107" + + "\1\6\1\107\1\6\12\107\1\6\21\107\5\6\3\107" + + "\1\6\5\107\1\6\21\107\u0134\6\12\0\6\6\340\107" + + "\40\6\72\107\6\6\336\107\2\6\u0182\107\16\6\u0131\107" + + "\37\6\36\107\342\6\113\107\5\6\u0160\107\121\6\1\0" + + "\36\6\140\0\200\6\360\0\20\6"; + + private static int[] zzUnpackcmap_blocks() { + int[] result = new int[32768]; + int offset = 0; + offset = zzUnpackcmap_blocks(ZZ_CMAP_BLOCKS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackcmap_blocks(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** + * Translates DFA states to action switch labels. + */ + private static final int[] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\4\0\1\1\1\2\1\3\2\4\1\5\1\6\1\7" + + "\1\5\1\10\1\11\1\5\1\7\1\5\1\7\1\5" + + "\2\12\3\5\1\13\1\14\23\7\1\1\1\15\5\1" + + "\1\16\10\1\1\17\4\1\1\20\1\1\1\21\2\6" + + "\1\22\1\6\1\2\1\10\1\0\1\23\1\10\1\24" + + "\1\25\1\26\1\27\1\30\2\27\1\24\1\27\1\12" + + "\3\27\1\0\1\5\1\13\14\7\1\14\10\7\1\14" + + "\33\7\1\31\4\0\1\32\1\0\1\33\26\0\1\21" + + "\1\22\1\34\1\6\1\35\1\6\1\2\1\10\1\36" + + "\1\23\3\10\1\37\1\30\1\12\1\0\1\24\2\30" + + "\1\12\1\2\32\7\1\40\31\7\1\40\4\7\37\0" + + "\1\41\1\6\1\2\1\10\1\42\2\27\1\2\23\7" + + "\1\0\1\14\16\7\1\43\1\7\2\0\1\44\12\0" + + "\1\45\10\0\1\46\7\0\1\47\1\6\1\2\1\10" + + "\1\2\6\7\1\14\5\7\1\0\12\7\35\0\1\6" + + "\1\2\1\10\1\2\11\7\1\0\4\7\22\0\1\2" + + "\4\7\1\0\3\7\4\0\1\45\4\0\1\7\1\0" + + "\1\7\11\0\1\7\1\0\1\7\5\0\1\14\7\0"; + + private static int[] zzUnpackAction() { + int[] result = new int[498]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int[] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\110\0\220\0\330\0\u0120\0\u0168\0\u01b0\0\u01f8" + + "\0\u0240\0\u0288\0\u02d0\0\u0318\0\u0360\0\u03a8\0\u01f8\0\u03f0" + + "\0\u01f8\0\u0438\0\u0480\0\u04c8\0\u0510\0\u0558\0\u01f8\0\u05a0" + + "\0\u05e8\0\u0630\0\u0318\0\u0678\0\u06c0\0\u0708\0\u0750\0\u0798" + + "\0\u07e0\0\u0828\0\u0870\0\u08b8\0\u0900\0\u0948\0\u0990\0\u09d8" + + "\0\u0a20\0\u0a68\0\u0ab0\0\u0af8\0\u0b40\0\u0b88\0\u0bd0\0\u01f8" + + "\0\u0c18\0\u0c60\0\u0ca8\0\u0cf0\0\u0d38\0\u01f8\0\u0d80\0\u0dc8" + + "\0\u0e10\0\u0e58\0\u0ea0\0\u0ee8\0\u0f30\0\u0f78\0\u01f8\0\u0fc0" + + "\0\u1008\0\u1050\0\u1098\0\u01f8\0\u10e0\0\u1128\0\u1170\0\u11b8" + + "\0\u1200\0\u1248\0\u1290\0\u12d8\0\u1320\0\u01f8\0\u1368\0\u13b0" + + "\0\u13f8\0\u01f8\0\u1440\0\u1488\0\u14d0\0\u1518\0\u1440\0\u1560" + + "\0\u1440\0\u15a8\0\u15f0\0\u1638\0\u0288\0\u1680\0\u16c8\0\u1710" + + "\0\u1758\0\u17a0\0\u17e8\0\u1830\0\u1878\0\u18c0\0\u1908\0\u1950" + + "\0\u1998\0\u19e0\0\u1a28\0\u1a70\0\u1ab8\0\u1b00\0\u1b48\0\u1b90" + + "\0\u1bd8\0\u1c20\0\u1c68\0\u1cb0\0\u1cf8\0\u1d40\0\u1d88\0\u1dd0" + + "\0\u1e18\0\u1e60\0\u1ea8\0\u1ef0\0\u1f38\0\u1f80\0\u1fc8\0\u2010" + + "\0\u2058\0\u20a0\0\u20e8\0\u2130\0\u2178\0\u21c0\0\u2208\0\u2250" + + "\0\u2298\0\u22e0\0\u2328\0\u2370\0\u23b8\0\u2400\0\u2448\0\u2490" + + "\0\u01f8\0\u24d8\0\u2520\0\u2568\0\u25b0\0\u01f8\0\u25f8\0\u01f8" + + "\0\u2640\0\u2688\0\u26d0\0\u2718\0\u2760\0\u27a8\0\u27f0\0\u2838" + + "\0\u2880\0\u28c8\0\u2910\0\u2958\0\u29a0\0\u29e8\0\u2a30\0\u2a78" + + "\0\u2ac0\0\u2b08\0\u2b50\0\u2b98\0\u2be0\0\u2c28\0\u01f8\0\u01f8" + + "\0\u01f8\0\u2c70\0\u01f8\0\u2cb8\0\u2d00\0\u2d48\0\u01f8\0\u1320" + + "\0\u2d90\0\u2dd8\0\u2e20\0\u2e68\0\u1440\0\u2eb0\0\u2ef8\0\u2f40" + + "\0\u2f88\0\u2fd0\0\u3018\0\u3060\0\u30a8\0\u30f0\0\u3138\0\u3180" + + "\0\u31c8\0\u3210\0\u3258\0\u32a0\0\u32e8\0\u3330\0\u3378\0\u33c0" + + "\0\u3408\0\u3450\0\u3498\0\u34e0\0\u3528\0\u3570\0\u35b8\0\u3600" + + "\0\u3648\0\u3690\0\u36d8\0\u3720\0\u3768\0\u37b0\0\u37f8\0\u3840" + + "\0\u3888\0\u38d0\0\u3918\0\u3960\0\u39a8\0\u39f0\0\u3a38\0\u3a80" + + "\0\u3ac8\0\u3b10\0\u3b58\0\u3ba0\0\u3be8\0\u3c30\0\u3c78\0\u3cc0" + + "\0\u3d08\0\u3d50\0\u3d98\0\u3de0\0\u3e28\0\u3e70\0\u3eb8\0\u3f00" + + "\0\u0318\0\u3f48\0\u3f90\0\u3fd8\0\u4020\0\u4068\0\u40b0\0\u40f8" + + "\0\u4140\0\u4188\0\u41d0\0\u4218\0\u4260\0\u42a8\0\u42f0\0\u4338" + + "\0\u4380\0\u43c8\0\u4410\0\u4458\0\u44a0\0\u44e8\0\u4530\0\u4578" + + "\0\u45c0\0\u4608\0\u4650\0\u4698\0\u46e0\0\u4728\0\u4770\0\u47b8" + + "\0\u4800\0\u4848\0\u4890\0\u48d8\0\u01f8\0\u4920\0\u4968\0\u49b0" + + "\0\u01f8\0\u2eb0\0\u49f8\0\u4a40\0\u4a88\0\u4ad0\0\u4b18\0\u4b60" + + "\0\u4ba8\0\u4bf0\0\u4c38\0\u4c80\0\u4cc8\0\u4d10\0\u4d58\0\u4da0" + + "\0\u4de8\0\u4e30\0\u4e78\0\u4ec0\0\u4f08\0\u4f50\0\u4f98\0\u4fe0" + + "\0\u3e28\0\u5028\0\u5070\0\u50b8\0\u5100\0\u5148\0\u5190\0\u51d8" + + "\0\u5220\0\u5268\0\u52b0\0\u52f8\0\u5340\0\u5388\0\u53d0\0\u0318" + + "\0\u5418\0\u5460\0\u54a8\0\u54f0\0\u5538\0\u5580\0\u55c8\0\u5610" + + "\0\u5658\0\u56a0\0\u56e8\0\u5730\0\u5778\0\u57c0\0\u01f8\0\u5808" + + "\0\u5850\0\u5898\0\u58e0\0\u5928\0\u5970\0\u59b8\0\u5a00\0\u5a48" + + "\0\u5a90\0\u5ad8\0\u5b20\0\u5b68\0\u5bb0\0\u5bf8\0\u5c40\0\u5c88" + + "\0\u5cd0\0\u5d18\0\u5d60\0\u5da8\0\u5df0\0\u5e38\0\u5e80\0\u5ec8" + + "\0\u5f10\0\u5f58\0\u5fa0\0\u5fe8\0\u6030\0\u6078\0\u60c0\0\u6108" + + "\0\u6150\0\u6198\0\u61e0\0\u6228\0\u6270\0\u62b8\0\u6300\0\u6348" + + "\0\u6390\0\u63d8\0\u6420\0\u6468\0\u54f0\0\u64b0\0\u64f8\0\u6540" + + "\0\u6588\0\u65d0\0\u6618\0\u6660\0\u66a8\0\u66f0\0\u6738\0\u6780" + + "\0\u67c8\0\u6810\0\u6858\0\u68a0\0\u68e8\0\u6930\0\u6978\0\u5a48" + + "\0\u69c0\0\u6a08\0\u6a50\0\u6a98\0\u6ae0\0\u6b28\0\u6b70\0\u5c88" + + "\0\u6bb8\0\u6c00\0\u6c48\0\u6c90\0\u6cd8\0\u6d20\0\u6d68\0\u6db0" + + "\0\u6df8\0\u6e40\0\u6e88\0\u6ed0\0\u6f18\0\u6f60\0\u6fa8\0\u6ff0" + + "\0\u7038\0\u7080\0\u70c8\0\u7110\0\u7158\0\u71a0\0\u71e8\0\u7230" + + "\0\u7278\0\u72c0\0\u7308\0\u7350\0\u7398\0\u73e0\0\u7428\0\u7470" + + "\0\u74b8\0\u7500\0\u7548\0\u7590\0\u75d8\0\u7620\0\u7668\0\u76b0" + + "\0\u76f8\0\u7740\0\u7788\0\u77d0\0\u7818\0\u7860\0\u78a8\0\u78f0" + + "\0\u7938\0\u7980\0\u79c8\0\u7a10\0\u7a58\0\u7aa0\0\u7ae8\0\u7b30" + + "\0\u7b78\0\u7bc0\0\u7c08\0\u7c50\0\u7c98\0\u7ce0\0\u7d28\0\u7d70" + + "\0\u7db8\0\u7e00\0\u7e48\0\u7e90\0\u7ed8\0\u7f20\0\u7f68\0\u7fb0" + + "\0\u7ff8\0\u8040\0\u01f8\0\u8088\0\u80d0\0\u8118\0\u8160\0\u81a8" + + "\0\u81f0\0\u8238"; + + private static int[] zzUnpackRowMap() { + int[] result = new int[498]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length() - 1; + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int[] ZZ_TRANS = zzUnpacktrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\6\1\7\1\10\1\6\1\7\1\11\1\6\1\12" + + "\1\13\1\6\1\14\1\15\1\16\1\17\1\12\1\20" + + "\1\21\1\22\1\23\1\24\1\25\4\26\1\27\1\30" + + "\1\12\1\31\1\27\1\32\11\14\1\6\1\12\1\33" + + "\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\14" + + "\1\43\1\14\1\44\1\45\1\46\1\47\1\50\1\14" + + "\1\51\1\52\1\53\1\54\1\55\1\56\3\14\2\17" + + "\1\6\1\14\2\57\1\60\13\57\1\61\41\57\1\62" + + "\1\57\1\63\15\57\1\64\7\57\2\65\1\66\13\65" + + "\1\67\13\65\1\70\3\65\1\71\21\65\1\72\1\65" + + "\1\73\15\65\1\74\3\65\1\75\3\65\2\76\1\77" + + "\55\76\1\100\1\76\1\101\15\76\1\102\7\76\2\103" + + "\1\104\5\103\1\105\37\103\1\106\37\103\1\6\2\0" + + "\1\6\2\0\1\6\2\0\2\6\11\0\5\6\5\0" + + "\13\6\1\0\32\6\2\0\2\6\1\0\1\7\2\0" + + "\1\7\215\0\1\10\140\0\1\27\54\0\2\107\1\110" + + "\5\107\1\111\37\107\1\112\37\107\1\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\32\14\2\0\2\14\13\0" + + "\1\27\17\0\1\27\54\0\2\114\1\115\11\114\1\116" + + "\33\114\1\117\37\114\17\0\1\27\13\0\1\27\75\0" + + "\1\27\11\0\1\27\100\0\5\120\75\0\1\121\4\0" + + "\1\122\7\0\1\27\54\0\1\123\2\0\1\123\2\0" + + "\1\123\2\0\2\123\7\0\1\120\1\0\4\124\1\125" + + "\5\0\2\123\1\126\1\127\1\130\1\127\1\123\1\131" + + "\1\123\1\132\1\123\1\0\1\133\1\123\1\126\1\123" + + "\1\127\1\130\1\127\4\123\1\131\13\123\1\132\2\123" + + "\2\0\3\123\2\0\1\123\2\0\1\123\2\0\2\123" + + "\7\0\1\120\1\0\5\26\5\0\3\123\1\127\1\130" + + "\1\127\1\123\1\131\3\123\1\0\1\134\3\123\1\127" + + "\1\130\1\127\4\123\1\131\16\123\2\0\2\123\32\0" + + "\1\135\1\27\107\0\1\27\1\136\53\0\1\6\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\137\11\0\5\6" + + "\5\0\1\6\11\137\1\6\1\0\32\137\2\0\1\6" + + "\1\137\1\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\2\14\1\140\16\14\1\141\1\142\1\143\6\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\16\14" + + "\1\144\2\14\1\145\6\14\1\146\1\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\1\14\1\147" + + "\6\14\1\150\2\14\1\151\2\14\1\152\13\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\5\14" + + "\1\153\10\14\1\154\13\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\13\14\1\155\1\14\1\156" + + "\11\14\1\157\2\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\1\14\1\160\7\14\1\161\1\14" + + "\1\162\2\14\1\163\13\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\16\14\1\164\13\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\6\14" + + "\1\165\5\14\1\166\1\167\14\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\16\14\1\170\13\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\16\14\1\171\13\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\1\14\1\172\3\14\1\173\10\14" + + "\1\174\5\14\1\175\5\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\17\14\1\176\12\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\1\14" + + "\1\177\3\14\1\200\13\14\1\201\2\14\1\202\5\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\5\14\1\203\24\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\5\14\1\204\2\14\1\205\12\14" + + "\1\206\1\207\1\14\1\210\1\14\1\211\1\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\10\14" + + "\1\212\5\14\1\33\2\14\1\213\10\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\22\14\1\214" + + "\7\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\1\14\1\215\14\14\1\216\13\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\10\14\1\217" + + "\1\220\20\14\2\0\2\14\2\57\1\0\13\57\1\0" + + "\41\57\1\0\1\57\1\0\15\57\1\0\7\57\23\0" + + "\1\221\147\0\1\222\11\0\1\223\107\0\1\224\112\0" + + "\1\225\7\0\2\65\1\0\13\65\1\0\13\65\1\0" + + "\3\65\1\0\21\65\1\0\1\65\1\0\15\65\1\0" + + "\3\65\1\0\3\65\23\0\1\226\107\0\1\227\10\0" + + "\1\230\2\0\11\231\3\0\31\231\57\0\1\232\1\0" + + "\1\233\1\234\1\235\3\0\1\236\4\0\1\237\1\240" + + "\1\0\1\241\1\242\1\243\1\0\1\244\73\0\1\245" + + "\11\0\1\246\107\0\1\247\112\0\1\250\45\0\1\251" + + "\51\0\2\76\1\0\55\76\1\0\1\76\1\0\15\76" + + "\1\0\7\76\63\0\1\252\11\0\1\253\107\0\1\254" + + "\112\0\1\255\7\0\2\103\1\0\5\103\1\0\37\103" + + "\1\0\37\103\10\0\1\256\77\0\2\257\4\0\100\257" + + "\1\0\1\257\2\107\1\110\5\107\1\260\37\107\1\112" + + "\37\107\10\110\1\261\37\110\1\262\37\110\10\0\1\263" + + "\77\0\2\110\4\0\2\110\1\107\3\110\1\107\7\110" + + "\4\107\20\110\1\107\3\110\1\107\3\110\1\107\6\110" + + "\1\107\3\110\3\107\1\264\7\110\1\0\1\110\1\6" + + "\2\0\1\6\2\0\1\6\2\0\2\6\11\0\5\6" + + "\5\0\13\6\1\0\24\6\1\265\5\6\2\0\2\6" + + "\2\266\1\0\11\266\1\267\73\266\14\0\1\267\73\0" + + "\2\266\1\0\5\266\1\114\3\266\1\270\7\266\3\271" + + "\1\272\20\266\1\114\3\266\1\114\3\266\1\114\6\266" + + "\1\114\3\266\3\114\1\273\11\266\1\123\2\0\1\123" + + "\2\0\1\123\2\0\2\123\11\0\5\120\5\0\3\123" + + "\1\127\1\130\1\127\5\123\1\0\4\123\1\127\1\130" + + "\1\127\23\123\2\0\2\123\16\0\1\274\71\0\1\123" + + "\2\0\1\123\2\0\1\123\2\0\2\123\11\0\5\123" + + "\5\0\13\123\1\0\32\123\2\0\3\123\2\0\1\123" + + "\2\0\1\123\2\0\2\123\7\0\1\120\1\0\4\124" + + "\1\125\5\0\3\123\1\127\1\130\1\127\1\123\1\275" + + "\3\123\1\0\1\133\3\123\1\127\1\130\1\127\4\123" + + "\1\275\16\123\2\0\3\123\2\0\1\123\2\0\1\123" + + "\2\0\2\123\7\0\1\120\1\0\5\125\5\0\3\123" + + "\1\127\1\130\1\127\5\123\1\0\4\123\1\127\1\130" + + "\1\127\23\123\2\0\3\123\2\0\1\123\2\0\1\123" + + "\2\0\2\123\11\0\2\276\3\123\5\0\13\123\1\0" + + "\32\123\2\0\3\123\2\0\1\123\2\0\1\123\2\0" + + "\2\123\4\0\1\277\1\0\1\277\2\0\5\300\5\0" + + "\13\123\1\0\32\123\2\0\3\123\2\0\1\123\2\0" + + "\1\123\2\0\2\123\11\0\5\301\5\0\1\123\5\301" + + "\5\123\1\0\1\123\6\301\23\123\2\0\3\123\2\0" + + "\1\123\2\0\1\123\2\0\2\123\11\0\4\302\1\123" + + "\5\0\13\123\1\0\1\133\31\123\2\0\3\123\2\0" + + "\1\123\2\0\1\123\2\0\2\123\11\0\5\303\5\0" + + "\13\123\1\0\1\134\31\123\2\0\2\123\33\0\1\27" + + "\1\12\53\0\1\137\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\137\11\0\5\137\5\0\1\6\11\137\1\304" + + "\1\0\32\137\2\0\2\137\1\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\22\14\1\305\7\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\5\14\1\306" + + "\24\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\22\14\1\307\7\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\10\14\1\310\21\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\16\14" + + "\1\311\13\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\5\14\1\312\24\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\23\14\1\313\6\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\22\14\1\314\1\315\6\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\1\14\1\215\30\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\1\14" + + "\1\316\30\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\15\14\1\317\14\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\6\14\1\320\23\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\24\14\1\321\5\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\22\14\1\314\7\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\24\14\1\322" + + "\5\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\17\14\1\323\3\14\1\324\6\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\13\14\1\325" + + "\16\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\15\14\1\326\14\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\16\14\1\327\13\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\21\14" + + "\1\33\10\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\23\14\1\330\6\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\1\331\4\14\1\332" + + "\1\14\1\333\3\14\1\333\1\14\1\334\14\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\17\14" + + "\1\335\12\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\22\14\1\336\1\337\6\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\15\14\1\340" + + "\14\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\4\14\1\341\25\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\23\14\1\342\6\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\26\14" + + "\1\33\3\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\15\14\1\343\14\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\13\14\1\344\16\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\5\14\1\345\24\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\3\14\1\346\26\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\21\14\1\347" + + "\10\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\11\14\1\350\4\14\1\351\13\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\2\14\1\352" + + "\27\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\3\14\1\353\14\14\1\354\2\14\1\355\6\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\1\14\1\356\30\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\16\14\1\357\13\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\1\14\1\360" + + "\17\14\1\361\10\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\17\14\1\362\12\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\11\14\1\363" + + "\20\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\15\14\1\364\14\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\11\14\1\365\7\14\1\366" + + "\10\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\1\14\1\367\22\14\1\370\3\14\1\33\1\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\5\14\1\365\24\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\21\14\1\371\10\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\11\14\1\372" + + "\1\14\1\373\16\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\11\14\1\374\20\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\23\14\1\375" + + "\6\14\2\0\2\14\65\0\1\376\113\0\1\377\113\0" + + "\1\u0100\112\0\1\u0101\43\0\1\230\2\0\11\231\3\0" + + "\31\231\4\0\34\231\1\230\53\231\76\0\1\u0102\64\0" + + "\1\u0103\113\0\1\u0104\131\0\1\u0105\75\0\1\u0106\74\0" + + "\1\u0107\106\0\1\u0108\113\0\1\u0109\107\0\1\u010a\3\0" + + "\1\u010b\106\0\1\u010c\5\0\1\u010d\5\0\1\u010e\70\0" + + "\1\u010f\115\0\1\u0110\113\0\1\u0111\113\0\1\u0112\112\0" + + "\1\u0113\64\0\1\u0114\1\u0115\4\0\1\u0116\1\0\1\u0117" + + "\11\0\1\u0118\75\0\1\u0119\113\0\1\u011a\113\0\1\u011b" + + "\112\0\1\u011c\17\0\1\u011d\77\0\2\110\4\0\100\110" + + "\1\0\11\110\1\261\13\110\5\u011e\6\110\5\u011e\4\110" + + "\1\262\2\110\6\u011e\27\110\1\6\2\0\1\6\2\0" + + "\1\6\2\0\2\6\11\0\5\u011f\5\0\1\6\5\u011f" + + "\5\6\1\0\1\6\6\u011f\23\6\2\0\2\6\2\266" + + "\1\0\11\266\1\116\75\266\1\0\11\266\1\267\7\266" + + "\4\272\62\266\1\0\11\266\1\267\7\266\4\114\62\266" + + "\1\0\11\266\1\116\7\266\5\u0120\6\266\5\u0120\7\266" + + "\6\u0120\27\266\23\0\1\u0121\64\0\1\123\2\0\1\123" + + "\2\0\1\123\2\0\2\123\11\0\2\276\3\123\5\0" + + "\13\123\1\0\1\u0122\31\123\2\0\2\123\24\0\5\300" + + "\57\0\1\123\2\0\1\123\2\0\1\123\2\0\2\123" + + "\11\0\5\300\5\0\3\123\1\127\1\123\1\127\5\123" + + "\1\0\4\123\1\127\1\123\1\127\23\123\2\0\3\123" + + "\2\0\1\123\2\0\1\123\2\0\2\123\11\0\5\301" + + "\5\0\1\123\5\301\1\123\1\275\3\123\1\0\1\u0123" + + "\6\301\4\123\1\275\16\123\2\0\3\123\2\0\1\123" + + "\2\0\1\123\2\0\2\123\11\0\4\302\1\123\5\0" + + "\7\123\1\275\3\123\1\0\1\133\12\123\1\275\16\123" + + "\2\0\3\123\2\0\1\123\2\0\1\123\2\0\2\123" + + "\11\0\5\303\5\0\7\123\1\131\3\123\1\0\1\134" + + "\12\123\1\131\16\123\2\0\2\123\1\6\2\0\1\6" + + "\2\0\1\6\2\0\2\6\11\0\5\6\5\0\13\6" + + "\1\0\24\6\1\u0124\5\6\2\0\2\6\1\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\23\14\1\u0125\6\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\23\14\1\355\6\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\5\14\1\u0126\24\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\21\14\1\u0127" + + "\10\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\13\14\1\u0128\16\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\1\14\1\u0129\30\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\5\14" + + "\1\371\24\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\5\14\1\33\24\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\3\14\1\375\26\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\22\14\1\365\7\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\22\14\1\u012a\1\u012b\6\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\1\14" + + "\1\u012c\30\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\2\14\1\u012d\27\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\14\14\1\33\15\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\16\14\1\u012e\13\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\5\14\1\u012f\24\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\22\14\1\370" + + "\7\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\1\14\1\u0130\30\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\1\14\1\u0131\30\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\16\14" + + "\1\33\13\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\11\14\1\u0132\20\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\20\14\1\33\11\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\5\14\1\33\15\14\1\33\6\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\5\14\1\33\10\14" + + "\1\u0133\5\14\1\175\5\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\13\14\1\u0134\2\14\1\u0126" + + "\13\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\23\14\1\u0135\6\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\5\14\1\u0136\24\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\7\14" + + "\1\371\22\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\24\14\1\374\5\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\11\14\1\u0137\20\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\6\0\1\u0138\2\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\32\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\13\14\1\33\16\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\15\14\1\u0139" + + "\14\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\12\14\1\u013a\17\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\14\14\1\u013b\15\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\25\14" + + "\1\u013c\4\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\23\14\1\u013d\1\14\1\u013e\4\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\13\14" + + "\1\u013f\16\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\16\14\1\u0140\13\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\24\14\1\u0141\5\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\24\14\1\u0142\5\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\13\14\1\u0143\16\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\21\14\1\u0131" + + "\10\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\23\14\1\u013f\6\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\11\14\1\u0144\20\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\5\14" + + "\1\163\24\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\23\14\1\315\6\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\3\14\1\u0145\26\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\22\14\1\33\7\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\16\14\1\u0146\13\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\15\14\1\u0147" + + "\14\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\5\14\1\u0148\24\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\4\14\1\33\25\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\1\14" + + "\1\u0149\30\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\13\14\1\314\16\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\10\14\1\33\21\14" + + "\2\0\2\14\57\0\1\377\61\0\1\u014a\147\0\1\u014b" + + "\40\0\1\u014c\162\0\1\u014d\107\0\1\u014e\103\0\1\u014f" + + "\71\0\1\u0150\1\0\1\u0151\110\0\1\u0152\16\0\1\u0153" + + "\106\0\1\u0154\106\0\1\u0155\111\0\1\u0156\71\0\1\u0157" + + "\13\0\1\u0158\103\0\1\u0159\113\0\1\u015a\72\0\1\u015b" + + "\126\0\1\u015c\105\0\1\u015d\73\0\1\u0111\61\0\1\u015e" + + "\147\0\1\u015f\40\0\1\u0160\155\0\1\u0161\107\0\1\u0162" + + "\106\0\1\u0163\103\0\1\u0164\77\0\1\u0165\113\0\1\u011a" + + "\61\0\1\u0166\147\0\1\u0167\40\0\1\u0168\65\0\10\110" + + "\1\261\13\110\5\u0169\6\110\5\u0169\4\110\1\262\2\110" + + "\6\u0169\27\110\1\6\2\0\1\6\2\0\1\6\2\0" + + "\2\6\11\0\5\u016a\5\0\1\6\5\u016a\5\6\1\0" + + "\1\6\6\u016a\23\6\2\0\2\6\2\266\1\0\11\266" + + "\1\116\7\266\5\u016b\6\266\5\u016b\7\266\6\u016b\27\266" + + "\1\123\2\0\1\123\2\0\1\123\2\0\2\123\11\0" + + "\5\301\5\0\1\123\5\301\5\123\1\0\1\u0123\6\301" + + "\23\123\2\0\2\123\1\6\2\0\1\6\2\0\1\6" + + "\2\0\2\6\11\0\5\u016c\5\0\1\6\5\u016c\5\6" + + "\1\0\1\6\6\u016c\23\6\2\0\2\6\1\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\21\14\1\u016d\10\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\21\14\1\u012a\10\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\16\14\1\173\13\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\5\14\1\u016e" + + "\24\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\12\14\1\33\17\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\23\14\1\33\6\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\11\14" + + "\1\u016f\20\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\24\14\1\u0170\5\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\13\14\1\313\16\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\21\14\1\u0171\10\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\15\14\1\u0172\14\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\13\14\1\u0173" + + "\16\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\23\14\1\371\6\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\3\14\1\u0174\26\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\15\14" + + "\1\u0175\14\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\5\14\1\u0176\24\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\1\14\1\u0177\30\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\21\14\1\u0178\10\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\25\14\1\314\4\14\2\0\2\14" + + "\74\0\1\u0179\13\0\1\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\1\14\1\u017a\30\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\11\14\1\u0171\20\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\1\14\1\u017b\30\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\5\14\1\u017c\24\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\11\14\1\u017d" + + "\20\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\11\14\1\u017e\20\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\21\14\1\372\10\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\11\14" + + "\1\u017f\20\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\21\14\1\u0180\10\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\5\14\1\372\24\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\3\14\1\u0181\26\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\10\14\1\u0182\21\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\26\14\1\u0139" + + "\3\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\22\14\1\u0183\7\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\23\14\1\217\6\14\2\0" + + "\2\14\23\0\1\u0184\115\0\1\u014a\42\0\1\377\22\0" + + "\1\u0185\1\0\1\u0185\1\u014c\10\u0185\6\u014c\1\u0185\1\0" + + "\1\u0185\1\0\2\u0185\11\u014c\2\0\1\u0185\31\u014c\66\0" + + "\1\u0186\104\0\1\u0187\123\0\1\u0188\102\0\1\u0189\100\0" + + "\1\u018a\5\0\1\u018b\101\0\1\u018c\107\0\1\u018d\120\0" + + "\1\u018e\72\0\1\u018f\132\0\1\u0190\74\0\1\u0191\101\0" + + "\1\u0192\111\0\1\u0193\10\0\1\u0194\107\0\1\u0157\107\0" + + "\1\u0195\113\0\1\u0196\36\0\1\u0197\115\0\1\u015e\42\0" + + "\1\u0111\22\0\1\u0198\1\0\1\u0198\1\u0160\10\u0198\6\u0160" + + "\1\u0198\1\0\1\u0198\1\0\2\u0198\11\u0160\2\0\1\u0198" + + "\31\u0160\62\0\1\u0199\106\0\1\u019a\114\0\1\u019b\114\0" + + "\1\u019c\5\0\1\u019d\77\0\1\u019e\45\0\1\u019f\115\0" + + "\1\u0166\42\0\1\u011a\22\0\1\u01a0\1\0\1\u01a0\1\u0168" + + "\10\u01a0\6\u0168\1\u01a0\1\0\1\u01a0\1\0\2\u01a0\11\u0168" + + "\2\0\1\u01a0\31\u0168\4\0\10\110\1\261\13\110\5\u01a1" + + "\6\110\5\u01a1\4\110\1\262\2\110\6\u01a1\27\110\1\6" + + "\2\0\1\6\2\0\1\6\2\0\2\6\11\0\5\u01a2" + + "\5\0\1\6\5\u01a2\5\6\1\0\1\6\6\u01a2\23\6" + + "\2\0\2\6\2\266\1\0\11\266\1\116\7\266\5\u01a3" + + "\6\266\5\u01a3\7\266\6\u01a3\27\266\1\6\2\0\1\6" + + "\2\0\1\6\2\0\2\6\11\0\5\u01a4\5\0\1\6" + + "\5\u01a4\5\6\1\0\1\6\6\u01a4\23\6\2\0\2\6" + + "\1\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\1\14" + + "\1\u01a5\30\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\1\14\1\u01a6\30\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\15\14\1\u01a7\14\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\13\14\1\u012a\16\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\23\14\1\365\6\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\4\14\1\365" + + "\25\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\13\14\1\u01a8\16\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\14\14\1\u01a9\15\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\15\14" + + "\1\u01aa\14\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\14\14\1\u01ab\15\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\15\14\1\u01ac\14\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\6\14\1\u01ad\23\14\2\0\2\14\57\0\1\u01ae\30\0" + + "\1\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\7\14" + + "\1\314\22\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\23\14\1\314\6\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\3\14\1\u01af\26\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\4\14\1\214\25\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\3\14\1\33\26\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\21\14\1\214" + + "\10\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\15\14\1\33\14\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\23\14\1\u01b0\6\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\21\14" + + "\1\u01b1\10\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\11\14\1\u01b2\20\14\2\0\2\14\23\0" + + "\1\u014c\154\0\1\u01b3\100\0\1\u01b4\105\0\1\u01b5\121\0" + + "\1\u01b6\107\0\1\u01b7\114\0\1\u01b8\112\0\1\u0157\101\0" + + "\1\u01b9\101\0\1\u01ba\110\0\1\u0157\114\0\1\u01bb\67\0" + + "\1\u01bc\113\0\1\u0157\103\0\1\u01bd\134\0\1\u01be\102\0" + + "\1\u01bf\77\0\1\u01c0\47\0\1\u0160\143\0\1\u01c1\76\0" + + "\1\u01c2\120\0\1\u01c3\114\0\1\u01c1\102\0\1\u01c4\126\0" + + "\1\u0199\34\0\1\u0168\64\0\10\110\1\261\13\110\5\107" + + "\6\110\5\107\4\110\1\262\2\110\6\107\27\110\1\6" + + "\2\0\1\6\2\0\1\6\2\0\2\6\11\0\5\14" + + "\5\0\1\6\5\14\5\6\1\0\1\6\6\14\23\6" + + "\2\0\2\6\2\266\1\0\11\266\1\116\7\266\5\114" + + "\6\266\5\114\7\266\6\114\27\266\1\6\2\0\1\6" + + "\2\0\1\6\2\0\2\6\11\0\5\u01c5\5\0\1\6" + + "\5\u01c5\5\6\1\0\1\6\6\u01c5\23\6\2\0\2\6" + + "\1\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\3\14" + + "\1\u012a\26\14\2\0\3\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\15\14\1\371\14\14\2\0\3\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\24\14\1\314\5\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\30\14\1\33\1\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\17\14\1\u01c6\12\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\24\14\1\175" + + "\5\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\5\14\1\u01c7\24\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\3\14\1\u01c8\26\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\1\14" + + "\1\u01c9\30\14\2\0\2\14\53\0\1\u01ca\34\0\1\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\23\14\1\u0143" + + "\6\14\2\0\3\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\6\14\1\u01cb\23\14\2\0\3\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\16\14\1\u01cc\13\14\2\0" + + "\3\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\5\14" + + "\1\u01cd\15\14\1\342\6\14\2\0\2\14\73\0\1\u0157" + + "\104\0\1\u01ce\74\0\1\u01cf\117\0\1\u0192\117\0\1\u0196" + + "\70\0\1\u0192\120\0\1\u01d0\77\0\1\u01d1\117\0\1\u0157" + + "\105\0\1\u01d2\100\0\1\u01d3\125\0\1\u0157\76\0\1\u01d0" + + "\114\0\1\u01bb\17\0\105\u01c1\1\u0157\2\u01c1\70\0\1\u01d4" + + "\112\0\1\u01d5\107\0\1\u01d6\14\0\1\6\2\0\1\6" + + "\2\0\1\6\2\0\2\6\11\0\5\137\5\0\1\6" + + "\5\137\5\6\1\0\1\6\6\137\23\6\2\0\2\6" + + "\1\14\2\0\1\6\2\0\1\6\2\0\1\6\1\14" + + "\11\0\5\14\5\0\1\6\11\14\1\113\1\0\5\14" + + "\1\332\1\14\1\333\3\14\1\333\1\14\1\314\14\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\15\14\1\u0171\14\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\5\14\1\u01d7\24\14\2\0\3\14" + + "\2\0\1\6\2\0\1\6\2\0\1\6\1\14\11\0" + + "\5\14\5\0\1\6\11\14\1\113\1\0\3\14\1\314" + + "\26\14\2\0\2\14\65\0\1\u01d8\22\0\1\14\2\0" + + "\1\6\2\0\1\6\2\0\1\6\1\14\11\0\5\14" + + "\5\0\1\6\11\14\1\113\1\0\17\14\1\33\12\14" + + "\2\0\3\14\2\0\1\6\2\0\1\6\2\0\1\6" + + "\1\14\11\0\5\14\5\0\1\6\11\14\1\113\1\0" + + "\15\14\1\u01d9\14\14\2\0\3\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\15\14\1\u012a\14\14\2\0\2\14" + + "\73\0\1\u01da\67\0\1\u01db\107\0\1\u01dc\131\0\1\u0192" + + "\53\0\1\u01dd\1\0\1\u01de\140\0\1\u01df\103\0\1\u01e0" + + "\102\0\1\u01e1\77\0\1\u01e2\34\0\1\14\2\0\1\6" + + "\2\0\1\6\2\0\1\6\1\14\11\0\5\14\5\0" + + "\1\6\11\14\1\113\1\0\16\14\1\u01e3\13\14\2\0" + + "\2\14\57\0\1\u01e4\30\0\1\14\2\0\1\6\2\0" + + "\1\6\2\0\1\6\1\14\11\0\5\14\5\0\1\6" + + "\11\14\1\113\1\0\11\14\1\u01e5\20\14\2\0\2\14" + + "\102\0\1\u0157\102\0\1\u01e6\77\0\1\u0157\75\0\1\u01e7" + + "\117\0\1\u01e8\77\0\1\u01e9\131\0\1\u01c1\107\0\1\u01ea" + + "\77\0\1\u01c1\22\0\1\14\2\0\1\6\2\0\1\6" + + "\2\0\1\6\1\14\11\0\5\14\5\0\1\6\11\14" + + "\1\113\1\0\6\14\1\33\23\14\2\0\2\14\56\0" + + "\1\u01eb\31\0\1\14\2\0\1\6\2\0\1\6\2\0" + + "\1\6\1\14\11\0\5\14\5\0\1\6\11\14\1\113" + + "\1\0\31\14\1\u0143\2\0\2\14\57\0\1\u01ec\125\0" + + "\1\u01ed\71\0\1\u01ee\110\0\1\u01ef\70\0\1\u01f0\124\0" + + "\1\u0157\104\0\1\u0157\121\0\1\u01ec\101\0\1\u01f1\120\0" + + "\1\u01f2\114\0\1\u01da\67\0\1\u01c1\32\0"; + + private static int[] zzUnpacktrans() { + int[] result = new int[33408]; + int offset = 0; + offset = zzUnpacktrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpacktrans(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + + /* error messages for the codes above */ + private static final String[] ZZ_ERROR_MSG = { + "Unknown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state {@code aState} + */ + private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\4\0\3\1\1\11\6\1\1\11\1\1\1\11\5\1" + + "\1\11\30\1\1\11\5\1\1\11\10\1\1\11\4\1" + + "\1\11\10\1\1\0\1\11\3\1\1\11\12\1\1\0" + + "\63\1\1\11\4\0\1\11\1\0\1\11\26\0\3\11" + + "\1\1\1\11\3\1\1\11\7\1\1\0\76\1\37\0" + + "\1\11\3\1\1\11\26\1\1\0\21\1\2\0\1\1" + + "\12\0\1\11\10\0\1\1\7\0\21\1\1\0\12\1" + + "\35\0\15\1\1\0\4\1\22\0\5\1\1\0\3\1" + + "\4\0\1\1\4\0\1\1\1\0\1\1\11\0\1\1" + + "\1\0\1\1\5\0\1\11\7\0"; + + private static int[] zzUnpackAttribute() { + int[] result = new int[498]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** + * the input device + */ + private java.io.Reader zzReader; + + /** + * the current state of the DFA + */ + private int zzState; + + /** + * the current lexical state + */ + private int zzLexicalState = YYINITIAL; + + /** + * this buffer contains the current text to be matched and is + * the source of the yytext() string + */ + private char[] zzBuffer; + + /** + * the textposition at the last accepting state + */ + private int zzMarkedPos; + + /** + * the current text position in the buffer + */ + private int zzCurrentPos; + + /** + * startRead marks the beginning of the yytext() string in the buffer + */ + private int zzStartRead; + + /** + * endRead marks the last character in the buffer, that has been read + * from input + */ + private int zzEndRead; + + /** + * zzAtEOF == true <=> the scanner is at the EOF + */ + private boolean zzAtEOF; + + /** + * Number of newlines encountered up to the start of the matched text. + */ + @SuppressWarnings("unused") + private int yyline; + + /** + * Number of characters from the last newline up to the start of the matched text. + */ + @SuppressWarnings("unused") + protected int yycolumn; + + /** + * Number of characters up to the start of the matched text. + */ + @SuppressWarnings("unused") + private long yychar; + + /** + * Whether the scanner is currently at the beginning of a line. + */ + @SuppressWarnings("unused") + private boolean zzAtBOL = true; + + /** + * Whether the user-EOF-code has already been executed. + */ + @SuppressWarnings("unused") + private boolean zzEOFDone; + + /* user code: */ + public JavaBytecodeTokenMaker() { + + } + + private void addHyperlinkToken(int start, int end, int tokenType) { + int so = start + offsetShift; + addToken(zzBuffer, start, end, tokenType, so, true); + } + + private void addToken(int tokenType) { + addToken(zzStartRead, zzMarkedPos - 1, tokenType); + } + + private void addToken(int start, int end, int tokenType) { + int so = start + offsetShift; + addToken(zzBuffer, start, end, tokenType, so, false); + } + + @Override + public void addToken(char[] array, int start, int end, int tokenType, int startOffset, boolean hyperlink) { + super.addToken(array, start, end, tokenType, startOffset, hyperlink); + zzStartRead = zzMarkedPos; + } + + @Override + public String[] getLineCommentStartAndEnd(int languageIndex) { + return new String[]{"//", null}; + } + + public Token getTokenList(Segment text, int initialTokenType, int startOffset) { + resetTokenList(); + this.offsetShift = -text.offset + startOffset; + + // Start off in the proper state. + int state; + switch (initialTokenType) { + case TokenTypes.COMMENT_MULTILINE: + state = MLC; + start = text.offset; + break; + case TokenTypes.COMMENT_DOCUMENTATION: + state = DOCCOMMENT; + start = text.offset; + break; + case TokenTypes.LITERAL_STRING_DOUBLE_QUOTE: + state = TEXT_BLOCK; + start = text.offset; + break; + default: + state = YYINITIAL; + } + + s = text; + try { + yyreset(zzReader); + yybegin(state); + return yylex(); + } catch (IOException ioe) { + ioe.printStackTrace(); + return new TokenImpl(); + } + + } + + /** + * Refills the input buffer. + * + * @return true if EOF was reached, otherwise + * false. + */ + private boolean zzRefill() { + return zzCurrentPos >= s.offset + s.count; + } + + + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + *

+ * All internal variables are reset, the old input stream + * cannot be reused (internal buffer is discarded and lost). + * Lexical state is set to YY_INITIAL. + * + * @param reader the new input stream + */ + public final void yyreset(Reader reader) { + // 's' has been updated. + zzBuffer = s.array; + /* + * We replaced the line below with the two below it because zzRefill + * no longer "refills" the buffer (since the way we do it, it's always + * "full" the first time through, since it points to the segment's + * array). So, we assign zzEndRead here. + */ + //zzStartRead = zzEndRead = s.offset; + zzStartRead = s.offset; + zzEndRead = zzStartRead + s.count - 1; + zzCurrentPos = zzMarkedPos = s.offset; + zzLexicalState = YYINITIAL; + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + } + + + /** + * Creates a new scanner + * + * @param in the java.io.Reader to read input from. + */ + public JavaBytecodeTokenMaker(java.io.Reader in) { + this.zzReader = in; + } + + + /** + * Returns the maximum size of the scanner buffer, which limits the size of tokens. + */ + private int zzMaxBufferLen() { + return Integer.MAX_VALUE; + } + + /** + * Whether the scanner buffer can grow to accommodate a larger token. + */ + private boolean zzCanGrow() { + return true; + } + + /** + * Translates raw input code points to DFA table row + */ + private static int zzCMap(int input) { + int offset = input & 255; + return offset == input ? ZZ_CMAP_BLOCKS[offset] : ZZ_CMAP_BLOCKS[ZZ_CMAP_TOP[input >> 8] | offset]; + } + + public final int getTokenStart() { + return zzStartRead; + } + + public final int getTokenEnd() { + return getTokenStart() + yylength(); + } + + public void reset(char[] buffer, int start, int end, int initialState) { + zzBuffer = buffer; + zzCurrentPos = zzMarkedPos = zzStartRead = start; + zzAtEOF = false; + zzAtBOL = true; + zzEndRead = end; + yybegin(initialState); + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + @Override + public void yyclose() throws IOException { + zzAtEOF = true; /* indicate end of file */ + zzEndRead = zzStartRead; /* invalidate buffer */ + + if (zzReader != null) + zzReader.close(); + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final String yytext() { + return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead); + } + + + /** + * Returns the character at position {@code pos} from the + * matched text. + *

+ * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBuffer[zzStartRead + pos]; + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos - zzStartRead; + } + + + /** + * Reports an error that occurred while scanning. + *

+ * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + *

+ * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + *

+ * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if (number > yylength()) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @throws java.io.IOException if any I/O-Error occurs + */ + public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + char[] zzBufferL = zzBuffer; + + int[] zzTransL = ZZ_TRANS; + int[] zzRowMapL = ZZ_ROWMAP; + int[] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + // set up zzAction for empty match case: + int zzAttributes = zzAttrL[zzState]; + if ((zzAttributes & 1) == 1) { + zzAction = zzState; + } + + + zzForAction: + { + while (true) { + + if (zzCurrentPosL < zzEndReadL) { + zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL); + zzCurrentPosL += Character.charCount(zzInput); + } else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } else { + zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL); + zzCurrentPosL += Character.charCount(zzInput); + } + } + int zzNext = zzTransL[zzRowMapL[zzState] + zzCMap(zzInput)]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + zzAttributes = zzAttrL[zzState]; + if ((zzAttributes & 1) == 1) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ((zzAttributes & 8) == 8) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + switch (zzLexicalState) { + case YYINITIAL: { + addNullToken(); + return firstToken; + } // fall though + case 499: + break; + case MLC: { + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_MULTILINE); + return firstToken; + } // fall though + case 500: + break; + case DOCCOMMENT: { + yybegin(YYINITIAL); + addToken(start, zzEndRead, TokenTypes.COMMENT_DOCUMENTATION); + return firstToken; + } // fall though + case 501: + break; + case EOL_COMMENT: { + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_EOL); + addNullToken(); + return firstToken; + } // fall though + case 502: + break; + case TEXT_BLOCK: { + addToken(start, zzStartRead - 1, TokenTypes.LITERAL_STRING_DOUBLE_QUOTE); + return firstToken; + } // fall though + case 503: + break; + default: + return null; + } + } else { + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 1: { + } + // fall through + case 40: + break; + case 2: { + addToken(TokenTypes.ERROR_IDENTIFIER); + } + // fall through + case 41: + break; + case 3: { + addToken(TokenTypes.WHITESPACE); + } + // fall through + case 42: + break; + case 4: { + addNullToken(); + return firstToken; + } + // fall through + case 43: + break; + case 5: { + addToken(TokenTypes.OPERATOR); + } + // fall through + case 44: + break; + case 6: { + addToken(TokenTypes.ERROR_STRING_DOUBLE); + addNullToken(); + return firstToken; + } + // fall through + case 45: + break; + case 7: { + addToken(TokenTypes.IDENTIFIER); + } + // fall through + case 46: + break; + case 8: { + addToken(TokenTypes.ERROR_CHAR); + addNullToken(); + return firstToken; + } + // fall through + case 47: + break; + case 9: { + addToken(TokenTypes.SEPARATOR); + } + // fall through + case 48: + break; + case 10: { + addToken(TokenTypes.LITERAL_NUMBER_DECIMAL_INT); + } + // fall through + case 49: + break; + case 11: { + addToken(TokenTypes.ANNOTATION); + } + // fall through + case 50: + break; + case 12: { + addToken(TokenTypes.RESERVED_WORD); + } + // fall through + case 51: + break; + case 13: { + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_MULTILINE); + return firstToken; + } + // fall through + case 52: + break; + case 14: { + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_DOCUMENTATION); + return firstToken; + } + // fall through + case 53: + break; + case 15: { + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_EOL); + addNullToken(); + return firstToken; + } + // fall through + case 54: + break; + case 16: { + addToken(start, zzStartRead - 1, TokenTypes.LITERAL_STRING_DOUBLE_QUOTE); + return firstToken; + } + // fall through + case 55: + break; + case 17: { /* Skip escaped chars, handles case: '\"""'. */ + } + // fall through + case 56: + break; + case 18: { + addToken(TokenTypes.LITERAL_STRING_DOUBLE_QUOTE); + } + // fall through + case 57: + break; + case 19: { + addToken(TokenTypes.ERROR_CHAR); + } + // fall through + case 58: + break; + case 20: { + addToken(TokenTypes.LITERAL_NUMBER_FLOAT); + } + // fall through + case 59: + break; + case 21: { + start = zzMarkedPos - 2; + yybegin(MLC); + } + // fall through + case 60: + break; + case 22: { + start = zzMarkedPos - 2; + yybegin(EOL_COMMENT); + } + // fall through + case 61: + break; + case 23: { + addToken(TokenTypes.ERROR_NUMBER_FORMAT); + } + // fall through + case 62: + break; + case 24: { + addToken(TokenTypes.LITERAL_NUMBER_HEXADECIMAL); + } + // fall through + case 63: + break; + case 25: { + yybegin(YYINITIAL); + addToken(start, zzStartRead + 1, TokenTypes.COMMENT_MULTILINE); + } + // fall through + case 64: + break; + case 26: { + yybegin(YYINITIAL); + addToken(start, zzStartRead + 1, TokenTypes.COMMENT_DOCUMENTATION); + } + // fall through + case 65: + break; + case 27: { + int temp = zzStartRead; + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_DOCUMENTATION); + addToken(temp, zzMarkedPos - 1, TokenTypes.COMMENT_MARKUP); + start = zzMarkedPos; + } + // fall through + case 66: + break; + case 28: { + addToken(TokenTypes.ERROR_STRING_DOUBLE); + } + // fall through + case 67: + break; + case 29: { + start = zzMarkedPos - 3; + yybegin(TEXT_BLOCK); + } + // fall through + case 68: + break; + case 30: { + addToken(TokenTypes.LITERAL_CHAR); + } + // fall through + case 69: + break; + case 31: { + start = zzMarkedPos - 3; + yybegin(DOCCOMMENT); + } + // fall through + case 70: + break; + case 32: { + addToken(TokenTypes.DATA_TYPE); + } + // fall through + case 71: + break; + case 33: { + yybegin(YYINITIAL); + addToken(start, zzStartRead + 2, TokenTypes.LITERAL_STRING_DOUBLE_QUOTE); + } + // fall through + case 72: + break; + case 34: { + addToken(TokenTypes.COMMENT_MULTILINE); + } + // fall through + case 73: + break; + case 35: { + addToken(TokenTypes.LITERAL_BOOLEAN); + } + // fall through + case 74: + break; + case 36: { + int temp = zzStartRead; + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_MULTILINE); + addHyperlinkToken(temp, zzMarkedPos - 1, TokenTypes.COMMENT_MULTILINE); + start = zzMarkedPos; + } + // fall through + case 75: + break; + case 37: { + int temp = zzStartRead; + if (start <= zzStartRead - 1) { + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_DOCUMENTATION); + } + addToken(temp, zzMarkedPos - 1, TokenTypes.COMMENT_KEYWORD); + start = zzMarkedPos; + } + // fall through + case 76: + break; + case 38: { + int temp = zzStartRead; + if (start <= zzStartRead - 1) { + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_DOCUMENTATION); + } + addHyperlinkToken(temp, zzMarkedPos - 1, TokenTypes.COMMENT_DOCUMENTATION); + start = zzMarkedPos; + } + // fall through + case 77: + break; + case 39: { + int temp = zzStartRead; + addToken(start, zzStartRead - 1, TokenTypes.COMMENT_EOL); + addHyperlinkToken(temp, zzMarkedPos - 1, TokenTypes.COMMENT_EOL); + start = zzMarkedPos; + } + // fall through + case 78: + break; + default: + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/gui/util/BytecodeViewPanelUpdater.java b/src/main/java/the/bytecode/club/bytecodeviewer/gui/util/BytecodeViewPanelUpdater.java index 3d012e73..a91fe665 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/gui/util/BytecodeViewPanelUpdater.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/gui/util/BytecodeViewPanelUpdater.java @@ -1,19 +1,9 @@ package the.bytecode.club.bytecodeviewer.gui.util; -import java.awt.BorderLayout; -import java.util.Objects; -import java.util.regex.Matcher; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JPanel; -import javax.swing.JViewport; -import javax.swing.SwingUtilities; -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; +import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.SyntaxConstants; +import org.fife.ui.rsyntaxtextarea.TokenMakerFactory; import org.objectweb.asm.ClassWriter; import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.Configuration; @@ -26,6 +16,15 @@ import the.bytecode.club.bytecodeviewer.gui.resourceviewer.BytecodeViewPanel; import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer; import the.bytecode.club.bytecodeviewer.util.MethodParser; +import javax.swing.*; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.util.Objects; +import java.util.regex.Matcher; + import static the.bytecode.club.bytecodeviewer.gui.resourceviewer.TabbedPane.BLANK_COLOR; import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.EDITABLE; @@ -359,7 +358,16 @@ public class BytecodeViewPanelUpdater implements Runnable bytecodeViewPanel.add(updateUpdaterTextArea.getTitleHeader(), BorderLayout.NORTH); bytecodeViewPanel.textArea = updateUpdaterTextArea; - bytecodeViewPanel.textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); + if (bytecodeViewPanel.decompiler != Decompiler.BYTECODE_DISASSEMBLER) { + bytecodeViewPanel.textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); + } else { + AbstractTokenMakerFactory tokenMakerFactory = + (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance(); + tokenMakerFactory.putMapping("text/javaBytecode", "the.bytecode.club.bytecodeviewer.decompilers.bytecode" + + ".JavaBytecodeTokenMaker"); + bytecodeViewPanel.textArea.setSyntaxEditingStyle("text/javaBytecode"); + } + bytecodeViewPanel.textArea.setCodeFoldingEnabled(true); bytecodeViewPanel.textArea.setAntiAliasingEnabled(true); bytecodeViewPanel.textArea.setText(decompiledSource);