未验证 提交 2dbef83f 编写于 作者: M Martin Kay 提交者: GitHub

feat(gui): smali code highlighting (PR #1283)

* smali code highlighting is basically perfect
* Optimize smali highlight color matching, and provide original jflex generation

* reformat code
* disable checkstyle
* update shell to be more environment independent
Co-authored-by: NSkylot <skylot@gmail.com>
上级 6ec7f789
SmaliTokenMaker.java
Refer to the following instructions to modify and use to generate SmaliTokenMarker
```shell
jflex SmaliTokenMaker.flex --skel skeleton.default
```
/*
* Generated on 11/22/21, 8:58 PM
*/
package jadx.gui.ui.codeearea;
import java.io.*;
import javax.swing.text.Segment;
import org.fife.ui.rsyntaxtextarea.*;
/**
* 用于Smali代码高亮
* MartinKay@qq.com
*/
%%
%public
%class SmaliTokenMaker
%extends AbstractJFlexCTokenMaker
%unicode
/* Case sensitive */
%type org.fife.ui.rsyntaxtextarea.Token
%{
/**
* Constructor. This must be here because JFlex does not generate a
* no-parameter constructor.
*/
public SmaliTokenMaker() {
}
/**
* Adds the token specified to the current linked list of tokens.
*
* @param tokenType The token's type.
* @see #addToken(int, int, int)
*/
private void addHyperlinkToken(int start, int end, int tokenType) {
int so = start + offsetShift;
addToken(zzBuffer, start,end, tokenType, so, true);
}
/**
* Adds the token specified to the current linked list of tokens.
*
* @param tokenType The token's type.
*/
private void addToken(int tokenType) {
addToken(zzStartRead, zzMarkedPos-1, tokenType);
}
/**
* Adds the token specified to the current linked list of tokens.
*
* @param tokenType The token's type.
* @see #addHyperlinkToken(int, int, int)
*/
private void addToken(int start, int end, int tokenType) {
int so = start + offsetShift;
addToken(zzBuffer, start,end, tokenType, so, false);
}
/**
* Adds the token specified to the current linked list of tokens.
*
* @param array The character array.
* @param start The starting offset in the array.
* @param end The ending offset in the array.
* @param tokenType The token's type.
* @param startOffset The offset in the document at which this token
* occurs.
* @param hyperlink Whether this token is a hyperlink.
*/
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;
}
/**
* {@inheritDoc}
*/
public String[] getLineCommentStartAndEnd(int languageIndex) {
return new String[] { "#", null };
}
/**
* Returns the first token in the linked list of tokens generated
* from <code>text</code>. This method must be implemented by
* subclasses so they can correctly implement syntax highlighting.
*
* @param text The text from which to get tokens.
* @param initialTokenType The token type we should start with.
* @param startOffset The offset into the document at which
* <code>text</code> starts.
* @return The first <code>Token</code> in a linked list representing
* the syntax highlighted text.
*/
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
resetTokenList();
this.offsetShift = -text.offset + startOffset;
// Start off in the proper state.
int state = Token.NULL;
switch (initialTokenType) {
/* No multi-line comments */
/* No documentation comments */
default:
state = Token.NULL;
}
s = text;
try {
yyreset(zzReader);
yybegin(state);
return yylex();
} catch (IOException ioe) {
ioe.printStackTrace();
return new TokenImpl();
}
}
/**
* Refills the input buffer.
*
* @return <code>true</code> if EOF was reached, otherwise
* <code>false</code>.
*/
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
* <b>cannot</b> be reused (internal buffer is discarded and lost).
* Lexical state is set to <tt>YY_INITIAL</tt>.
*
* @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 = zzPushbackPos = s.offset;
zzLexicalState = YYINITIAL;
zzReader = reader;
zzAtBOL = true;
zzAtEOF = false;
}
%}
Letter = [A-Za-z]
LetterOrUnderscore = ({Letter}|"_")
NonzeroDigit = [1-9]
Digit = ("0"|{NonzeroDigit})
HexDigit = ({Digit}|[A-Fa-f])
OctalDigit = ([0-7])
AnyCharacterButApostropheOrBackSlash = ([^\\'])
AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
IdentifierStart = ({LetterOrUnderscore}|"$")
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
LineTerminator = (\n)
WhiteSpace = ([ \t\f]+)
CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
UnclosedCharLiteral = ([\'][^\'\n]*)
ErrorCharLiteral = ({UnclosedCharLiteral}[\'])
StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
/* No multi-line comments */
/* No documentation comments */
LineCommentBegin = "#"
IntegerLiteral = ({Digit}+)
HexLiteral = (0x{HexDigit}+)
FloatLiteral = (({Digit}+)("."{Digit}+)?(e[+-]?{Digit}+)? | ({Digit}+)?("."{Digit}+)(e[+-]?{Digit}+)?)
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
BooleanLiteral = ("true"|"false")
Separator = ([\(\)\{\}\[\]])
Separator2 = ([\;,.])
Identifier = ({IdentifierStart}{IdentifierPart}*)
URLGenDelim = ([:\/\?#\[\]@])
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
URLCharacters = ({URLCharacter}*)
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
/* Custom Regex */
/* fully-qualified name Rules */
SimpleName = ([a-zA-Z0-9_$]*)
QUALIFIED_TYPE_NAME = ("L"({SimpleName}{SLASH})*{SimpleName}*";")
/* Types */
VOID_TYPE = ("V")
BOOLEAN_TYPE = ("Z")
BYTE_TYPE = ("B")
SHORT_TYPE = ("S")
CHAR_TYPE = ("C")
INT_TYPE = ("I")
LONG_TYPE = ("J")
FLOAT_TYPE = ("F")
DOUBLE_TYPE = ("D")
/* Multi Args Types Highlight */
MULTI_ARGS_TYPES = (({BOOLEAN_TYPE}|{BYTE_TYPE}|{SHORT_TYPE}|{CHAR_TYPE}|{INT_TYPE}|{LONG_TYPE}|{FLOAT_TYPE}|{DOUBLE_TYPE})+);
/* Types fully-qualified name */
COMPOUND_METHOD_ARG_LITERAL = (({BOOLEAN_TYPE}|{BYTE_TYPE}|{SHORT_TYPE}|{CHAR_TYPE}|{INT_TYPE}|{LONG_TYPE}|{FLOAT_TYPE}|{DOUBLE_TYPE})+{QUALIFIED_TYPE_NAME})
LBRACK = ("[")
RBRACK = ("]")
LPAREN = ("(")
RPAREN = (")")
LBRACE = ("{")
RBRACE = ("}")
COLON = (":")
ASSIGN = ("=")
DOT = (".")
SUB = ("-")
COMMA = (",")
SLASH = ("/")
LT = ("<")
GT = (">")
ARROW = ("->")
SEMI = (";")
ARROW_FUNCTION = ({ARROW}[a-zA-Z_$<>]*)
CustomSeparator = ({Separator}|{ARROW_FUNCTION})
/* Register */
VREGISTER = ("v"("0"|[1-9])*)
PREGISTER = ("p"("0"|[1-9])*)
/* Flags */
FLAG_PSWITCH = (":pswitch_"{SimpleName})
FLAG_PSWITCH_DATA = (":pswitch_data_"{SimpleName})
FLAG_GOTO = (":goto_"{SimpleName})
FLAG_COND = (":cond_"{SimpleName})
FLAG_TRY_START = (":try_start_"{SimpleName})
FLAG_TRY_END = (":try_end_"{SimpleName})
FLAG_CATCH = (":catch_"{SimpleName})
FLAG_CATCHALL = (":catchall_"{SimpleName})
FLAG_ARRAY = (":array_"{SimpleName})
/* No string state */
/* No char state */
/* No MLC state */
/* No documentation comment state */
%state EOL_COMMENT
%%
<YYINITIAL> {
/* Keywords Instructions Highlight */
"nop" |
"move" |
"move/from16" |
"move/16" |
"move-wide" |
"move-wide/from16" |
"move-wide/16" |
"move-object" |
"move-object/from16" |
"move-object/16" |
"move-result" |
"move-result-wide" |
"move-result-object" |
"move-exception" |
"return-void" |
"return" |
"return-wide" |
"return-object" |
"const/4" |
"const/16" |
"const" |
"const/high16" |
"const-wide/16" |
"const-wide/32" |
"const-wide" |
"const-wide/high16" |
"const-string" |
"const-string/jumbo" |
"const-class" |
"monitor-enter" |
"monitor-exit" |
"check-cast" |
"instance-of" |
"array-length" |
"new-instance" |
"new-array" |
"filled-new-array" |
"filled-new-array/range" |
"fill-array-data" |
"throw" |
"goto" |
"goto/16" |
"goto/32" |
"cmpl-float" |
"cmpg-float" |
"cmpl-double" |
"cmpg-double" |
"cmp-long" |
"if-eq" |
"if-ne" |
"if-lt" |
"if-ge" |
"if-gt" |
"if-le" |
"if-eqz" |
"if-nez" |
"if-ltz" |
"if-gez" |
"if-gtz" |
"if-lez" |
"aget" |
"aget-wide" |
"aget-object" |
"aget-boolean" |
"aget-byte" |
"aget-char" |
"aget-short" |
"aput" |
"aput-wide" |
"aput-object" |
"aput-boolean" |
"aput-byte" |
"aput-char" |
"aput-short" |
"iget" |
"iget-wide" |
"iget-object" |
"iget-boolean" |
"iget-byte" |
"iget-char" |
"iget-short" |
"iput" |
"iput-wide" |
"iput-object" |
"iput-boolean" |
"iput-byte" |
"iput-char" |
"iput-short" |
"sget" |
"sget-wide" |
"sget-object" |
"sget-boolean" |
"sget-byte" |
"sget-char" |
"sget-short" |
"sput" |
"sput-wide" |
"sput-object" |
"sput-boolean" |
"sput-byte" |
"sput-char" |
"sput-short" |
"invoke-virtual" |
"invoke-super" |
"invoke-direct" |
"invoke-static" |
"invoke-interface" |
"invoke-virtual/range" |
"invoke-super/range" |
"invoke-direct/range" |
"invoke-static/range" |
"invoke-interface/range" |
"neg-int" |
"not-int" |
"neg-long" |
"not-long" |
"neg-float" |
"neg-double" |
"int-to-long" |
"int-to-float" |
"int-to-double" |
"long-to-int" |
"long-to-float" |
"long-to-double" |
"float-to-int" |
"float-to-long" |
"float-to-double" |
"double-to-int" |
"double-to-long" |
"double-to-float" |
"int-to-byte" |
"int-to-char" |
"int-to-short" |
"add-int" |
"sub-int" |
"mul-int" |
"div-int" |
"rem-int" |
"and-int" |
"or-int" |
"xor-int" |
"shl-int" |
"shr-int" |
"ushr-int" |
"add-long" |
"sub-long" |
"mul-long" |
"div-long" |
"rem-long" |
"and-long" |
"or-long" |
"xor-long" |
"shl-long" |
"shr-long" |
"ushr-long" |
"add-float" |
"sub-float" |
"mul-float" |
"div-float" |
"rem-float" |
"add-double" |
"sub-double" |
"mul-double" |
"div-double" |
"rem-double" |
"add-int/2addr" |
"sub-int/2addr" |
"mul-int/2addr" |
"div-int/2addr" |
"rem-int/2addr" |
"and-int/2addr" |
"or-int/2addr" |
"xor-int/2addr" |
"shl-int/2addr" |
"shr-int/2addr" |
"ushr-int/2addr" |
"add-long/2addr" |
"sub-long/2addr" |
"mul-long/2addr" |
"div-long/2addr" |
"rem-long/2addr" |
"and-long/2addr" |
"or-long/2addr" |
"xor-long/2addr" |
"shl-long/2addr" |
"shr-long/2addr" |
"ushr-long/2addr" |
"add-float/2addr" |
"sub-float/2addr" |
"mul-float/2addr" |
"div-float/2addr" |
"rem-float/2addr" |
"add-double/2addr" |
"sub-double/2addr" |
"mul-double/2addr" |
"div-double/2addr" |
"rem-double/2addr" |
"add-int/lit16" |
"rsub-int" |
"mul-int/lit16" |
"div-int/lit16" |
"rem-int/lit16" |
"and-int/lit16" |
"or-int/lit16" |
"xor-int/lit16" |
"add-int/lit8" |
"rsub-int/lit8" |
"mul-int/lit8" |
"div-int/lit8" |
"rem-int/lit8" |
"and-int/lit8" |
"or-int/lit8" |
"xor-int/lit8" |
"shl-int/lit8" |
"shr-int/lit8" |
"ushr-int/lit8" |
"invoke-polymorphic" |
"invoke-polymorphic/range" |
"invoke-custom" |
"invoke-custom/range" |
"const-method-handle" |
"const-method-type" |
"packed-switch" |
"sparse-switch" { addToken(Token.FUNCTION); }
/* Keywords Modifiers(IDENTIFIER标识符、修饰符) Highlight */
"public" |
"private" |
"protected" |
"final" |
"annotation" |
"static" |
"synthetic" |
"constructor" |
"abstract" |
"enum" |
"interface" |
"transient" |
"bridge" |
"declared-synchronized" |
"volatile" |
"strictfp" |
"varargs" |
"native" { addToken(Token.RESERVED_WORD); }
/* Keywords Directives Highlight */
".method" |
".end method" |
".implements" |
".class" |
".prologue" |
".source" |
".super" |
".field" |
".end field" |
".registers" |
".locals" |
".param" |
".line" |
".catch" |
".catchall" |
".annotation" |
".end annotation" |
".local" |
".end local" |
".restart local" |
".packed-switch" |
".end packed-switch" |
".array-data" |
".end array-data" |
".sparse-switch" |
".end sparse-switch" |
".end param" { addToken(Token.RESERVED_WORD_2); }
/* VARIABLE Register Highlight */
{VREGISTER} |
{PREGISTER} { addToken(Token.VARIABLE); }
/* Data types Highlight */
{QUALIFIED_TYPE_NAME} |
{COMPOUND_METHOD_ARG_LITERAL} |
{MULTI_ARGS_TYPES} |
{QUALIFIED_TYPE_NAME} |
{VOID_TYPE} |
{BOOLEAN_TYPE} |
{BYTE_TYPE} |
{SHORT_TYPE} |
{CHAR_TYPE} |
{INT_TYPE} |
{LONG_TYPE} |
{FLOAT_TYPE} |
{DOUBLE_TYPE} { addToken(Token.DATA_TYPE); }
/* FLAGS */
{FLAG_PSWITCH} |
{FLAG_PSWITCH_DATA} |
{FLAG_GOTO} |
{FLAG_COND} |
{FLAG_TRY_START} |
{FLAG_TRY_END} |
{FLAG_CATCHALL} |
{FLAG_ARRAY} |
{FLAG_CATCH} { addToken(Token.MARKUP_TAG_NAME); }
/* Functions */
/* No functions */
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
{LineTerminator} { addNullToken(); return firstToken; }
{Identifier} { addToken(Token.IDENTIFIER); }
{WhiteSpace} { addToken(Token.WHITESPACE); }
/* String/Character literals. */
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
{ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
/* Comment literals. */
/* No multi-line comments */
/* No documentation comments */
{LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
/* Separators. */
{CustomSeparator} { addToken(Token.SEPARATOR); }
{Separator2} { addToken(Token.IDENTIFIER); }
/* Operators. */
"!" |
";" |
"." |
"=" |
"/" |
"'" |
"(" |
")" |
"," |
"->" |
";->" |
"<" |
">" |
"@" |
"[" |
"]" |
"{" |
"}" { addToken(Token.OPERATOR); }
/* Numbers */
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
/* Ended with a line not in a string or comment. */
<<EOF>> { addNullToken(); return firstToken; }
/* Catch any other (unhandled) characters. */
. { addToken(Token.IDENTIFIER); }
}
/* No char state */
/* No string state */
/* No multi-line comment state */
/* No documentation comment state */
<EOL_COMMENT> {
[^hwf\n]+ {}
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
[hwf] {}
\n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
}
/** 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 = ...;
/** lexical states */
--- lexical states, charmap
/* 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[] = {
"Unkown internal scanner error",
"Error: could not match input",
"Error: pushback value was too large"
};
--- isFinal list
/** 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 textposition at the last state to be included in yytext */
private int zzPushbackPos;
/** 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;
/** number of newlines encountered up to the start of the matched text */
private int yyline;
/** the number of characters up to the start of the matched text */
private int yychar;
/**
* the number of characters from the last newline up to the start of the
* matched text
*/
private int yycolumn;
/**
* zzAtBOL == true <=> the scanner is currently at the beginning of a line
*/
private boolean zzAtBOL = true;
/** zzAtEOF == true <=> the scanner is at the EOF */
private boolean zzAtEOF;
--- user class code
/**
* Creates a new scanner
* There is also a java.io.InputStream version of this constructor.
*
* @param in the java.io.Reader to read input from.
*/
--- constructor declaration
/**
* Closes the input stream.
*/
public final void yyclose() throws java.io.IOException {
zzAtEOF = true; /* indicate end of file */
zzEndRead = zzStartRead; /* invalidate buffer */
if (zzReader != null)
zzReader.close();
}
/**
* Enters a new lexical state
*
* @param newState the new lexical state
*/
public final void yybegin(int newState) {
zzLexicalState = newState;
}
/**
* 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 <tt>pos</tt> 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 occured 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
*/
--- zzScanError declaration
String message;
try {
message = ZZ_ERROR_MSG[errorCode];
}
catch (ArrayIndexOutOfBoundsException e) {
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
}
--- throws clause
}
/**
* 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()!
*/
--- yypushback decl (contains zzScanError exception)
if ( number > yylength() )
zzScanError(ZZ_PUSHBACK_2BIG);
zzMarkedPos -= number;
}
--- zzDoEOF
/**
* 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
* @exception java.io.IOException if any I/O-Error occurs
*/
--- yylex declaration
int zzInput;
int zzAction;
// cached fields:
int zzCurrentPosL;
int zzMarkedPosL;
int zzEndReadL = zzEndRead;
char [] zzBufferL = zzBuffer;
char [] zzCMapL = ZZ_CMAP;
--- local declarations
while (true) {
zzMarkedPosL = zzMarkedPos;
--- start admin (line, char, col count)
zzAction = -1;
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
--- start admin (lexstate etc)
zzForAction: {
while (true) {
--- next input, line, col, char count, next transition, isFinal action
zzAction = zzState;
zzMarkedPosL = zzCurrentPosL;
--- line count update
}
}
}
// store back cached position
zzMarkedPos = zzMarkedPosL;
--- char count update
--- actions
default:
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
zzAtEOF = true;
--- eofvalue
}
else {
--- no match
}
}
}
}
--- main
}
......@@ -6,6 +6,9 @@ import java.awt.Point;
import javax.swing.JTabbedPane;
import javax.swing.border.EmptyBorder;
import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory;
import org.fife.ui.rsyntaxtextarea.TokenMakerFactory;
import jadx.gui.treemodel.JNode;
import jadx.gui.ui.TabbedPane;
import jadx.gui.ui.panel.IViewStateSupport;
......@@ -29,6 +32,10 @@ public final class ClassCodeContentPanel extends AbstractCodeContentPanel implem
public ClassCodeContentPanel(TabbedPane panel, JNode jnode) {
super(panel, jnode);
// FIXME I don't know the project very well, so need to get the right place
AbstractTokenMakerFactory atmf = (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance();
atmf.putMapping("text/smali", "jadx.gui.ui.codearea.SmaliTokenMaker");
javaCodePanel = new CodePanel(new CodeArea(this));
smaliCodePanel = new CodePanel(new SmaliArea(this));
......
......@@ -162,7 +162,7 @@ public final class SmaliArea extends AbstractCodeArea {
public NormalModel() {
Theme theme = getContentPanel().getTabbedPane().getMainWindow().getEditorTheme();
setSyntaxScheme(theme.scheme);
setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
setSyntaxEditingStyle("text/smali");
}
@Override
......
/* The following code was generated by JFlex */
package jadx.gui.ui.codearea;
import java.io.*;
import javax.swing.text.Segment;
import org.fife.ui.rsyntaxtextarea.*;
/**
* 用于Smali代码高亮
* MartinKay@qq.com
*/
@SuppressWarnings("checkstyle:all")
public class SmaliTokenMaker 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 EOL_COMMENT = 1;
public static final int YYINITIAL = 0;
/**
* Translates characters to character classes
*/
private static final String ZZ_CMAP_PACKED =
"\11\0\1\21\1\10\1\0\1\21\1\17\22\0\1\77\1\54\1\15" +
"\1\20\1\1\1\35\1\35\1\7\1\37\1\37\1\35\1\40\1\35" +
"\1\25\1\23\1\41\1\4\1\66\1\16\1\72\1\71\1\6\1\67" +
"\1\6\1\76\1\3\1\45\1\50\1\55\1\54\1\56\1\35\1\36" +
"\1\5\1\53\1\53\1\53\1\5\1\53\2\1\1\52\1\52\1\1" +
"\1\47\6\1\1\52\2\1\1\51\3\1\1\52\1\37\1\11\1\37" +
"\1\17\1\2\1\0\1\31\1\14\1\60\1\61\1\24\1\30\1\62" +
"\1\42\1\44\1\70\1\73\1\32\1\65\1\13\1\63\1\43\1\74" +
"\1\27\1\33\1\26\1\12\1\57\1\46\1\22\1\64\1\75\1\34" +
"\1\17\1\34\1\35\uff81\0";
/**
* Translates characters to character classes
*/
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
/**
* Translates DFA states to action switch labels.
*/
private static final int[] ZZ_ACTION = zzUnpackAction();
private static final String ZZ_ACTION_PACKED_0 =
"\2\0\2\1\2\2\1\3\1\4\3\1\1\5\1\6" +
"\1\7\12\1\1\10\1\11\1\12\4\1\2\13\1\12" +
"\5\1\1\14\1\15\3\14\1\0\1\16\1\0\2\16" +
"\1\3\1\17\1\0\1\3\5\1\2\5\1\20\1\21" +
"\12\0\1\1\1\10\23\1\1\12\5\1\6\0\1\13" +
"\1\0\15\1\5\0\1\21\1\0\1\22\1\3\1\23" +
"\2\3\1\17\1\3\5\1\1\24\1\1\1\5\1\25" +
"\1\5\20\0\35\1\7\0\10\1\1\0\2\1\5\0" +
"\1\3\2\0\1\1\1\0\1\1\1\5\22\0\1\26" +
"\1\27\3\1\1\0\7\1\1\24\1\1\1\0\2\1" +
"\1\0\6\1\1\0\2\1\11\0\4\1\1\0\3\1" +
"\1\24\2\0\1\1\1\24\2\0\1\30\1\0\1\3" +
"\6\0\1\1\1\5\6\0\1\31\13\0\2\1\3\0" +
"\2\1\1\0\3\1\3\0\2\1\1\0\6\1\1\0" +
"\2\1\1\24\5\0\3\1\1\24\1\0\2\1\3\0" +
"\1\1\5\0\1\3\6\0\1\5\7\0\1\31\4\0" +
"\1\31\1\1\1\24\4\0\1\1\1\0\2\1\10\0" +
"\1\1\1\0\3\1\1\0\2\1\1\24\3\0\1\32" +
"\2\1\2\0\1\1\1\0\2\1\3\0\1\24\1\1" +
"\23\0\1\1\7\0\2\1\10\0\1\24\1\1\1\24" +
"\1\0\2\1\1\0\1\1\11\0\1\1\1\0\1\1" +
"\2\0\1\1\22\0\1\24\3\0\1\1\12\0\1\1" +
"\1\0\1\1\15\0\1\1\1\0\1\1\25\0\1\1" +
"\22\0\1\1\10\0\1\24\26\0\1\24\2\0\1\1" +
"\35\0\1\24\3\0\1\24\6\0\1\24\50\0\1\26";
private static int[] zzUnpackAction() {
int[] result = new int[701];
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\100\0\200\0\300\0\u0100\0\u0140\0\u0180\0\200" +
"\0\u01c0\0\u0200\0\u0240\0\u0280\0\200\0\u02c0\0\u0300\0\u0340" +
"\0\u0380\0\u03c0\0\u0400\0\u0440\0\u0480\0\u04c0\0\u0500\0\u0540" +
"\0\200\0\200\0\u0580\0\u05c0\0\u0600\0\u0640\0\u0680\0\300" +
"\0\u06c0\0\u0700\0\u0740\0\u0780\0\u07c0\0\u0800\0\u0840\0\u0880" +
"\0\200\0\u08c0\0\u0900\0\u0940\0\u0980\0\u09c0\0\u0a00\0\u0a40" +
"\0\u0a80\0\u0ac0\0\200\0\u0b00\0\u0b40\0\u0b80\0\u0bc0\0\u0c00" +
"\0\u0c40\0\u0c80\0\u0cc0\0\u0d00\0\200\0\u0d40\0\u0d80\0\u0dc0" +
"\0\u0e00\0\u0e40\0\u0e80\0\u0ec0\0\u0f00\0\u0f40\0\u0f80\0\u0fc0" +
"\0\u1000\0\u1040\0\u1080\0\u10c0\0\u1100\0\u1140\0\u1180\0\u11c0" +
"\0\u1200\0\u1240\0\u1280\0\u12c0\0\u1300\0\u1340\0\u1380\0\u13c0" +
"\0\u1400\0\u1440\0\u1480\0\u14c0\0\u1500\0\u1540\0\u1580\0\u15c0" +
"\0\u1600\0\u1640\0\u1680\0\u16c0\0\u1700\0\u1740\0\u1780\0\u17c0" +
"\0\u1800\0\200\0\u1840\0\u06c0\0\u1880\0\u18c0\0\u1900\0\u1940" +
"\0\u1980\0\u19c0\0\u1a00\0\u1a40\0\u1a80\0\u1ac0\0\u1b00\0\u1b40" +
"\0\u1b80\0\u1bc0\0\u1c00\0\u1c40\0\u1c80\0\u1cc0\0\u1d00\0\u0a80" +
"\0\u1d40\0\200\0\u1d80\0\u1dc0\0\u0b00\0\u1e00\0\u1e40\0\u1e80" +
"\0\u1ec0\0\u1f00\0\u1f40\0\300\0\u1f80\0\u1fc0\0\200\0\u2000" +
"\0\u2040\0\u2080\0\u20c0\0\u2100\0\u2140\0\u2180\0\u21c0\0\u2200" +
"\0\u2240\0\u2280\0\u22c0\0\u2300\0\u2340\0\u2380\0\u23c0\0\u2400" +
"\0\u2440\0\u2480\0\u24c0\0\u2500\0\u2540\0\u2580\0\u25c0\0\u2600" +
"\0\u2640\0\u2680\0\u26c0\0\u2700\0\u2740\0\u2780\0\u27c0\0\u2800" +
"\0\u2840\0\u2880\0\u28c0\0\u2900\0\u2940\0\u2980\0\u29c0\0\u2a00" +
"\0\u2a40\0\u2a80\0\u2ac0\0\u2b00\0\u2b40\0\u2b80\0\u2bc0\0\u2c00" +
"\0\u2c40\0\u2c80\0\u2cc0\0\u2d00\0\u2d40\0\u2d80\0\u2dc0\0\u2e00" +
"\0\u2e40\0\u2e80\0\u2ec0\0\u2f00\0\u2f40\0\u2f80\0\u2fc0\0\u3000" +
"\0\u3040\0\u3080\0\u30c0\0\u3100\0\u3140\0\u3180\0\u31c0\0\u3200" +
"\0\u3240\0\u3280\0\u32c0\0\u3300\0\u3340\0\u3380\0\u33c0\0\u3400" +
"\0\u3440\0\u3480\0\u34c0\0\u3500\0\u3540\0\u3580\0\u35c0\0\u3600" +
"\0\u3640\0\u3680\0\u36c0\0\u3700\0\u3740\0\300\0\300\0\u3780" +
"\0\u37c0\0\u3800\0\u3840\0\u3880\0\u38c0\0\u3900\0\u3940\0\u3980" +
"\0\u39c0\0\u3a00\0\u3a40\0\u3a80\0\u3ac0\0\u3b00\0\u3b40\0\u3b80" +
"\0\u3bc0\0\u3c00\0\u3c40\0\u3c80\0\u3cc0\0\u3d00\0\u3d40\0\u3d80" +
"\0\u3dc0\0\u3e00\0\u3e40\0\u3e80\0\u3ec0\0\u3f00\0\u3f40\0\u3f80" +
"\0\u3fc0\0\u4000\0\u4040\0\u4080\0\u40c0\0\u4100\0\u4140\0\u4180" +
"\0\u41c0\0\u4200\0\u4240\0\u4280\0\u42c0\0\u4300\0\u4340\0\u4380" +
"\0\u43c0\0\u4400\0\u4440\0\u4480\0\u44c0\0\u4500\0\u4540\0\u4580" +
"\0\u45c0\0\u4600\0\u4640\0\u4680\0\u46c0\0\u4700\0\u4740\0\u4780" +
"\0\u47c0\0\u4800\0\200\0\u4840\0\u4880\0\u48c0\0\u4900\0\u4940" +
"\0\u4980\0\u49c0\0\u4a00\0\u4a40\0\u4a80\0\u4ac0\0\u4b00\0\u4b40" +
"\0\u4b80\0\u4bc0\0\u4c00\0\u4c40\0\u4c80\0\u4cc0\0\u4d00\0\u4d40" +
"\0\u4d80\0\u4dc0\0\u4e00\0\u4e40\0\u4e80\0\u4ec0\0\u4f00\0\u4f40" +
"\0\u4f80\0\u4fc0\0\u5000\0\u5040\0\u5080\0\u50c0\0\u5100\0\u5140" +
"\0\u5180\0\u51c0\0\u5200\0\u5240\0\u5280\0\u52c0\0\u5300\0\u5340" +
"\0\u5380\0\u53c0\0\u5400\0\u5440\0\u5480\0\u54c0\0\u5500\0\u5540" +
"\0\u5580\0\u55c0\0\u5600\0\u5640\0\u4400\0\u5680\0\u56c0\0\u5700" +
"\0\u5740\0\u5780\0\u57c0\0\u5800\0\u5840\0\u5880\0\u58c0\0\u5900" +
"\0\u5940\0\u5980\0\u59c0\0\u5a00\0\u5a40\0\u4a80\0\u5a80\0\u5ac0" +
"\0\u5b00\0\u5b40\0\u5b80\0\u5bc0\0\u5c00\0\u5c40\0\u5c80\0\u5cc0" +
"\0\u5d00\0\u5d40\0\u5d80\0\u5dc0\0\u5e00\0\u5e40\0\u5e80\0\u5ec0" +
"\0\u5f00\0\u5f40\0\u5f80\0\u5fc0\0\u6000\0\u6040\0\u6080\0\u60c0" +
"\0\u6100\0\u6140\0\u6180\0\u61c0\0\u6200\0\200\0\u6240\0\u6280" +
"\0\u62c0\0\u6300\0\u6340\0\u6380\0\u63c0\0\u6400\0\u6440\0\u6480" +
"\0\u64c0\0\u6500\0\u6540\0\u6580\0\u65c0\0\u6600\0\u6640\0\u6680" +
"\0\u66c0\0\u6700\0\u6740\0\u6780\0\u67c0\0\u6800\0\u6840\0\u6880" +
"\0\u68c0\0\u6900\0\u6940\0\u6980\0\u69c0\0\u6a00\0\u6a40\0\u6a80" +
"\0\u6ac0\0\u6b00\0\u6b40\0\u6b80\0\u6bc0\0\u6c00\0\u6c40\0\u6c80" +
"\0\u6cc0\0\u6d00\0\u6d40\0\u6d80\0\u6dc0\0\u6e00\0\u6e40\0\u6e80" +
"\0\u6ec0\0\u6f00\0\u6f40\0\u6f80\0\u6fc0\0\u7000\0\u7040\0\u7080" +
"\0\u70c0\0\u7100\0\u7140\0\u7180\0\u71c0\0\u7200\0\u7240\0\u7280" +
"\0\u72c0\0\u7300\0\u7340\0\u7380\0\u73c0\0\u7400\0\u7440\0\u7480" +
"\0\u74c0\0\u7500\0\u7540\0\u7580\0\u75c0\0\u7600\0\u7640\0\u7680" +
"\0\u76c0\0\u7700\0\u7740\0\u7780\0\u77c0\0\u7800\0\u7840\0\u7880" +
"\0\u78c0\0\u7900\0\u7940\0\u7980\0\u79c0\0\u7a00\0\u7a40\0\u7a80" +
"\0\u7ac0\0\u7b00\0\u7b40\0\u7b80\0\u7bc0\0\u7c00\0\u7c40\0\u7c80" +
"\0\u7cc0\0\u7d00\0\u7d40\0\u7d80\0\u7dc0\0\u7e00\0\u7e40\0\u7e80" +
"\0\u7ec0\0\u7f00\0\u7f40\0\u7f80\0\u7fc0\0\u8000\0\u8040\0\u8080" +
"\0\u80c0\0\u8100\0\u8140\0\u8180\0\u81c0\0\u8200\0\u8240\0\u8280" +
"\0\u82c0\0\u8300\0\u8340\0\u8380\0\u83c0\0\u8400\0\u8440\0\u8480" +
"\0\u84c0\0\u8500\0\u8540\0\u8580\0\u85c0\0\u8600\0\u8640\0\u8680" +
"\0\u86c0\0\u8700\0\u8740\0\u8780\0\u87c0\0\u8800\0\u8840\0\u8880" +
"\0\u88c0\0\u8900\0\u8940\0\u8980\0\u89c0\0\u8a00\0\u8a40\0\u8a80" +
"\0\u8ac0\0\u8b00\0\u8b40\0\u8b80\0\u8bc0\0\u8c00\0\u8c40\0\u8c80" +
"\0\u8cc0\0\u8d00\0\u8d40\0\u8d80\0\u8dc0\0\u8e00\0\u8e40\0\u8e80" +
"\0\u8ec0\0\u8f00\0\u8f40\0\u8f80\0\u8fc0\0\u9000\0\u9040\0\u9080" +
"\0\u90c0\0\u9100\0\u9140\0\u9180\0\u91c0\0\u9200\0\u9240\0\u9280" +
"\0\u92c0\0\u9300\0\u9340\0\u9380\0\u93c0\0\u9400\0\u9440\0\u9480" +
"\0\u94c0\0\u9500\0\u9540\0\u9580\0\u95c0\0\u9600\0\u9640\0\u9680" +
"\0\u96c0\0\u9700\0\u9740\0\u9780\0\u97c0\0\u9800\0\u9840\0\u9880" +
"\0\u98c0\0\u9900\0\u9940\0\u9980\0\u99c0\0\u9a00\0\u9a40\0\u9a80" +
"\0\u9ac0\0\u9b00\0\u9b40\0\u9b80\0\u9bc0\0\u9c00\0\u9c40\0\u9c80" +
"\0\u9cc0\0\u9d00\0\u9d40\0\u9d80\0\u9dc0\0\u9e00\0\u9e40\0\u9e80" +
"\0\u9ec0\0\u9f00\0\u9f40\0\u9f80\0\u9fc0\0\ua000\0\ua040\0\ua080" +
"\0\ua0c0\0\ua100\0\ua140\0\ua180\0\ua1c0\0\ua200\0\ua240\0\ua280" +
"\0\ua2c0\0\ua300\0\ua340\0\ua380\0\ua3c0\0\ua400\0\ua440\0\ua480" +
"\0\ua4c0\0\ua500\0\ua540\0\ua580\0\ua5c0\0\ua600\0\ua640\0\ua680" +
"\0\ua6c0\0\ua700\0\ua740\0\ua780\0\ua7c0\0\ua800\0\ua840\0\ua880" +
"\0\ua8c0\0\ua900\0\ua940\0\ua980\0\200";
private static int[] zzUnpackRowMap() {
int[] result = new int[701];
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();
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\3\2\4\1\5\1\6\1\4\1\5\1\7\1\10" +
"\1\3\1\11\1\12\1\13\1\14\1\5\1\3\1\15" +
"\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25" +
"\1\26\1\27\1\30\1\31\1\3\1\32\1\31\1\3" +
"\1\32\1\4\1\33\1\34\1\35\1\4\1\36\1\37" +
"\1\40\2\41\3\32\1\42\1\43\1\44\1\45\1\46" +
"\1\4\1\47\2\5\1\4\2\5\3\4\1\5\1\16" +
"\10\50\1\51\17\50\1\52\11\50\1\53\3\50\1\54" +
"\31\50\101\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\1\0\3\56" +
"\2\5\1\56\1\5\2\0\4\56\1\0\1\5\1\0" +
"\1\56\1\0\1\56\1\57\1\60\1\0\6\56\2\0" +
"\1\56\3\0\3\56\1\0\2\56\1\0\3\56\3\0" +
"\7\56\2\5\1\56\2\5\3\56\1\5\1\0\3\56" +
"\2\5\1\56\1\5\2\0\4\56\1\0\1\5\1\0" +
"\1\56\1\0\1\61\1\57\1\60\1\0\6\56\2\0" +
"\1\56\3\0\3\56\1\0\2\56\1\0\3\56\3\0" +
"\7\56\2\5\1\56\2\5\3\56\1\5\1\0\7\62" +
"\1\63\1\64\1\65\66\62\1\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\5\4\1\66\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\67\1\0\3\4\1\70" +
"\2\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\4\4\1\71\13\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\4" +
"\1\72\4\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\1\0\10\14\1\73\1\74\3\14\1\75" +
"\62\14\21\0\1\16\55\0\1\16\1\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\4\4\1\46\13\4\4\0\2\76\1\0\1\76" +
"\7\0\1\76\5\0\1\77\2\0\1\100\1\101\1\102" +
"\1\103\1\104\7\0\1\105\1\106\13\0\1\107\4\0" +
"\1\110\2\76\1\0\2\76\3\0\1\76\2\0\6\4" +
"\2\0\1\55\1\4\1\111\1\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\57\0\1\112\22\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\1\4\1\113\4\4\6\0\1\114" +
"\2\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\115\1\0\5\4\1\116\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\3\4\1\117\1\120\1\4\6\0\2\4\1\121" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\1\4\1\122\1\123\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\1\4\1\124\4\4\6\0" +
"\1\4\1\125\1\4\1\0\2\4\1\0\3\4\3\0" +
"\2\4\1\126\1\127\14\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\4\4\1\130\13\4\2\0\6\4\2\0\1\55\1\131" +
"\2\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\1\132\5\4\6\0\1\133\1\134\1\4\1\0\2\4" +
"\1\0\3\4\3\0\3\4\1\127\1\4\1\135\12\4" +
"\2\0\2\4\2\136\1\4\1\136\2\0\1\55\1\137" +
"\2\4\1\0\1\136\3\0\1\4\1\0\1\4\1\0" +
"\1\4\1\140\1\4\1\141\2\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\7\4\2\136\1\4\2\136" +
"\3\4\1\136\2\0\6\4\2\0\1\55\1\4\1\142" +
"\1\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\2\4\1\143\3\4\6\0\1\4\1\125\1\4\1\0" +
"\2\4\1\0\3\4\3\0\3\4\1\127\14\4\27\0" +
"\1\144\2\0\1\145\11\0\1\146\14\0\1\147\1\0" +
"\1\150\16\0\6\36\2\0\1\55\3\36\1\0\1\36" +
"\3\0\1\36\1\0\1\36\1\0\6\36\5\0\1\151" +
"\3\36\1\0\2\36\1\152\3\36\3\0\20\36\26\0" +
"\1\153\53\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\1\4\1\36\1\152\1\4\2\154\3\0\20\4" +
"\2\0\2\4\2\136\1\4\1\136\2\0\1\55\3\4" +
"\1\0\1\136\3\0\1\4\1\0\1\4\1\0\3\4" +
"\1\155\2\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\4\4\1\156\2\4\2\136\1\4\2\136\3\4" +
"\1\136\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\1\157" +
"\2\4\1\0\2\4\1\0\3\4\3\0\4\4\1\160" +
"\1\4\1\161\11\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\162\1\0\6\4" +
"\6\0\2\4\1\163\1\0\2\4\1\0\3\4\3\0" +
"\4\4\1\164\13\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\6\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\4\4" +
"\1\165\13\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\1\4\1\166" +
"\4\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\1\167\2\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\4\4\1\170" +
"\13\4\1\0\10\50\1\0\17\50\1\0\11\50\1\0" +
"\3\50\1\0\31\50\26\0\1\171\15\0\1\172\61\0" +
"\1\173\117\0\1\174\43\0\1\175\65\0\7\56\2\0" +
"\4\56\1\0\1\56\1\0\1\56\1\0\1\56\1\0" +
"\1\56\1\0\6\56\2\0\1\56\3\0\3\56\1\0" +
"\2\56\1\0\3\56\3\0\20\56\4\0\2\76\1\0" +
"\1\76\7\0\1\76\47\0\2\76\1\0\2\76\3\0" +
"\1\76\1\0\3\56\2\176\1\56\1\176\2\0\4\56" +
"\1\0\1\176\1\0\1\56\1\0\1\56\1\0\1\56" +
"\1\177\6\56\2\0\1\56\1\0\1\177\1\0\3\56" +
"\1\0\2\56\1\0\3\56\3\0\7\56\2\176\1\56" +
"\2\176\3\56\1\176\1\0\3\56\4\200\2\0\3\56" +
"\1\200\1\0\1\200\1\0\1\56\1\0\1\56\1\0" +
"\1\200\1\0\2\56\2\200\2\56\2\0\1\56\3\0" +
"\3\56\1\0\2\56\1\0\2\56\1\200\3\0\1\56" +
"\2\200\4\56\2\200\1\56\2\200\3\56\1\200\1\0" +
"\7\201\1\202\1\0\67\201\7\0\1\202\70\0\4\201" +
"\1\203\1\201\1\204\1\205\1\0\1\62\1\206\3\62" +
"\1\203\7\201\3\62\35\201\1\203\1\204\1\201\1\204" +
"\1\203\5\201\1\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
"\1\207\2\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
"\1\210\1\4\1\0\3\4\3\0\3\4\1\211\14\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\1\212\5\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\1\213\5\4\6\0\1\4\1\214\1\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\6\4\6\0\2\4\1\215\1\0\2\4" +
"\1\0\3\4\3\0\20\4\1\0\11\73\1\216\3\73" +
"\1\217\66\73\1\14\1\73\2\14\1\0\1\14\1\220" +
"\4\14\7\73\3\14\35\73\2\14\1\73\2\14\5\73" +
"\3\56\2\76\1\56\1\76\2\0\4\56\1\0\1\76" +
"\1\0\1\56\1\0\1\56\1\0\1\60\1\0\6\56" +
"\2\0\1\56\3\0\3\56\1\0\2\56\1\0\3\56" +
"\3\0\7\56\2\76\1\56\2\76\3\56\1\76\14\0" +
"\1\221\110\0\1\222\117\0\1\223\46\0\1\224\13\0" +
"\1\225\114\0\1\226\16\0\1\227\26\0\1\230\30\0" +
"\1\231\17\0\1\232\43\0\1\233\1\0\1\234\133\0" +
"\1\235\43\0\1\236\1\237\71\0\1\240\54\0\6\4" +
"\2\0\1\55\1\241\2\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\2\112\2\0\1\112" +
"\4\0\3\112\5\0\1\112\1\0\1\112\1\0\6\112" +
"\6\0\3\112\1\0\2\112\1\0\3\112\1\0\11\112" +
"\2\0\1\112\2\0\3\112\3\0\6\4\2\0\1\55" +
"\1\242\2\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\3\4\1\243\2\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\1\4\1\244\4\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\245" +
"\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\6\4\1\246\11\4\2\0\6\4\2\0\1\55\1\247" +
"\2\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\4\4\1\250\1\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\4\4\1\251\13\4\2\0" +
"\6\4\2\0\1\55\1\4\1\252\1\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\4\4\1\253\1\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\1\4\1\254\1\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\2\4\1\166" +
"\15\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\5\4\1\255\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\1\4\1\256\4\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\1\257\2\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\2\4\1\246\15\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\257\1\0\6\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\1\4\1\260\1\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\2\4\1\261\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\1\4\1\262\1\4\1\263\2\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\1\4\1\264\2\4\1\264\1\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\1\257\2\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\3\4\1\265\2\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\1\4\1\266\1\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\2\4" +
"\2\136\1\4\1\136\2\0\1\55\3\4\1\0\1\136" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\7\4\2\136\1\4" +
"\2\136\3\4\1\136\2\0\6\4\2\0\1\55\2\4" +
"\1\267\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\2\4" +
"\1\270\1\0\2\4\1\0\3\4\3\0\4\4\1\271" +
"\13\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\1\4\1\272\16\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\1\273\4\4\1\274\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\1\275\17\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\276\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\30\0\1\277\77\0" +
"\1\300\103\0\1\301\75\0\1\302\31\0\1\303\77\0" +
"\1\304\15\0\6\151\3\0\3\151\1\0\1\151\3\0" +
"\1\151\1\0\1\151\1\0\6\151\5\0\4\151\1\0" +
"\2\151\1\152\3\151\3\0\20\151\57\0\1\32\22\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\1\4\1\305\4\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\4\4\1\306\1\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\307" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\1\4\1\310" +
"\1\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\1\4" +
"\1\311\1\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\1\4\1\312\16\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\1\246\17\4\2\0\6\4\2\0" +
"\1\55\1\313\2\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\314" +
"\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\315\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\4\4\1\246\1\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\1\4\1\316\1\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\1\317\17\4\44\0\1\320\66\0" +
"\1\321\73\0\1\322\117\0\1\323\34\0\4\324\5\0" +
"\1\324\1\0\1\324\5\0\1\324\3\0\2\324\21\0" +
"\1\324\4\0\2\324\4\0\2\324\1\0\2\324\3\0" +
"\1\324\1\0\3\56\2\176\1\56\1\176\2\0\4\56" +
"\1\0\1\176\1\0\1\56\1\0\1\56\1\0\1\56" +
"\1\0\6\56\2\0\1\56\3\0\3\56\1\0\2\56" +
"\1\0\3\56\3\0\7\56\2\176\1\56\2\176\3\56" +
"\1\176\4\0\2\176\1\0\1\176\7\0\1\176\47\0" +
"\2\176\1\0\2\176\3\0\1\176\1\0\7\201\1\63" +
"\1\0\73\201\1\204\1\201\1\204\1\202\1\0\5\201" +
"\1\204\47\201\2\204\1\201\2\204\11\201\1\62\1\201" +
"\1\62\1\202\1\0\5\201\1\62\47\201\2\62\1\201" +
"\2\62\10\201\4\325\1\63\1\0\3\201\1\325\1\201" +
"\1\325\5\201\1\325\3\201\2\325\21\201\1\325\4\201" +
"\2\325\4\201\2\325\1\201\2\325\3\201\1\325\1\201" +
"\1\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\1\4\1\264\4\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\326\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\327" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\2\4" +
"\1\330\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\331\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\2\4\1\332\15\4\1\0\10\73\1\0\72\73\4\333" +
"\2\73\1\216\2\73\1\333\1\217\1\333\5\73\1\333" +
"\3\73\2\333\21\73\1\333\4\73\2\333\4\73\2\333" +
"\1\73\2\333\3\73\1\333\1\73\61\0\1\334\51\0" +
"\1\335\26\0\1\336\41\0\1\337\66\0\1\340\113\0" +
"\1\341\63\0\1\342\144\0\1\343\62\0\1\344\65\0" +
"\1\345\60\0\1\346\150\0\1\347\43\0\1\350\30\0" +
"\1\351\62\0\1\352\62\0\1\353\102\0\1\354\74\0" +
"\1\355\52\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\6\4\1\356\11\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\357\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\1\4\1\360\1\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\4\4\1\361\13\4\2\0\6\4\2\0\1\55\1\362" +
"\2\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\363\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\2\4\1\364\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\5\4\1\242\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\3\4\1\365" +
"\2\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\3\4\1\366\2\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\4\4\1\367\1\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\4\4\1\370\13\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\1\371\5\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\3\4\1\372\2\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\373" +
"\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\3\4\1\374\14\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\375\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\6\4\6\0\2\4\1\376\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\377" +
"\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\u0100\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\1\4\1\u0101\4\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\1\u0102\5\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\4\4" +
"\1\377\1\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\1\u0103\17\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\1\u0104\5\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\14\4\1\u0105\3\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u0106" +
"\1\u0107\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\1\u0108\5\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\4\4\1\u0109\13\4\14\0" +
"\1\u010a\10\0\1\u010b\5\0\1\u010c\27\0\1\u010c\101\0" +
"\1\u010d\42\0\1\u010e\116\0\1\u010f\57\0\1\u0110\64\0" +
"\1\u0111\112\0\1\u0112\52\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\3\4" +
"\1\u0113\2\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\3\4\1\u0114" +
"\2\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\1\4\1\u0115\16\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\5\4\1\u0116\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\u0117\4\4\1\u0118\1\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\3\4\1\u0118\14\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\4\4\1\u0119\1\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\2\4\1\u011a\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\4\4\1\u011b\13\4\33\0\1\u011c\11\0\1\u011d\34\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\2\4\1\u011e\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u011f" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\46\0\1\u0120\56\0\1\320\116\0\1\u0121" +
"\57\0\1\u0122\57\0\4\u0123\5\0\1\u0123\1\0\1\u0123" +
"\5\0\1\u0123\3\0\2\u0123\21\0\1\u0123\4\0\2\u0123" +
"\4\0\2\u0123\1\0\2\u0123\3\0\1\u0123\1\0\3\201" +
"\4\u0124\1\63\1\0\3\201\1\u0124\1\201\1\u0124\5\201" +
"\1\u0124\3\201\2\u0124\21\201\1\u0124\4\201\2\u0124\4\201" +
"\2\u0124\1\201\2\u0124\3\201\1\u0124\1\201\31\0\1\u0125" +
"\12\0\1\u0126\63\0\1\u0127\1\0\1\u0128\11\0\1\u0129" +
"\14\0\1\u012a\17\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\1\u012b\17\4" +
"\33\0\1\u0128\11\0\1\u0129\34\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\3\4\1\u012b\14\4\1\0\3\73\4\u012c\2\73\1\216" +
"\2\73\1\u012c\1\217\1\u012c\5\73\1\u012c\3\73\2\u012c" +
"\21\73\1\u012c\4\73\2\u012c\4\73\2\u012c\1\73\2\u012c" +
"\3\73\1\u012c\1\73\77\0\1\u012d\26\0\1\u012e\115\0" +
"\1\u012f\65\0\1\u0130\130\0\1\u0131\45\0\1\u0132\72\0" +
"\1\u0133\104\0\1\u0134\72\0\1\u0135\102\0\1\u0136\77\0" +
"\1\u0137\102\0\1\u0138\76\0\1\u0139\141\0\1\u013a\36\0" +
"\1\u013b\125\0\1\u013c\52\0\1\u013d\106\0\1\u013e\36\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\5\4\1\u013f\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\6\4\6\0\3\4\1\0\1\214\1\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\4" +
"\1\u0140\4\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\31\0\1\u0141\1\0\1\u011c\11\0\1\u011d" +
"\14\0\1\u0142\17\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\u0143\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\1\u0144\5\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\4\4\1\356\1\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\u0145\1\u0146" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\1\u0147\5\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\1\4\1\u0148\4\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\5\4\1\u0149\12\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\u014a\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\u014b\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\31\0" +
"\1\u0141\1\0\1\u011c\11\0\1\u014c\14\0\1\u0142\17\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\1\4\1\u014d\16\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\6\4\6\0\2\4\1\u014e\1\0\2\4" +
"\1\0\3\4\3\0\20\4\33\0\1\u011c\11\0\1\u014f" +
"\34\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\5\4\1\u0150\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\6\4\6\0\1\u0151\2\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\3\4\1\u0152\2\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\u0153\1\0\6\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\u0154\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\1\4\1\u0155\4\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\27\0\1\u0156\52\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\3\4\1\u0157\2\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\14\4\1\u0158\3\4\25\0\1\u0159\147\0\1\u0159" +
"\27\0\1\u0159\1\0\1\u0159\53\0\1\u015a\126\0\1\u015b" +
"\112\0\1\u015c\113\0\1\u015d\100\0\1\u015e\101\0\1\u015e" +
"\15\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\1\4\1\u015f\4\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\1\u0160\5\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\14\4\1\u0161\3\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\1\u0162\5\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\33\0\1\u0128\46\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\u0163" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\3\4\1\u0164\2\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\4\4\1\u0165\1\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\6\4\5\0\1\u0166\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\64\0\1\u0167\27\0" +
"\1\u0168\65\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\1\u0169\5\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\u016a\6\4\5\0\1\u016b\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\42\0\1\u016c\71\0" +
"\1\320\11\0\1\u0120\33\0\1\u0122\1\u016d\4\u0122\1\u016d" +
"\2\0\3\u0122\1\0\1\u0122\1\0\1\u016d\1\0\1\u0122" +
"\1\u016d\1\u0122\1\u016d\6\u0122\1\0\4\u016d\4\u0122\1\u016d" +
"\2\u0122\1\u016d\3\u0122\1\u016d\2\0\20\u0122\4\0\4\u016e" +
"\5\0\1\u016e\1\0\1\u016e\5\0\1\u016e\3\0\2\u016e" +
"\21\0\1\u016e\4\0\2\u016e\4\0\2\u016e\1\0\2\u016e" +
"\3\0\1\u016e\1\0\3\201\4\u016f\1\63\1\0\3\201" +
"\1\u016f\1\201\1\u016f\5\201\1\u016f\3\201\2\u016f\21\201" +
"\1\u016f\4\201\2\u016f\4\201\2\u016f\1\201\2\u016f\3\201" +
"\1\u016f\1\201\27\0\1\u0170\63\0\1\u0171\116\0\1\u0172" +
"\130\0\1\u0173\27\0\1\u0174\147\0\1\u0175\15\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\356\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\1\0\3\73\4\u0176\2\73\1\216" +
"\2\73\1\u0176\1\217\1\u0176\5\73\1\u0176\3\73\2\u0176" +
"\21\73\1\u0176\4\73\2\u0176\4\73\2\u0176\1\73\2\u0176" +
"\3\73\1\u0176\1\73\30\0\1\101\1\102\1\u0177\1\u0178" +
"\7\0\1\u0179\21\0\1\110\43\0\1\u017a\101\0\1\u017b" +
"\125\0\1\u0133\44\0\1\u017c\135\0\1\u017d\45\0\1\u017e" +
"\74\0\1\u0133\103\0\1\u017f\124\0\1\342\102\0\1\u0180" +
"\101\0\1\u0133\36\0\1\u0181\77\0\1\u0182\115\0\1\u0183" +
"\70\0\1\u0133\127\0\1\u0130\15\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\2\4\1\u0184\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\1\4\1\u0185" +
"\1\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\33\0\1\u0186\130\0\1\u0187\60\0\1\u0188\34\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\u0189\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\2\4\1\u018a\15\4\32\0\1\u018b\47\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\3\4\1\u018c\2\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\3\4\1\u018d\2\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\u018e\6\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\15\0\1\u018f\16\0\1\u0190\12\0\1\u0191\11\0\1\u0192" +
"\2\0\1\u0193\42\0\1\u0194\64\0\1\u0195\65\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\1\u0196\5\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\1\4\1\356\16\4\14\0\1\u0197\65\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u0198" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\263\1\0\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\1\u012b\5\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\1\4\1\u0199\16\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\2\4\1\u0198\15\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\2\4" +
"\1\u019a\3\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\64\0\1\u019b\15\0\6\4\2\0\1\55" +
"\1\4\1\u019c\1\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\u019d\1\0\6\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\76\0\1\u019e\26\0\1\303\6\0\1\u019f\130\0\1\u015e" +
"\41\0\1\u01a0\113\0\1\u01a1\37\0\1\u01a2\76\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\3\4\1\u01a3\14\4\2\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\6\4\6\0\2\4\1\u01a4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\u01a5\6\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\u01a6\1\4\1\u01a7\4\4\5\0" +
"\1\u01a8\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\31\0\1\u0127\30\0\1\u012a\17\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\1\4\1\u01a9\4\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\u01aa\1\0\6\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\67\0\1\u01ab\3\0\1\u01ac\20\0\1\u01ad\112\0\1\u01ae" +
"\52\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\4\4\1\u01af\13\4\25\0" +
"\1\u01b0\2\0\1\u01b1\16\0\1\u01b2\14\0\1\u01b3\44\0" +
"\1\u01b4\35\0\1\u01ab\52\0\1\u0122\41\0\4\4\5\0" +
"\1\4\1\0\1\4\5\0\1\4\3\0\2\4\21\0" +
"\1\4\4\0\2\4\4\0\2\4\1\0\2\4\3\0" +
"\1\4\1\0\3\201\4\62\1\63\1\0\3\201\1\62" +
"\1\201\1\62\5\201\1\62\3\201\2\62\21\201\1\62" +
"\4\201\2\62\4\201\2\62\1\201\2\62\3\201\1\62" +
"\1\201\27\0\1\u01b5\103\0\1\u01b6\127\0\1\u01b7\27\0" +
"\1\u01b8\112\0\1\u019e\63\0\1\u01b9\65\0\3\73\4\14" +
"\2\73\1\216\2\73\1\14\1\217\1\14\5\73\1\14" +
"\3\73\2\14\21\73\1\14\4\73\2\14\4\73\2\14" +
"\1\73\2\14\3\73\1\14\1\73\63\0\1\u01ba\57\0" +
"\1\231\65\0\1\234\75\0\1\u01bb\76\0\1\u01bc\102\0" +
"\1\u01bd\73\0\1\u01be\76\0\1\u01bf\135\0\1\u01c0\76\0" +
"\1\u01bf\103\0\1\u01c1\43\0\1\u01c2\47\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u01c3" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\u01c4\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\64\0" +
"\1\u01c5\26\0\1\u01c6\100\0\1\u01c7\112\0\1\u01c8\52\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\u01c9\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\30\0\1\u01ca\51\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\1\u01cb\5\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\1\4\1\u01cc\16\4\33\0\1\u01cd\130\0\1\u01ce\1\u01cf" +
"\55\0\1\u01d0\101\0\1\u01d1\75\0\1\u01d2\51\0\1\u01d3" +
"\146\0\1\u01d4\42\0\1\u01d5\52\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\2\4\1\u01d6\3\4\6\0\3\4\1\0\2\4\1\0" +
"\3\4\3\0\20\4\27\0\1\u01d7\52\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\u01d8\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\1\u01d9\5\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\3\4\1\u01da\2\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\26\0" +
"\1\u01db\53\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\1\4\1\u01dc\16\4" +
"\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\u01dd\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\27\0\1\u01de\131\0" +
"\1\u01df\21\0\1\u01a2\26\0\1\u01e0\47\0\6\u01a2\3\0" +
"\3\u01a2\1\0\1\u01a2\3\0\1\u01a2\1\0\1\u01a2\1\0" +
"\6\u01a2\6\0\3\u01a2\1\0\2\u01a2\1\0\3\u01a2\3\0" +
"\20\u01a2\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\5\4\1\356\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\0\4\4\1\u012b\1\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\61\0\1\u01e1" +
"\52\0\1\u01e2\12\0\1\u01e3\11\0\1\u01e4\4\0\1\u01e5" +
"\13\0\6\4\2\0\1\55\1\u01e6\2\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\43\0\1\u01e7" +
"\23\0\1\u01ab\2\0\1\u019e\7\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\u01e8\1\0" +
"\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\u01e9\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\20\4\70\0\1\u019e" +
"\26\0\1\u019e\143\0\1\u01d5\56\0\1\u01ea\37\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\1\4\1\u01eb\4\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\23\0\1\u01ec\101\0" +
"\1\u01ed\117\0\1\u01ee\47\0\1\u01ef\112\0\1\u01f0\101\0" +
"\1\u01f1\74\0\1\u01f2\102\0\1\u0174\130\0\1\u019e\31\0" +
"\1\u01f3\143\0\1\u01f4\45\0\1\u01f5\75\0\1\u01f6\101\0" +
"\1\u01f7\132\0\1\u01f8\43\0\1\u01f9\64\0\1\342\111\0" +
"\1\u01fa\105\0\1\u01fb\46\0\6\4\2\0\1\55\1\4" +
"\1\u01cc\1\4\1\0\1\4\3\0\1\4\1\0\1\4" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\47\0\1\u0191\10\0\1\u01fc\3\0\1\u0193" +
"\45\0\1\u0195\62\0\1\u01fd\111\0\1\u01fe\134\0\1\u01ff" +
"\27\0\1\u0200\113\0\1\u0201\51\0\6\4\2\0\1\55" +
"\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
"\6\4\6\0\2\4\1\u0202\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\1\356\5\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\25\0\1\u0203\136\0\1\u0204\42\0\1\u0205\134\0\1\u0206" +
"\75\0\1\u0205\47\0\1\u0207\136\0\1\u0208\34\0\1\u0209" +
"\113\0\1\u020a\37\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
"\1\4\1\356\1\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\42\0\1\u020b\71\0\1\u020c\45\0\6\4\2\0" +
"\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u020d" +
"\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
"\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\1\4\1\u012b" +
"\16\4\15\0\1\u020e\13\0\1\u0127\1\0\1\u0128\1\u0190" +
"\24\0\1\u0192\1\u012a\17\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\u020f\1\0\6\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\34\0\1\u0210\7\0\1\u0211\1\u0212\12\0\1\u0213\1\u0214" +
"\1\u0215\47\0\1\u0216\110\0\1\u015e\67\0\1\u0217\76\0" +
"\1\u0218\74\0\1\u0219\115\0\1\u021a\65\0\1\u021b\71\0" +
"\1\u021c\54\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\1\4\1\u021d\16\4" +
"\45\0\1\u021e\34\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\2\4\1\u021f" +
"\15\4\27\0\1\u0220\67\0\1\u0221\13\0\1\u0222\46\0" +
"\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
"\1\0\1\4\1\u0223\6\4\6\0\3\4\1\0\2\4" +
"\1\0\3\4\3\0\20\4\61\0\1\u0224\52\0\1\u0225" +
"\125\0\1\u0226\106\0\1\u0227\72\0\1\u0228\100\0\1\u019e" +
"\44\0\1\u0229\100\0\1\u0205\76\0\1\u01fb\145\0\1\u022a" +
"\27\0\1\u013d\114\0\1\u022b\64\0\1\u022c\101\0\1\u022d" +
"\57\0\1\u022e\116\0\1\u0133\130\0\1\u022f\46\0\1\u0230" +
"\106\0\1\u0231\63\0\1\u0232\76\0\1\u0233\104\0\1\u0234" +
"\47\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\4\4\1\u0235\13\4\14\0" +
"\1\u0236\116\0\1\u0237\71\0\1\u019e\102\0\1\u0174\77\0" +
"\1\u019e\74\0\1\u0238\103\0\1\u0127\13\0\1\u0129\14\0" +
"\1\u012a\34\0\1\u0221\77\0\1\u0221\13\0\1\u0239\113\0" +
"\1\u023a\32\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\2\4\1\356\15\4" +
"\65\0\1\u01cf\14\0\6\4\2\0\1\55\3\4\1\0" +
"\1\4\3\0\1\4\1\0\1\4\1\u023b\6\4\6\0" +
"\3\4\1\0\2\4\1\0\3\4\3\0\20\4\13\0" +
"\1\u023c\13\0\1\u023d\134\0\1\u023e\27\0\1\u023f\130\0" +
"\1\u0240\45\0\1\u0241\131\0\1\u0242\62\0\1\u0243\102\0" +
"\1\u015e\100\0\1\u0174\73\0\1\u0244\131\0\1\u0245\47\0" +
"\1\u0246\74\0\1\u0247\52\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\u0248" +
"\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
"\20\4\63\0\1\u0249\16\0\6\4\2\0\1\55\3\4" +
"\1\0\1\4\3\0\1\4\1\0\1\4\1\u024a\6\4" +
"\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
"\64\0\1\u024b\45\0\1\u024c\112\0\1\u024d\57\0\1\u024e" +
"\77\0\1\u024f\65\0\1\u0250\111\0\1\u0251\77\0\1\u0252" +
"\140\0\1\u0253\25\0\1\u0254\116\0\1\u0177\130\0\1\u0255" +
"\42\0\1\u0256\117\0\1\u0257\57\0\1\u013d\115\0\1\u0258" +
"\57\0\1\u01d5\105\0\1\u0239\77\0\1\u0128\11\0\1\u0129" +
"\14\0\1\u012a\64\0\1\u0259\115\0\1\u025a\14\0\6\4" +
"\2\0\1\55\1\4\1\356\1\4\1\0\1\4\3\0" +
"\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\63\0\1\u025b\41\0" +
"\1\u025c\133\0\1\u0174\63\0\1\u025d\77\0\1\u025e\116\0" +
"\1\u025f\57\0\1\u0260\65\0\1\u0261\100\0\1\u0262\73\0" +
"\1\u0263\100\0\1\u0264\103\0\1\u0265\73\0\1\u0266\76\0" +
"\1\u015e\115\0\1\u0267\57\0\1\u0268\106\0\1\u0269\106\0" +
"\1\u026a\36\0\6\4\2\0\1\55\3\4\1\0\1\4" +
"\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
"\1\0\2\4\1\0\3\4\3\0\4\4\1\u026b\13\4" +
"\43\0\1\u0253\70\0\1\u026c\71\0\1\u026d\133\0\1\u026e" +
"\44\0\1\u026f\64\0\1\u0270\6\0\1\u0271\120\0\1\u0272" +
"\66\0\1\u0273\106\0\1\u016b\116\0\1\u0274\105\0\1\u01ab" +
"\71\0\1\u0205\32\0\1\u0133\115\0\1\u0133\112\0\1\u0275" +
"\114\0\1\u019e\43\0\1\u0276\77\0\1\u0277\100\0\1\u0278" +
"\102\0\1\u0279\74\0\1\u027a\77\0\1\u027b\101\0\1\u019e" +
"\73\0\1\u027c\101\0\1\u027d\135\0\1\u027e\37\0\1\u027f" +
"\101\0\1\u0280\77\0\1\u0281\75\0\1\u0282\66\0\1\u0283" +
"\125\0\1\u0284\71\0\1\u019e\127\0\1\u0285\15\0\6\4" +
"\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
"\1\4\1\0\1\4\1\356\4\4\6\0\3\4\1\0" +
"\2\4\1\0\3\4\3\0\20\4\65\0\1\u0286\43\0" +
"\1\u0127\1\0\1\u0128\11\0\1\u0129\114\0\1\u0207\104\0" +
"\1\u01ab\7\0\1\u019e\27\0\1\u0287\115\0\1\u0174\61\0" +
"\1\u0288\77\0\1\u0289\77\0\1\u0251\77\0\1\u028a\102\0" +
"\1\u028b\127\0\1\u028c\60\0\1\u019e\50\0\1\u019e\162\0" +
"\1\u019e\61\0\1\u0278\46\0\1\u028d\114\0\1\u028e\120\0" +
"\1\u028f\41\0\1\u0290\62\0\1\u0291\150\0\1\u0292\74\0" +
"\1\u0293\101\0\1\u0294\57\0\1\u01e7\23\0\1\u01ab\3\0" +
"\1\u01ac\66\0\1\u0295\31\0\1\u0296\110\0\1\u0207\117\0" +
"\1\u0297\60\0\1\u0298\132\0\1\u0299\46\0\1\u029a\101\0" +
"\1\u029b\107\0\1\u029c\116\0\1\u028d\102\0\1\u029d\44\0" +
"\1\u029e\100\0\1\u029f\133\0\1\u028d\40\0\1\u028d\112\0" +
"\1\u02a0\63\0\1\u02a1\132\0\1\u02a2\102\0\1\u0279\62\0" +
"\1\u0191\14\0\1\u0193\56\0\1\u0133\64\0\1\u02a3\76\0" +
"\1\u02a4\100\0\1\u02a5\77\0\1\u02a6\101\0\1\u02a7\100\0" +
"\1\u028d\135\0\1\u02a8\35\0\1\u02a9\13\0\1\u02aa\77\0" +
"\1\u02ab\66\0\1\u02ac\77\0\1\u019e\77\0\1\u02ad\111\0" +
"\1\u02ae\114\0\1\u02af\31\0\1\u02b0\151\0\1\u02b1\44\0" +
"\1\u02b2\75\0\1\u02b3\134\0\1\u028d\26\0\1\u02b4\126\0" +
"\1\u027d\61\0\1\u028d\140\0\1\u02b5\55\0\1\u0205\47\0" +
"\1\u02b6\147\0\1\u02b7\76\0\1\u0205\31\0\1\u02b8\144\0" +
"\1\u01f3\31\0\1\u02b9\147\0\1\u019e\60\0\1\u02ba\130\0" +
"\1\u02bb\26\0\1\u02bc\134\0\1\u02bd\16\0";
private static int[] zzUnpackTrans() {
int[] result = new int[43456];
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[] = {
"Unkown internal scanner error",
"Error: could not match input",
"Error: pushback value was too large"
};
/**
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
*/
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 =
"\2\0\1\11\4\1\1\11\4\1\1\11\13\1\2\11" +
"\16\1\1\11\3\1\1\0\1\1\1\0\3\1\1\11" +
"\1\0\10\1\1\11\1\1\12\0\33\1\6\0\1\11" +
"\1\0\15\1\5\0\1\1\1\0\2\1\1\11\14\1" +
"\1\11\1\1\20\0\35\1\7\0\10\1\1\0\2\1" +
"\5\0\1\1\2\0\1\1\1\0\2\1\22\0\5\1" +
"\1\0\11\1\1\0\2\1\1\0\6\1\1\0\2\1" +
"\11\0\4\1\1\0\4\1\2\0\2\1\2\0\1\1" +
"\1\0\1\1\6\0\2\1\6\0\1\11\13\0\2\1" +
"\3\0\2\1\1\0\3\1\3\0\2\1\1\0\6\1" +
"\1\0\3\1\5\0\4\1\1\0\2\1\3\0\1\1" +
"\5\0\1\1\6\0\1\1\7\0\1\1\4\0\3\1" +
"\4\0\1\1\1\0\2\1\10\0\1\1\1\0\3\1" +
"\1\0\2\1\1\11\3\0\3\1\2\0\1\1\1\0" +
"\2\1\3\0\2\1\23\0\1\1\7\0\2\1\10\0" +
"\3\1\1\0\2\1\1\0\1\1\11\0\1\1\1\0" +
"\1\1\2\0\1\1\22\0\1\1\3\0\1\1\12\0" +
"\1\1\1\0\1\1\15\0\1\1\1\0\1\1\25\0" +
"\1\1\22\0\1\1\10\0\1\1\26\0\1\1\2\0" +
"\1\1\35\0\1\1\3\0\1\1\6\0\1\1\50\0" +
"\1\11";
private static int[] zzUnpackAttribute() {
int[] result = new int[701];
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 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 textposition at the last state to be included in yytext */
private int zzPushbackPos;
/** 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;
/** number of newlines encountered up to the start of the matched text */
private int yyline;
/** the number of characters up to the start of the matched text */
private int yychar;
/**
* the number of characters from the last newline up to the start of the
* matched text
*/
private int yycolumn;
/**
* zzAtBOL == true <=> the scanner is currently at the beginning of a line
*/
private boolean zzAtBOL = true;
/** zzAtEOF == true <=> the scanner is at the EOF */
private boolean zzAtEOF;
/* user code: */
/**
* Constructor. This must be here because JFlex does not generate a
* no-parameter constructor.
*/
public SmaliTokenMaker() {
}
/**
* Adds the token specified to the current linked list of tokens.
*
* @param tokenType The token's type.
* @see #addToken(int, int, int)
*/
private void addHyperlinkToken(int start, int end, int tokenType) {
int so = start + offsetShift;
addToken(zzBuffer, start, end, tokenType, so, true);
}
/**
* Adds the token specified to the current linked list of tokens.
*
* @param tokenType The token's type.
*/
private void addToken(int tokenType) {
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
}
/**
* Adds the token specified to the current linked list of tokens.
*
* @param tokenType The token's type.
* @see #addHyperlinkToken(int, int, int)
*/
private void addToken(int start, int end, int tokenType) {
int so = start + offsetShift;
addToken(zzBuffer, start, end, tokenType, so, false);
}
/**
* Adds the token specified to the current linked list of tokens.
*
* @param array The character array.
* @param start The starting offset in the array.
* @param end The ending offset in the array.
* @param tokenType The token's type.
* @param startOffset The offset in the document at which this token
* occurs.
* @param hyperlink Whether this token is a hyperlink.
*/
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;
}
/**
* {@inheritDoc}
*/
public String[] getLineCommentStartAndEnd(int languageIndex) {
return new String[] { "#", null };
}
/**
* Returns the first token in the linked list of tokens generated
* from <code>text</code>. This method must be implemented by
* subclasses so they can correctly implement syntax highlighting.
*
* @param text The text from which to get tokens.
* @param initialTokenType The token type we should start with.
* @param startOffset The offset into the document at which
* <code>text</code> starts.
* @return The first <code>Token</code> in a linked list representing
* the syntax highlighted text.
*/
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
resetTokenList();
this.offsetShift = -text.offset + startOffset;
// Start off in the proper state.
int state = Token.NULL;
switch (initialTokenType) {
/* No multi-line comments */
/* No documentation comments */
default:
state = Token.NULL;
}
s = text;
try {
yyreset(zzReader);
yybegin(state);
return yylex();
} catch (IOException ioe) {
ioe.printStackTrace();
return new TokenImpl();
}
}
/**
* Refills the input buffer.
*
* @return <code>true</code> if EOF was reached, otherwise
* <code>false</code>.
*/
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
* <b>cannot</b> be reused (internal buffer is discarded and lost).
* Lexical state is set to <tt>YY_INITIAL</tt>.
*
* @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 = zzPushbackPos = s.offset;
zzLexicalState = YYINITIAL;
zzReader = reader;
zzAtBOL = true;
zzAtEOF = false;
}
/**
* Creates a new scanner
* There is also a java.io.InputStream version of this constructor.
*
* @param in the java.io.Reader to read input from.
*/
public SmaliTokenMaker(Reader in) {
this.zzReader = in;
}
/**
* Creates a new scanner.
* There is also java.io.Reader version of this constructor.
*
* @param in the java.io.Inputstream to read input from.
*/
public SmaliTokenMaker(InputStream in) {
this(new InputStreamReader(in));
}
/**
* Unpacks the compressed character translation table.
*
* @param packed the packed character translation table
* @return the unpacked character translation table
*/
private static char[] zzUnpackCMap(String packed) {
char[] map = new char[0x10000];
int i = 0; /* index in packed string */
int j = 0; /* index in unpacked array */
while (i < 188) {
int count = packed.charAt(i++);
char value = packed.charAt(i++);
do
map[j++] = value;
while (--count > 0);
}
return map;
}
/**
* Closes the input stream.
*/
public final void yyclose() throws IOException {
zzAtEOF = true; /* indicate end of file */
zzEndRead = zzStartRead; /* invalidate buffer */
if (zzReader != null)
zzReader.close();
}
/**
* Enters a new lexical state
*
* @param newState the new lexical state
*/
public final void yybegin(int newState) {
zzLexicalState = newState;
}
/**
* 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 <tt>pos</tt> 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 occured 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
* @exception IOException if any I/O-Error occurs
*/
public Token yylex() throws IOException {
int zzInput;
int zzAction;
// cached fields:
int zzCurrentPosL;
int zzMarkedPosL;
int zzEndReadL = zzEndRead;
char[] zzBufferL = zzBuffer;
char[] zzCMapL = ZZ_CMAP;
int[] zzTransL = ZZ_TRANS;
int[] zzRowMapL = ZZ_ROWMAP;
int[] zzAttrL = ZZ_ATTRIBUTE;
while (true) {
zzMarkedPosL = zzMarkedPos;
zzAction = -1;
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
zzState = zzLexicalState;
zzForAction: {
while (true) {
if (zzCurrentPosL < zzEndReadL)
zzInput = zzBufferL[zzCurrentPosL++];
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 = zzBufferL[zzCurrentPosL++];
}
}
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
if (zzNext == -1)
break zzForAction;
zzState = zzNext;
int zzAttributes = zzAttrL[zzState];
if ((zzAttributes & 1) == 1) {
zzAction = zzState;
zzMarkedPosL = zzCurrentPosL;
if ((zzAttributes & 8) == 8)
break zzForAction;
}
}
}
// store back cached position
zzMarkedPos = zzMarkedPosL;
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
case 4: {
addNullToken();
return firstToken;
}
case 27:
break;
case 19: {
addToken(Token.LITERAL_CHAR);
}
case 28:
break;
case 26: {
addToken(Token.MARKUP_TAG_NAME);
}
case 29:
break;
case 7: {
addToken(Token.WHITESPACE);
}
case 30:
break;
case 18: {
addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
}
case 31:
break;
case 21: {
addToken(Token.ERROR_STRING_DOUBLE);
}
case 32:
break;
case 17: {
addToken(Token.LITERAL_NUMBER_FLOAT);
}
case 33:
break;
case 22: {
addToken(Token.RESERVED_WORD);
}
case 34:
break;
case 8: {
addToken(Token.SEPARATOR);
}
case 35:
break;
case 10: {
addToken(Token.VARIABLE);
}
case 36:
break;
case 1: {
addToken(Token.IDENTIFIER);
}
case 37:
break;
case 13: {
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
addNullToken();
return firstToken;
}
case 38:
break;
case 20: {
addToken(Token.FUNCTION);
}
case 39:
break;
case 3: {
addToken(Token.ERROR_CHAR);
addNullToken();
return firstToken;
}
case 40:
break;
case 5: {
addToken(Token.ERROR_STRING_DOUBLE);
addNullToken();
return firstToken;
}
case 41:
break;
case 11: {
addToken(Token.DATA_TYPE);
}
case 42:
break;
case 15: {
addToken(Token.ERROR_CHAR);
}
case 43:
break;
case 23: {
addToken(Token.LITERAL_BOOLEAN);
}
case 44:
break;
case 16: {
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
}
case 45:
break;
case 24: {
int temp = zzStartRead;
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_EOL);
start = zzMarkedPos;
}
case 46:
break;
case 25: {
addToken(Token.RESERVED_WORD_2);
}
case 47:
break;
case 14: {
addToken(Token.ERROR_NUMBER_FORMAT);
}
case 48:
break;
case 6: {
start = zzMarkedPos - 1;
yybegin(EOL_COMMENT);
}
case 49:
break;
case 2: {
addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
}
case 50:
break;
case 9: {
addToken(Token.OPERATOR);
}
case 51:
break;
case 12: {
}
case 52:
break;
default:
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
zzAtEOF = true;
switch (zzLexicalState) {
case EOL_COMMENT: {
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
addNullToken();
return firstToken;
}
case 702:
break;
case YYINITIAL: {
addNullToken();
return firstToken;
}
case 703:
break;
default:
return null;
}
} else {
zzScanError(ZZ_NO_MATCH);
}
}
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册